惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
B
Blog
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
量子位
博客园 - 叶小钗
T
Tailwind CSS Blog
小众软件
小众软件
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
博客园_首页
I
InfoQ
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
CSS touch-action简介与treated as passive错误解决 « 张鑫...
张鑫旭,zhangxinxu · 2018-07-05 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=7765
本文可全文或部分转载,但需要保留原作者和出处。

一、mousemove报treated as passive错误

其实这个问题出现有一段时间了,主要麻烦的是,以前没有,后来,Chrome和Safari浏览器升级了,然后出现这个错误,而且就在一个月前,Chrome浏览器还只是黄色的警告,现在直接就红色错误献上。

例如,随便新建一个空白页面,写上如下JavaScript代码:

document.addEventListener('touchmove', function (event) {
    event.preventDefault();
});

然后在移动端模式下页面上点击滑来滑去记下,就可以看到一大堆错误:

[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See…

红灿灿的报错截图如下:

treated as passive报错

这是因为Chrome及其内核浏览器更新了一项新特性,具体见(打开看人品):https://www.chromestatus.com/features/5093566007214080

如果仅仅是错误,不影响功能其实还好,但是,这个报错会影响我们之前运行很OK的交互操作,例如,自定义滚动,或者元素拖拽效果等,会触发浏览器原生的滚动,产生不好的交互体验效果。

如何解决这个问题呢?

我所知道的有两个方法。

二、方法一:touch-action:none解决passive错误

加入如下CSS:

html {
    touch-action: none;
}

报错就会无影无踪。

补充于2021-12-08
touch-action:none 还可以用在使用 pointermove 事件实现拖拽或者拖移的场景,不然会没有效果。
——————

touch-action是移动端一个与手势触摸密切相关的CSS属性,原本源自windows phone手机,微软系,后来被Chrome吸收借鉴,Firefox浏览器跟上,然后Safari也部分支持,目前已经可以说是在移动端可以畅行的CSS属性。

支持的关键字值有:

touch-action: auto;
touch-action: none;
touch-action: pan-x;
touch-action: pan-left;
touch-action: pan-right;
touch-action: pan-y;
touch-action: pan-up;
touch-action: pan-down;
touch-action: pinch-zoom;
touch-action: manipulation;

其中:

  • auto是默认值,表示手势操作什么的完全有浏览器自己决定(如<meta>元素的viewport设置)。
  • manipulation表示浏览器只允许进行滚动和持续缩放操作,类似双击缩放这种非标准操作就不可以。想当初,click事件在移动端有个300ms延时,就是因为避免和手机双击行为发生冲突。然而,当我们设置了touch-action:manipulation干掉了双击行为,则显然,300ms延时就不复存在,因此,下面的CSS声明可以用来避免浏览器300ms延时问题。
    html {
        touch-action: manipulation;
    }

上面2个关键字属性值(automanipulation)是Safari唯一支持的两个touch-action属性值,iOS Safari就是为用户操碎了心,就怕开发者把一些对用户无障碍访问有帮助的东西去掉,例如不支持touch-action:none以及iOS10+中设置viewportuser-scalable=no已经无法阻止用户手指缩放屏幕了,或许在Safari看来,对于一个网页,没有任何理由阻止用户放大看你的网页内容。

至于其他关键字,正如字面意思,要么只能左移,要么只能左右移动,要么只能右移之类,具体如下:

  • none表示不进行任何touch相关默认行为,例如,你想用手指滚动网页就不行,双击放大缩小页面也不可以,所有这些行为要自定义。
  • pan-x表示手指头可以水平移来移去。
  • pan-left表示手指头可以往左移动,移动开始后还是可以往右恢复的。
  • pan-right表示手指头可以可以往右移动,移动开始后还是可以往左恢复的。
  • pan-y表示手指头可以垂直移来移去。
  • pan-up表示手指头可以往上移,移动开始后还是可以往下恢复的。
  • pan-down表示手指头可以往下移,移动开始后还是可以往上恢复的。
  • pan-zoom表示手指头可以用来缩放页面。

上述部分关键字可以组合使用,分pan-y, pan-up, pan-downpan-x, pan-left, pan-right以及pan-zoom这三组,然后这三组关键字可以任意组合,例如:

.example {
    touch-action: pan-left pan-up pan-zoom;
}

表示可以左移,上移和缩放。

此方法不足
1. iOS Safari浏览器不支持;
2. 干掉了可能需要的原生的touch相关行为。

不过主要问题还是iOS Safari浏览器不支持,第2点不足我们可以当我们需要阻止时候JS设置touch-actionnone,不需要在JS还原即可,不是大问题。

iOS Safari对于传统移动网页可以重要浏览器,不可忽略,怎么办,有没有什么其他方法呢?有!就是下面这个。

三、方法二:passive:false解决passive错误

问题代码是:

document.addEventListener('touchmove', function (event) {
    event.preventDefault();
});

修复后的JavaScript代码是:

document.addEventListener('touchmove', function (event) {
    event.preventDefault();
}, {
    passive: false
});

也就是addEventListener的第三个参数传递passive:false,告诉浏览器,我这个事件就是不是消极的,是老子主动要这么做的。浏览器此时也不好说什么,然后,我们以前出问题的代码就能正常运行了。

如果是Zepto.js语法下的事件呢,例如:

$(document).on('touchmove', function (event) {
    event.preventDefault();
});

根据我查看Zepto的源码分析,目前并不支持,请使用原生的addEventListener代替。

四、结束语

意外学到了CSS touch-action相关的一些知识。有了touch-action:manipulation,我们可以在网页中放心大胆使用click事件了,至于自定义的touch事件之流可以退出历史舞台了,哦也!

希望本文内容可以解决你遇到的问题,如果有其他方法,也欢迎不吝赐教。

最后,抛出一个我一直没解决的问题,在iOS Safari浏览器下,网页左右边缘滑动会自动跳到前一个或后一个浏览的网页,有没有什么办法可以阻止?

以上,感谢阅读!

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=7765

(本篇完)