禁止缩放

有天,辛苦做了个复杂操作功能的页面,上线后有用户反馈:很多功能使用不了。惊了,以为是哪里出了bug。
立马联系用户,才发现原来是用户使用笔记本电脑,没有禁用触控板,然后不小心碰到导致整个界面都放大,很多功能超出界面不见了。
然而那能怎么办,用户第一,自然得快速解决这个问题,而且是触控板和触摸屏都得解决。

在以前,如果要禁止移动端设备的触摸屏上,手指缩小放大的功能,都会想到使用viewport 来处理。如下:

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">

然而,目前的浏览器已经不再支持 viewport 禁止缩放的定义。现在使用这段代码,已经彻底无效,要想解决问题,得想新的方案。

话不多说,下面先给出具体的解决办法。

触控板

要禁止触控板的缩放行为,需要处理鼠标滚轮事件:wheel 。
因为笔记本触摸板双指滑动,将响应该事件,如果对该事件阻止默认行为,就能解决缩放问题了。
注意
passive: false 必须使用,下面会介绍。
此外,对 document 处理了滚轮事件后,因为该事件会传播冒泡,所以需要注意页面上其他的子元素——如果有滚动条之类的,需要在子元素上阻止冒泡,不然后滚动会失效。

// 触摸板禁止手指缩放
document.addEventListener('wheel', function(event) {event.preventDefault()
}, { passive: false })// 阻止子元素相同事件冒泡
// document.getElementById('app').addEventListener('wheel', function(event) {
//   event.stopPropagation()
// })

触摸屏

要禁止触摸屏的手指缩放,可以使用如下的 CSS 和 JS 两种方法。

css 处理

只要在页面上使用css样式 touch-action: none,就能禁止web在手机或平板上的缩放了。

<html style="touch-action: none;">

注意:
使用 touch-action: none 作用于html元素上,可以禁止页面缩放,因为该样式属性是非继承属性,不会影响页面子元素的手势操作。
如果使用 * {touch-action: none;} 全局作用,则会影响子元素的各种手势操作。

js 处理

使用js代码来禁止触摸屏的手指缩放,和处理触控板类似的,这里主要是监听几个手势事件,touchstart, touchend, touchmove等。
注意:需要注意的事项也会触控板处理时一样,加上 { passive: false },并且对子元素进行阻止冒泡的操作。

document.addEventListener('touchstart', function(event) {event.preventDefault()
}, { passive: false })// 阻止子元素相同事件冒泡
// document.getElementById('app').addEventListener('touchstart', function(event) {
//   event.stopPropagation()
// })

扩展解读

touch-action

非继承属性,默认auto
用于设置触摸屏用户如何操纵元素的区域,允许你在触控时控制滚动操作。
例如,浏览器内置的缩放功能。
这样做的好处还有,它可以允许你自己实现这些手势。
现代浏览器都支持该属性,但部分属性值只有chrome支持。

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

touch-action 属性值

  • auto
    当触控事件发生在元素上时,由浏览器来决定进行哪些操作,比如对viewport进行平滑、缩放等。
  • none
    当触控事件发生在元素上时,不进行任何操作。
  • pan-x
    启用单指水平平移手势。可以与 pan-y 、pan-up、pan-down 和/或 pinch-zoom 组合使用。
  • pan-y
    启用单指垂直平移手势。可以与 pan-x 、pan-left 、pan-right 和/或 pinch-zoom 组合使用。
  • manipulation
    这是pan-x pan-y pinch-zoom的别名。
    浏览器只允许进行滚动和持续缩放操作,任何其它被auto值支持的行为不被支持。
    启用平移和缩小缩放手势,但禁用其他非标准手势,例如双击以进行缩放。
    禁用双击可缩放功能可减少浏览器在用户点击屏幕时延迟生成点击事件的需要。
    触摸动作也经常用于完全解决由支持双击缩放手势引起的点击事件的延迟。
  • pinch-zoom
    启用多手指平移和缩放页面。
    这可以与任何平移值组合。
  • pan-left, pan-right,pan-up,pan-down
    启用以指定方向滚动开始的单指手势。 一旦滚动开始,方向可能仍然相反。
    多个方向可以组合。
    请注意,滚动向上(pan-up)意味着用户正在将其手指向下拖动到屏幕表面上,同样 pan-left 表示用户将其手指向右拖动。
    这些值的兼容性较差,Chrome支持,IE\Firefox\Safari不支持。

wheel 与 mousewheel

mousewheel 并不是标准特性,ie、chrome等浏览器支持,但 firefox 不支持。
firefox 支持的是自定义的 DOMMouseScroll 事件。

wheel 才是标准特性,现代浏览器基本都支持,建议使用 wheel 替代。

笔记本触摸板双指滑动,将响应滚轮事件,因此可以监听该事件,禁止触摸板手指缩放界面。
但需要注意滚轮默认事件,如会导致子元素滚动失效,这时候就要在子元素上阻止相同事件冒泡。

passive

passive 是作为属性值,来自于事件监听函数 addEventListener 的可选属性 options
addEventListener 的第三个属性还可以取布尔值,指示是否能冒泡。
需要注意的是:对于第三个参数,IE只支持布尔值,不支持属性对象 options;而部分属性值,也有浏览器不支持。

target.addEventListener(type, listener, options);

options参数

可选参数可用的属性如下:

  • capture: Boolean,表示 listener 会在该类型的事件捕获阶段传播到该 EventTarget 时触发。
  • once: Boolean,表示 listener 在添加之后最多只调用一次。如果是 true, listener 会在其被调用之后自动移除。
  • signal:AbortSignal,该 AbortSignal 的 abort() 方法被调用时,监听器会被移除。Safari不支持。
  • mozSystemGroup: 只能在 XBL 或者是 Firefox' chrome 使用,这是个 Boolean,表示 listener 被添加到 system group。
  • passive: Boolean,设置为true时,表示 listener 永远不会调用 preventDefault()。

passived 实际上就是告诉浏览器,某个事件监听是否会使用 preventDefault 来阻止默认行为,便于浏览器优化性能。特别是浏览器优化页面滚动时的性能,可以让页面滚动更顺滑。
在Chrome中,wheel / touch 等事件中的 passive 会默认设置为true,但Safari不支持。
添加 passive 参数为true后,touchmove 事件不会阻塞页面的滚动(同样适用于鼠标的滚轮事件)。

如果 passive 设置为true,而 listener 仍然调用了 preventDefault,则浏览器客户端将会忽略它,并抛出一个控制台警告:

Unable to preventDefault inside passive event listener invocation。

可能遇到的报错

Unable to preventDefault inside passive event listener due to target being treated as passive.

由于目标被视为被动,因此无法在被动事件侦听器中阻止默认行为。
可能的发生情景:移动端使用touch事件后,垂直平移时的报错。

方法一:使用 touch-action 样式来禁止垂直平移的默认行为

touch-action: pan-y;

方法二:监听 touch事件 中,明确设置 passive 为 false,声明不是被动的。

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

触摸板触摸屏禁止手指缩放,这么处理才行相关推荐

  1. 华为matebookx2020黑苹果安装支持触摸板触摸屏wifi蓝牙,三星pm981也可以

    驱动情况 华为matebook X2020 黑苹果安装教程magicbook黑苹果安装教程,目前内置wifi 蓝牙 触摸板 声卡等均可完美使用,matebook 13.14系列三星pm98的硬盘也可以 ...

  2. 禁止触摸屏触控板手指缩放,需要这样处理

    目录 禁止缩放 触控板 触摸屏 css 处理 js 处理 扩展解读 touch-action touch-action 属性值 wheel 与 mousewheel passive options参数 ...

  3. tcl手机 手写java_TCL魔法手指V2.0 (使笔记本Synaptics触摸板变身为手写板)

    TCL魔法手指功能概述 识别率最高:最新的识别核心,识别率达到99.3%,并配合目前最好的多字切分技术,可流畅的连笔书写,随意的倒插笔书写,完全尊重您的书写习惯. 无需特殊硬件:只要您的笔记本电脑有触 ...

  4. 【原创】ThinkpadX240更换三键触摸板注意事项

    ThinkpadX240更换三键触摸板注意事项 声明:此教程中更换方法只适用X240(因为X240的触摸板是粘在电脑上的,没有螺丝钉锁紧),其他型号的我不确定. 本方法特点:只需要拆触摸板,其他的都不 ...

  5. mac 系统的触摸板使用技巧

    1, 点触功能,轻点触摸板是鼠标左键单击功能. 2, 双指轻点触摸板是鼠标右键功能.       在看文档时或大图片时,双指上下左右移动,是滚动功能,在文件夹中也起作用,浏览器同理. 3, 二指放在触 ...

  6. QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理

    QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理 1.手指触摸事件当做鼠标事件去响应的可行性 2.触摸事件touchEvent的添加 3.重写touch事 ...

  7. Linux 触摸屏 笔记本,Linux 5.2应该可以解决许多AMD Ryzen笔记本电脑触摸屏/触摸板无法工作的问题...

    将在7月左右稳定发布的Linux 5.2肯定会是一个大的内核版本--除了许多新功能和其他变化,AMD Ryzen笔记本电脑也将更好地支持这个内核更新. 到目前为止,许多AMD Ryzen笔记本电脑在主 ...

  8. WIN10 3个手指拖动_用好笔记本的触摸板(win10小技巧)

    很多朋友都买有笔记本电脑,然而每次都将笔记本接上鼠标使用,即使临时外出没带包,拿个笔记本,就算不拿电源线都要带上鼠标. 如果你只是希望关闭或禁用触摸板,请直接看本文最后一节. 其实触摸板有时是个好东西 ...

  9. 解决kde 桌面环境,触摸板手指轻触无法使用的问题

    问题:触摸板设置中存在手指动作但无法选中. sudo apt-get install xserver-xorg-input-synaptics 安装驱动 sudo apt-get install kd ...

最新文章

  1. view桌面池计算机显示错误,学员问答之3-View桌面问题
  2. 部署时服务端Excel的COM设置
  3. 对于初学者学习Java语言的建议(转载)
  4. python常考题_Python语言基础考察点:python语言基础常见考题(一)
  5. 6月19日 NSFileHandle文件类的常用方法
  6. linux的exec函数
  7. 爱奇艺首页底部导航按钮android,仿爱奇艺/腾讯视频ViewPager导航条实现
  8. 信息学奥赛一本通 1411:区间内的真素数 | OpenJudge NOI 1.13 23:区间内的真素数
  9. python中测试字符串类型的函数_Python新手学习基础之数据类型——字符串类型
  10. windows server 2012 安装 VC2015 安装失败0x80240017解决方法
  11. GoogleNews-vectors-negative300.bin文件下载
  12. 陈强教授《机器学习及R应用》课程 第四章作业
  13. 绚丽彩虹同学录V1.4公测版
  14. 新猿木子李:0基础学python培训教程 html简介
  15. 思科交换机指示灯详解
  16. jQuery+PHP实现的砸金蛋中奖程序
  17. JQuery开发手册
  18. vw 前端_前端常用开发单位-vw
  19. 使用Plumber和React缩放R
  20. R语言 词云图过大不能全部显示怎么办

热门文章

  1. Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题
  2. OpenGL红宝书的部分学习记录
  3. ubuntu18.04-ros-melodic-carlar安装教程详细指南
  4. 谷歌五笔输入法_输入法之争
  5. Python——超级鹰打码平台实现selenium对b站的自动化登陆
  6. Python3 gevent 报错 RuntimeWarning: greenlet.greenlet size changed
  7. dhcp应该开启还是关闭(dhcp应该开启还是关闭)
  8. Java 面试,创建了几个String 对象? 我让问!让你问!让你问!
  9. js逆向案例-obsfuscator混淆
  10. 如何有效的清理c盘文件?真实有效