吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总

body {

overflow-y: hidden;

}

.wrapper {

overflow-y: auto;

}

两者结合使用更佳!

iOS 上拉边界下拉出现白色空白


表现

手指按住屏幕下拉,屏幕顶部会多出一块白色区域。手指按住屏幕上拉,底部多出一块白色区域。

产生原因

在 iOS 中,手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。

解决方案

1. 监听事件禁止滑动

移动端触摸事件有三个,分别定义为

  1. touchstart :手指放在一个DOM元素上。

  2. touchmove :手指拖曳一个DOM元素。

  3. touchend :手指从一个DOM元素上移开。

显然我们需要控制的是 touchmove 事件,由此我在 W3C 文档中找到了这样一段话

Note that the rate at which the user agent sends touchmove events is implementation-defined, and may depend on hardware capabilities and other implementation details.

If the preventDefault method is called on the first touchmove event of an active touch point, it should prevent any default action caused by any touchmove event associated with the same active touch point, such as scrolling.

touchmove 事件的速度是可以实现定义的,取决于硬件性能和其他实现细节

preventDefault 方法,阻止同一触点上所有默认行为,比如滚动。

由此我们找到解决方案,通过监听 touchmove,让需要滑动的地方滑动,不需要滑动的地方禁止滑动。

值得注意的是我们要过滤掉具有滚动容器的元素。

实现如下:

document.body.addEventListener(‘touchmove’, function(e) {

if(e._isScroller) return;

// 阻止默认事件

e.preventDefault();

}, {

passive: false

});

2. 滚动妥协填充空白,装饰成其他功能

在很多时候,我们可以不去解决这个问题,换一直思路。根据场景,我们可以将下拉作为一个功能性的操作

比如:下拉后刷新页面

页面放大或缩小不确定性行为


表现

双击或者双指张开手指页面元素,页面会放大或缩小。

产生原因

HTML 本身会产生放大或缩小的行为,比如在 PC 浏览器上,可以自由控制页面的放大缩小。但是在移动端,我们是不需要这个行为的。所以,我们需要禁止该不确定性行为,来提升用户体验。

原理与解决方案

HTML meta 元标签标准中有个 中 viewport 属性,用来控制页面的缩放,一般用于移动端。如下图 MDN 中介绍

移动端常规写法

因此我们可以设置 maximum-scaleminimum-scale 与 user-scalable=no 用来避免这个问题

<meta name=viewport

content=“width=device-width, initial-scale=1.0, minimum-scale=1.0 maximum-scale=1.0, user-scalable=no”>

click 点击事件延时与穿透


表现

监听元素 click 事件,点击元素触发时间延迟约 300ms

点击蒙层,蒙层消失后,下层元素点击触发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它是基于散列的数据结构,可以支持并发的读和更新操作。它相比于普通的HashMap,在多线程环境下具有更好的性能和可靠性。 ConcurrentHashMap的主要特点如下: 1. 线程安全:ConcurrentHashMap使用了一细粒度的锁机制来保证线程安全,允许多个线程同时进行读操作,而对写操作进行了分段加锁,不会阻塞其他读操作。 2. 分段锁:ConcurrentHashMap内部将数据分成多个段(Segment),每个段都维护了一个独立的哈希表。不同的线程可以同时访问不同的段,从而提高并发性能。 3. 原子性操作:ConcurrentHashMap提供了一些原子性的操作方法,如putIfAbsent()、remove()和replace()等。这些方法可以保证在操作期间没有其他线程对数据进行修改。 4. 无需加锁的读操作:ConcurrentHashMap允许多个线程同时进行并发读操作,因为读操作不会产生冲突,不需要加锁。 5. 高效性能:ConcurrentHashMap在大多数情况下具有比Hashtable和同步的HashMap更好的并发性能。 要充分理解和使用ConcurrentHashMap,你可以关注以下几点: - 理解其线程安全机制和锁的细粒度设计,避免出现死锁和竞态条件等问题。 - 确保在多线程环境下使用正确的并发控制方法,如使用原子性操作方法而不是先检查后执行的方式。 - 注意ConcurrentHashMap的迭代器可能不是强一致性的,如果需要强一致性的结果,可以考虑使用其他手段来处理。 - 根据具体的使用场景和需求,选择合适的并发度和初始容量。 希望以上信息对你有帮助!如果你还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值