当前位置: 首页 > news >正文

8.28 JS移动端事件

学习目标:

  1. 能够写出移动端触屏事件
  2. 能够写出常见的移动端特效
  3. 能够使用移动端开发插件开发移动端特
  4. 能够使用移动端开发框架开发移动端特效

PC端事件

鼠标类:click,mouseover,mouseout,mouseleave,mouseenter,mouseup,mousedown

键盘类:keydown,keyup

其他类:blur,focus,change,load 但是对于移动端来说,是不存在鼠标事件和键盘事件的,因为移动端是没有鼠标和键盘的;

移动端事件:

  • 单击事件,双击事件,滑动事件(上滑,下滑,左滑,右滑)
  • 长按事件
  • 摇一摇,重力感应等

案例:鼠标悬浮效果

<style>.box{width: 100px;height: 100px;background-color: red;}.box:hover{background-color: blue;}
</style>
<div class="box"></div>
<script>let box = document.querySelector('.box');let i=0;box.onclick = function(){console.log(++i);}
</script>

这个效果在PC端是没有问题的,但是在移动端,鼠标悬浮的时候,颜色是不会发生改变的;

移动端是没有鼠标的,也没有鼠标悬浮事件; 移动端的PC事件也有问题,click在移动端大概有300ms的延迟

触摸事件touch只有移动端才有touch事件

touch事件模型

ontouchstart:触摸开始(当手指触摸屏幕时触发,不管当前有多少只手指)

ontouchmove:触摸后移动(当手指在屏幕上滑动时连续触发,通常我们再滑屏页面,会调用)event.preventDefault()

ontouchend:触摸结束(当手指离开屏幕时触发)

onclick:点击事件 ontouchcancel:系统通知跟踪触摸时候会触发。例如在触摸过程中突然有人打电话过来取消了当前的操作,此时会触发事件,这个事件用的比较少; 触摸事件的响应顺序:ontouchsatrt > ontouchmove > ontouchend > onclick 300ms延时

事件案例

<style>.box{width: 80%;border: 1px solid #f00;height: 300px;margin: 0 auto;}
</style>
<div class="box"></div>
<script>var oBox = document.querySelector('.box');oBox.addEventListener('touchstart',function(e){console.log('touchstart');// console.log(e);// 手指开始触摸的位置console.log(e.touches[0].clientX);})oBox.addEventListener('touchend',function(e){console.log('touchend');// 手指结束触摸的位置console.log(e.changedTouches[0].clientX);})oBox.addEventListener('touchmove',function(e){console.log('touchmove');console.log(e.changedTouches[0].clientX);})oBox.addEventListener('click',function(){console.log('click');})
</script>

可以通过开始位置结束位置,可以实现移动端的滑块效果,参考:vant - 表单 - 滑块

移动端为什么不用click

click事件在手机端会出现大概300ms的延迟,实际的执行延迟要比这个大,因为浏览器的内核运行也需要消耗事件。延迟执行的原因是苹果最早在手机上做了一个事件,当双击页面的时候,页面放大,也就是说,在点击页面的300ms之内,如果没有在此触发点击,则认为是单击事件,如果在此触发则认为是双击事件。 但目前,一般在手机web中,不允许缩放,也就没有双击事件,但是click延迟执行会影响用户体验; 谷歌判断点击的条件是 长按呀lang press的事件阀值为700ms,超过700ms就不再触发click事件

去除移动端click300ms延迟

1)meta标签

禁用缩放。 浏览器禁用默认的双击缩放行为并且去掉300ms 的点击延迟

<meta name="viewport" content="width=device-width">

即把viewport设置成设备的实际像素,那么就不会有这300ms的延迟,并且这个举动收到了IE/Firefox/Safari(IOS9.3)的支持,也就是说现在的移动端开发可以不用顾虑click会比较迟钝的问题; 如果设置为initial-scale=1.0,在chrome上是可以生效,但是Safari不会:

<meta name="viewport" content="initial-scale=1.0">
2)css去除
html{touch-action: manipulation;}
3)fastClick库

截止2015年底,大多数移动浏览器(特别是Chrome和Safari)不再具有300ms的触摸延迟,毕竟再多引入一个js文件对项目也没有什么好处,不推荐使用。

解决原理就是:

  1. 当我们手指触摸屏幕,记录当前触摸时间
  2. 当我们手指离开屏幕,用离开的时间减去触摸的时间
  3. 如果时间小于150ms,并且没有滑动过屏幕, 那么我们就定义为点击

![[2d3b60e5-88a6-451f-8e14-be655b871f5f.png]]

touch事件对象

每个touch事件对象包含的属性如下:

  • clientX:触摸目标在视口中的x坐标。

  • clientY:触摸目标在视口中的y坐标。

  • pageX:触摸目标在页面中的x坐标。

  • pageY:触摸目标在页面中的y坐标。

  • screenX:触摸目标在屏幕中的x坐标。

  • screenY:触摸目标在屏幕中的y坐标。

  • identifier:标识触摸的唯一ID。

  • target:触摸的DOM节点目标。

  • targetTouches: 当前对象上所有触摸点的列表数组

  • changeTouches:涉及当前(引发)事件的触摸点的列表数组,常用于手指离开的事件,手指都离开屏幕之后,touches和targetTouches中将不再有值,targetTouches还会有一个只,此值为最后一个离开屏幕的手指的触摸点。

http://www.dtcms.com/a/356036.html

相关文章:

  • HTTP 范围请求:为什么你的下载可以“断点续传”?
  • 现在购买PCIe 5.0 SSD是否是最好的时机?
  • 嵌入式学习笔记--LINUX系统编程阶段--DAY02系统编程
  • 嵌入式学习日志————实验:串口发送串口发送+接收
  • 亚远景-ISO/PAS 8800:如何通过认证提升企业技术管理能力?
  • 入职体检空腹血糖 6.15mmol/L合格吗?
  • amis上传组件导入文件接口参数为base64格式的使用示例
  • NumPy 2.x 完全指南【三十一】布尔数组索引
  • ConcurrentHashMap的原理
  • 实战笔记——构建智能Agent:SpreadJS代码助手
  • vue3使用reactive和ref
  • 【python】python进阶——生成器
  • JDK的ConcurrentHashMap为什么放弃了分段锁
  • 大模型开发之:LangChain4j【附资料】
  • C++基础知识:虚函数和纯虚函数
  • 基于MATLAB的FIR滤波器设计与信号分离实现
  • 线性回归的法方程:原理与解析
  • 复习笔记11
  • 【K8s】整体认识K8s之pod
  • 【Git】Git 常用指令
  • 使用华为 USG6000防火墙配置安全策略
  • 今日行情明日机会——20250828
  • 驾驭巨量数据:HTTP 协议与大文件传输的多种策略
  • 【Python开源环境】Anaconda/Miniconda
  • 印度尼西亚数据源 PHP 对接文档
  • 从零搭建安全帽检测(8)— 泛化性检验:构建独立测试集与模型性能公正评估
  • 动态加载和异步调用tasklet/workqueue day63 ay64
  • 卷积神经网络搭建及应用
  • 对象之间属性拷贝(Bean Mapping)的工具MapStruct 和 BeanUtils
  • 多据点协作下的数据库权限与版本管理实战