触控板 要禁止触控板的缩放行为,需要处理鼠标滚轮事件:wheel 。 因为笔记本触摸板双指滑动,将响应该事件,如果对该事件阻止默认行为,就能解决缩放问题了。...此外,对 document 处理了滚轮事件后,因为该事件会传播冒泡,所以需要注意页面上其他的子元素——如果有滚动条之类的,需要在子元素上阻止冒泡,不然后滚动会失效。...}) // 阻止子元素相同事件冒泡 // document.getElementById('app').addEventListener('touchstart', function(event)...笔记本触摸板双指滑动,将响应滚轮事件,因此可以监听该事件,禁止触摸板手指缩放界面。 但需要注意滚轮默认事件,如会导致子元素滚动失效,这时候就要在子元素上阻止相同事件冒泡。...由于目标被视为被动,因此无法在被动事件侦听器中阻止默认行为。 可能的发生情景:移动端使用touch事件后,垂直平移时的报错。
2背景 如果你在touchstart或touchmove事件处理函数中调用preventDefault(),这将会阻止(页面)滚动。...为了解 touchstart 和 touchmove 的使用(情况),我们添加了对这两个事件阻止滚动(发生)频率的监控。...鉴于此问题的严重性,我们意识到可以通过默认将这些事件(的监听器)设置为“被动”来提高滚动的性能,而且基本不需要任何开发者修改代码。...在 Chrome 56版本及其之后的版本,如果激活了优化,而你又在事件处理函数中调用了preventDefault(),在 DevTools 中会打印一条警告(作为提示)。...在更复杂的例子中,你可能需要参考下面的其中一条来解决问题: 如果你的touchstart事件的监听器中,调用了preventDefault(),为阻止触发click事件和浏览器的默认行为,请确保preventDefault
引言 相信大多数前端开发者在日常工作中都碰过元素滚动时造成的一些非预期行为。 这篇文章就和大家来聊聊那些滚动中的非预期行为的出现原理和解决方案。...完成上述的判断后,如果 status === 11 表示当前元素可滚动并且滚动条不在顶部也不在底部(即在中间),表示 touchMove 事件不应该阻止元素滚动(当前滚动为正常现象) // 2...添加 touchstart 和 touchmove 事件监听 * 2....passive 在 chrome51 版本后出现的,本质上是为了通过被动侦听器提高滚动性能。...为 body 添加 overflow:hidden 其实在移动端并没什么太大的实际作用,我们 touchmove 事件中的处理逻辑对于阻止意外滚动行为的发生已经完全足够了。
"non-fast" 滚动区域 由于 js 代码可以绑定事件监听,而且事件监听中存在一种 preventDefault() 的 API 可以阻止事件的原生效果比如滚动,所以在一个页面中,浏览器会对所有创建了此监听的区块标记为...如果阻止了就终止滚动,如果没有阻止才会继续滚动,如果最终结果是不阻止,但这个等待时间消耗是巨大的,在低性能设备比如手机上,滚动延迟甚至有 10~100ms。...就结论而言,React 目前还是对几个受影响的事件 touchstart touchmove wheel 采用 passive 模式,即: const Test = () => ( 滚动事件时,一定可以阻止默认滚动行为呀,但为什么因为: 浏览器分为合成层和渲染进程,通信成本较高导致滚动事件监听会引发滚动卡顿...总之就是 React 与浏览器实现背后的纠纷,导致滚动行为阻止失效,而这个结果链条传导到了开发者身上,而且有明显感知。
谷歌浏览器的警告: [Intervention] Unable to preventDefault inside passive event listener due to target being treated...() ,这就导致了浏览器不能及时响应滚动,略有延迟。...所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive...导致的问题: 浏览器在触发touchstart,touchmove事件的时候,e.preventDefault()会被浏览器忽略掉,并不会阻止默认行为。...解决方案: 1,注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener('touchmove', fn, { passive: false }) 2、应用 CSS
See https://www.chromestatus.com/feature/5745543795965952 这个警告表明在页面上的 content_script.js 文件中,添加了一个滚动事件监听器事件...touchstart,它是一个阻塞滚动的事件。...为了提高页面的响应性,浏览器建议将事件处理程序标记为 passive。 这是浏览器引入的一个性能优化措施。通过将滚动事件处理程序标记为 passive,浏览器可以更好地优化页面的滚动性能。...('touchstart', handleTouchStart, { passive: true }); 这样做告诉浏览器这个事件处理程序不会阻塞滚动,有助于提高页面的性能。...请查找并修改 content_script.js 文件中与 touchstart 事件相关的代码,以适应这个修改。
因为选项卡内部的内容由渲染器进程处理,所以浏览器进程会把事件类型(如touchstart)及其坐标发送到渲染器进程。 渲染器进程通过查找事件目标并运行附加的事件侦听器来适当地处理事件。 ?...2:将鼠标悬停在页面图层上 了解非快速可滚动区域 由于JavaScript是运行在主线程上的,所以当合成页面时,合成器线程会标记页面的一个区域,该区域将事件处理程序附加为“非快速可滚动区域”。...图3:输入到非快速可滚动区域的示意图 在编写事件处理程序时要注意 Web开发中常见的事件处理模式是事件委托。 由于事件冒泡,你可以在最顶层的元素上附加一个事件处理程序,并根据事件目标委派任务。...由于你只需要为所有元素编写一个事件处理程序,因此该事件委托模式在工程上很有吸引力。 但是如果从浏览器的角度来看这段代码,整个页面都被标记成了非快速可滚动区域。那么这意味着什么呢?...图4:在覆盖整个页面的非快速可滚动区域进行输入 为了缓解这种情况,你可以在事件侦听器中传递passive:true选项。 这向浏览器提示你仍然希望在主线程中监听事件,同时合成器也可以继续并合成新帧。
Making touch scrolling fast by default 简而言之: 由于浏览器必须要在执行事件处理函数之后,才能知道有没有掉用过 preventDefault() ,这就导致了浏览器不能及时响应滚动...所以为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive... 和 touchmove 事件处理函数中调用 e.preventDefault() ,会被浏览器忽略掉,并不会阻止默认行为。...两个方案: 1、注册处理函数时,用如下方式,明确声明为不是被动的 window.addEventListener('touchmove', func, { passive: false }) 2、应用...touch-action 还有很多选项,详细请参考touch-action [注]未来可能所有的元素的 touchstart touchmove 事件处理函数都会默认为 passive: true
重点来了,既然该属性可以阻止元素成为鼠标事件,那么修改页面该属性值为 none,就能避免在滚动时鼠标频繁触发包括hover在内的任何鼠标事件,从而提升了页面滚动时的性能。...event) { document.documentElement.style.touchAction = 'manipulation' // 或 auto});可能有的朋友就会问了,如果我们在 touchstart...或 touchmove 事件中用 event.preventDefault() 阻止系统默认事件,不就可以阻止手势操作吗?...监听事件都是先进行了"触摸"才能执行回调,如果需要阻止默认事件,那么就必须在触摸开始前就检查是否需要阻止,滑动响应的优先级反而降低了,Google为了保证滑动流畅性就默认取消了这一机制。...所以从 chrome56 开始,如果你在全局 touch 事件中不声明这是"非被动"操作,那么chrome浏览器会默认不执行并报错。
翻译一下:chrome 监听touch类事件报错:无法被动侦听事件preventDefault,是新版本chrome 浏览器报错。...原因:google浏览器为了最快速的相应touch事件,做出的改变。 历史:当浏览器首先对默认的事件进行响应的时候,要检查一下是否进行了默认事件的取消。...现在:google就决定默认取消了对这个事件的检查,默认时间就取消了。直接执行滑动操作。这样就更加的顺滑了。 但是浏览器的控制台就会进行错误提醒了。...具体情况: 从 chrome56 开始,在 window、document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 passive: true。...和 touchmove 事件处理函数中调用 e.preventDefault() ,会被浏览器忽略掉,并不会阻止默认行为。
其实就是是否阻止默认事件200ms延迟然后再执行滚动行为,而之前的fastclick就是通过去掉这部分来避免点击延迟的。...通过调用禁用浏览器处理手势preventDefault(),但也应该使用触摸动作来确保浏览器在调用任何事件侦听器之前知道应用程序的意图。...文档参考来源:touch-action 说人话 这段话阐明的就是触摸事件整个的进行过程,既然它可以通过css来约定滚动的行为,那么就意味着你写了touch-action:none,就会导致原来的页面滚动失效了...这就是安卓上无法页面滚动的原因。 为什么ios没有受影响呢,我觉得可能是ios默认支持touch事件的原因吧。如果你知道底层的原因或者详细的文档说明,可以告诉我哦。...联想到这些安卓机型,那么定位到可能是 :代码兼容部分的版本过低,这些不支持;代码某部分是对ios和安卓有区分解释的,和系统有关,版本无关。
如果弹出的内容不需要滚动,直接禁止touchmove或者touchstart: var content = document.getElementsByTagName('body')[0]; content.addEventListener...content.addEventListener('touchmove', function (e) { e.preventDefault(); }, false) 这两个都是禁止touch事件...注意,这个方法只能用在浮层不滚动的场景。...还有要注意,新版chrome在PC模式下可以,手机模式下会报错,要声明阻止滑动不是被动的: var content = document.getElementsByTagName('body')[0];...content.addEventListener('touchstart', function (event) { event.preventDefault(); }, { passive:
使用overscroll-behavior: contain属性可以阻止滚动传播的问题。...:none; input { border: 0; -webkit-appearance:none; } ⭐️⭐️⭐️对非可点击元素(div,span 等)监听 click 事件,部分 ios...组件库解决方式 思想思路: 针对触摸滑动事件 touchmove,通过监听滑动方向和滚动元素的状态,决定是否阻止默认的滑动行为,从而防止滚动穿透。...在需要锁定滚动的情况下,给 document 添加 touchstart 和 touchmove 事件的监听器,通过捕获触摸滑动事件,并根据情况阻止默认行为,从而避免滚动穿透。...在解锁滚动时,从 document 移除对触摸事件的监听器,恢复默认的滑动行为。
触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。 常见的触屏事件如下: 1.3.2....这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等 touchstart、touchmove、touchend 三个事件都会各自有事件对象。...触摸事件对象重点我们看三个常见对象列表: 因为平时我们都是给元素注册触摸事件,所以重点记住 targetTocuhes 1.3.案例:移动端拖动元素 touchstart、touchmove、touchend...(2) 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子 (3) 离开手指 touchend: 注意: 手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动 e.preventDefault...this.style.left = x + move + "px"; this.style.top = y + move + "px"; e.preventDefault(); // 阻止屏幕滚动的默认行为
触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。...常见的触屏事件如下: 触屏touch事件 说明 touchstart 手指触摸到一个DOM元素时触发 touchmove 手指在一个DOM元素上滑动时触发 touchend 手指从一个DOM元素上移开时触发...touchstart、touchmove、touchend三个事件都会各自事件对象 触摸事件对象重点我们看三个常见对象列表: 触摸列表 说明 touches 正在触摸屏幕的所有手指的一个列表 targetTouches...:获取手指初始坐标,同时获得盒子原来的位置 移动手指touchmove:计算手指的滑动距离,并且移动盒子 离开手指touchend: 注意:手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动e.preventDefault...x + moveX + 'px'; this.style.top = y + moveY + 'px'; e.preventDefault(); // 阻止屏幕滚动的默认行为
触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。 常见的触屏事件如下: ? 2....这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等 touchstart、touchmove、touchend 三个事件都会各自有事件对象。...,所以重点记住 targetTocuhes 3.案例:移动端拖动元素 touchstart、touchmove、touchend可以实现拖动元素 但是拖动元素需要当前手指的坐标值 我们可以使用...(2) 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子 (3) 离开手指 touchend: 注意: 手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动 e.preventDefault...= x + moveX + 'px'; div.style.top = y + moveY + 'px'; e.preventDefault(); //阻止屏幕滚动的默认行为
阻止冒泡? 刚开始遇到这个问题的同学可能会联想到是不是由于事件冒泡到body上引起的,于是监听 scroll/touchmove事件,阻止事件冒泡。 事实上,这并没有什么卵用。...;} 这个想法很美好,在不侵入JS的情况下禁止滚动,然而: 只加 overflow:hidden对移动端是无效的!...假如我们的浮层上真的需要滚动事件,就不能阻止这些元素的默认行为。 浮层上面的滚动元素?...,这些元素以及他们的子元素全部采用不阻止默认事件策略。...,但是: 当多个浮层同时存在时,滚动穿透将再次触发 支持多浮层 之所以会出现多浮层问题,是因为我们往 document上绑事件只绑一次,这个是对的,但是每个浮层关闭的时候都会触发 unbind,就会导致绑定的事件直接解绑
2.1 touch事件与click事件同时触发 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没有对触摸设备优化的代码仍然可以在触摸设备上正常工作)。...()来阻止鼠标事件被触发。...不会包括左边的滚动距离。 5. clientY 触摸点相对于浏览器的 viewport上边缘的 y 坐标。不会包括上边的滚动距离。...罪魁祸首其实就是a标签跳转默认是click事件触发,而移动端的touch事件触发之后,依然会在300ms后触发click事件。 解决办法: 1.就是阻止触发touch事件完成后的click事件。...注意:zepto并没有阻止click事件,所以使用zepto的tap事件依然会导致点击穿透问题,你需要手动添加 e.preventDefault() 来阻止click事件。
触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作。 常见的触屏事件如下: ? 2....这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等 touchstart、touchmove、touchend 三个事件都会各自有事件对象。...触摸事件对象重点我们看三个常见对象列表: 因为平时我们都是给元素注册触摸事件,所以重点记住 targetTocuhes 3.案例:移动端拖动元素 touchstart、touchmove、touchend...然后用盒子原来的位置 + 手指移动的距离 手指移动的距离: 手指滑动中的位置 减去 手指刚开始触摸的位置 拖动元素三步曲: (1) 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置...(2) 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子 (3) 离开手指 touchend: 注意: 手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动 e.preventDefault
领取专属 10元无门槛券
手把手带您无忧上云