移动端事件300ms延迟解决

news2024/12/24 6:19:51

         有移动端与PC端的项目开发,那么移动端和PC端开发上是存在差异的,比如 click 事件的300ms 延迟,即移动Web页面上的click事件响应都要慢上300ms,移动设备访问Web页面时往往需要 “双击” 或者 “捏开” 来放大页面看清页面的具体内容;这样做的原因是为了确定用户是“单机”还是“双击”,safari(macOS浏览器) 需要通过300ms的延迟来判断!关于 “300毫秒的延迟” 是一个默认的规范,首先先来了解这个300ms的延迟是怎么样的!

meta viewport 视口

        在开发移动端的时候会在head标签中去添加如下这段:

<meta name="viewport" content="width=device-width, initial-scale=1.0"> 

        viewport视口,设置的宽度是设备的宽度,即网页的宽度是设备的宽度;对比一下:

 1 )添加 viewport 视口 —— 按钮大小不变

 2 )无 viewport 视口 —— 按钮大小变小

        可以看到无 viewport 视口按钮太小了,需要缩放后才能去触发,就需要300ms的延迟,当添加了 viewport 视口属性之后,浏览器也不会触发 “双击” 功能,那么对于300ms的延迟也就没有延迟的必要,所以在安卓上添加这样的一个 viewport 视口就可以解决了,也没有了300ms的延迟!那既然能解决?不就结束了吗?meta对于某些设备浏览存在一些兼容性问题的,除了用meta解决就没有别的方法了吗?先来 viewport 视口的设置去掉,来证实一下关于300ms延迟的存在!

         在移动端中,通过触摸屏幕来操作页面中的内容的,那么如何来模拟移动端呢?相信大家都已经知道了,可以通过浏览器来模拟移动端了! 

         通过移动端浏览器提供与网页交互的事件来模拟;touchstart( 手指按下触发 ),touchmove( 手指滑动触发 ),touchend( 手指离开触发 );

1 )下面来使用原生JS来模拟对比一下移动端与PC端间是否存在延迟:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Document</title>
</head>
<body>
    <button ontouchstart="handleStart()" onclick="handleClick()">点击</button>
    <script>
        function handleStart(){
            console.log("handleStart —— ",Date.now())
        }
        function handleClick(){
            console.log("handleClick —— ",Date.now())
        }
    </script>
</body>
</html>

2 )测试一下三组结果:

         触摸handleStart的触发和点击事件handleClick的触发时间相差在300ms左右,这也证实了300ms的延迟是存在的,上面讲到这个viewport视口可以解决这个延迟,来继续测试一下:

3 )viewport视口解决延迟:

 在head标签添加:

<meta name="viewport" content="width=device-width, initial-scale=1.0"> 

         这个延迟在100ms左右浮动,而不添加是在300ms左右浮动,那么就有要问的不是说解决延迟吗?怎么还有延迟,可以自己测试一下这个添加后的延迟比不添加的延迟,速度显然要快很大,有时感觉可能感觉不到延迟;

        关于300ms的延迟操作显然是存在的,那么既然在移动端开发中 ontouchstart 的触发比 onclick 的触发要快,直接用 ontouchstart 触发不就好了吗?为什么还需要这个 onclick 来触发?这是什么原因?或者说为什么不能用 ontouchstart 来解决这个问题呢?

        假设使用 ontouchstart 来进行触发,当用户想滑动一下这个页面的时候,手指放在设备上的那一刻就会触发 ontouchstart ,本意只是想滑动一下这个页面查看,当轮播的时候,一触碰就会触发跳转,本意只是想滑动到下一页轮播页罢了,所以使用 ontouchstart 来代替 onclick 显然不合理,目的可能不是为了触发而是滑动页面;

        既然 meta viewport视口 可以解决但存在兼容性的问题怎么解决?下面就来讲解:

fastclick

        fastclcik 顾名思义快速点击,光听名字都能解决,太强了,那fastclick 是怎么来解决的?同样的也是使用touchstart等上面讲到的这些操作,怎么实现的呢?当你的手指按下会触发touchstart会记录手指的位置和时间戳,但你手指离开了触发touchend会记录手指的位置和时间戳以及位移,如果对比前后时间足够短,位移足够小则这是一次点击事件的触发而不是滑动页面;知道了这个解决方案能力够的可以自己封装,当然这里就用现成的了;

         当然可以看一下 fastclick这个库,来到官网地址:点击跳转 ,来到这个库之后可以看到官网中有这一段话;

         通过上面这段内容可以知道不是非得用,而是可以分情况来查看是否需要,下面来下载测试一下:下载 fastclick ,下载完成之后通过script标签引入:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <script type='application/javascript' src='./path/to/fastclick.js'></script>
    <title>Document</title>
</head>
<body>
    <button ontouchstart="handleStart()" onclick="handleClick()">点击</button>
    <script>
        if ('addEventListener' in document) {
            document.addEventListener('DOMContentLoaded', function() {
                FastClick.attach(document.body);
            }, false);
        }
        function handleStart(){
            console.log("handleStart —— ",Date.now())
        }
        function handleClick(){
            console.log("handleClick —— ",Date.now())
        }
    </script>
</body>
</html>

        延迟在100ms左右时在可接受的范围之内,如果不用 fastclick 还能怎么解决?

touch-action:manipulation  

        在 css 中设置每个元素都禁用双击缩放功能;这个不需要引入任何内容,属于C3

        那么可以结合设置 meta viewport 解决视口问题,一般会采用这种方案;

        那么本篇就是关于开发移动端项目当中存在的300ms事件延迟的解决方案,可以通过meta viewport 、fastclick 第三方库、meta viewport + touch-action 这些解决的方法,可以根据实际的情况来完成这些内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TVP走进腾讯:直面变革浪潮,合力拥抱AI新时代

引言 自 ChatGPT 问世以来&#xff0c;以通用人工智能为代表的 AI 技术发展开始“狂飙”&#xff0c;多家企业和研究机构入局大模型赛道&#xff0c;新应用场景不断涌现。如何理解通用人工智能技术将带来的巨大影响&#xff0c;并把握随之而来的机遇和挑战&#xff0c;是我们面…

自己开发或者修改的组件包如何发布到npm官方市场

1、注册账号 打开npm官方网站&#xff1a; www.npmjs.com; 进行注册 注册需要用户名&#xff0c;密码和邮箱&#xff0c; 当注册完成后需打开邮箱进行验证&#xff08;邮箱不验证无法上传&#xff09; 二、 在需要打包发布的文件夹package.json所在目录下执行命令&#xff1a;…

Nacos架构与原理 - 通信通道

文章目录 Nacos 长链接⼀、现状背景二、场景分析1. 配置SDK 和 Server 之间Server 之间通信 2. 服务SDK 和 Server 之间Server 之间通信 三、长链接核心诉求1. 功能性诉求客户端服务端 2. 性能要求3. 负载均衡客户端随机服务端柔性调 4. 连接⽣命周期5. 安全性6. 低成本多语⾔实…

基于jsp+mysql+Spring+mybatis的SpringBoot美容院预约管理系统

运行环境: 最好是java jdk 1.8&#xff0c;我在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以&#xff0c;如果编译器的版本太低&#xff0c;需要升级下编译器&#xff0c;不要弄太低的版本 tomcat服务器环…

数据分析 × 人文社科:高校交叉学科教学经验分享

随着新一轮科技革命与产业变革的加速演进&#xff0c;学科间的交叉融合不断升级&#xff0c;由数据驱动的系列交叉学科备受瞩目&#xff0c;然而&#xff0c;在实际教学与学科建设的过程中&#xff0c;对于数据科学引入至相关学科&#xff0c;高校教师还是普遍面临着比较多的问…

MYSQL中的14个查询技巧

1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中,名称不同的用户的具体名称有哪些? 具体sql如下: select name from `user` group by name; 但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢? 答:…

LeetCode - 16 最接近的三数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 16. 最接近的三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。 请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接…

HNU-操作系统OS-作业2(15-22章)

OS_homework_2 这份文件是OS_homework_2 by计科210X wolf 202108010XXX 文档设置了目录,可以通过目录快速跳转至答案部分。 第15章 运行程序OS-homework/vm-mechanism/relocation.py 15.1 用种子 1、2 和 3 运行,并计算进程生成的每个虚拟地址是处于界限内还是界限外? 如…

Python + HDF5 因子计算与 DolphinDB 一体化因子计算方案对比

在量化交易中&#xff0c;基于金融市场的 L1/L2 的报价和交易高频数据来进行高频因子计算&#xff0c;是非常常见的投研需求。目前国内全市场十年的 L2 历史数据约为 20 ~ 50T&#xff0c;每日新增的数据量约为 10 ~ 20G。传统的关系数据库如 MS SQL Server 或 MySQL 已经很难支…

2023届【校招】安全面试题和岗位总结(字节、百度、腾讯、美团等大厂)

写在前面 个人强烈感觉面试因人而异&#xff0c;对于简历上有具体项目经历的同学&#xff0c;个人感觉面试官会着重让你介绍自己的项目&#xff0c;包括但不限于介绍一次真实攻防/渗透/挖洞/CTF/代码审计的经历 > 因此对于自己的项目&#xff0c;面试前建议做一次复盘&#…

Zigbee学习(四)入网流程及抓包分析

Zigbee学习系列文章 Zigbee学习&#xff08;一&#xff09;架构及入网 Zigbee学习&#xff08;二&#xff09;认识Profile和Cluster Zigbee学习&#xff08;三&#xff09;Z-Stack代码框架解析 文章目录 Zigbee学习系列文章前言一、概述二、入网报文解析1.Management Permit J…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(1)系统问题分解

目录 前言 系统硬件架构 系统软件架构 仿真实现 仿真效果 总结 前言 目前正在做双向交错CCM图腾柱无桥单相PFC的项目&#xff0c;硬件拓扑兼容三相和单相的PFC&#xff0c;三相PFC功能目前已经完成&#xff0c;准备把单相的PFC学习和开发过程记录一下&#xff0c;以及后面…

基于CH32F103的DAC播放WAV功能

一、理论 1.1 DAC理论 数字信号转化为电压信号&#xff0c;实现扬声器不同频率的发声。 12位DAC&#xff0c;表达范围0-4095 1.2音频wav理论 1.2.1 wav文件格式解析 wav 文件一般由3个区块组成&#xff1a;RIFF chunk、Format chunk 和 Data chunk。 RIFF chunk&#xff…

Vivado 下 IP核之单端口 RAM 读写

目录 Vivado 下 IP 核之单端口 RAM 读写 1、RAM 简介 2、实验任务 3、程序设计 3.1、RAM IP 核配置 3.2、时序图讲解 1、写优先模式的时序图如下所示&#xff1a; 2、读优先模式的时序图如下所示&#xff1a; 3、不变模式的时序图如下所示&#xff1a; 3.3、顶层模块…

mysql 数据库 不同数据类型字段设置长度大小、取值范围 及 存储空间

学习目标&#xff1a; 学习的目标 了解不同数据类型字段设置长度大小&#xff0c;从而 在使用 mysql 数据时为使用的字段设置适当的长度 。 学习内容&#xff1a; 学习的内容 整数型字符串型TEXT时间型 总结&#xff1a; 提示&#xff1a;总结 1、整数型 1、整数型的数值…

STM32队列

目录 什么是队列&#xff1f; 队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 队列相关 API 函数 1. 创建队列 参数&#xff1a; 2. 写队列 参数&#xff1a; 返回值&#xff1a; 3. 读队列 参数&#xff1a; 返回值&#xf…

找工作第一弹——三件套基础巩固

目录 前言HTML篇表格结构a的两种打开方式自定义列表单选&#xff0c;多选音视频标签 CSS篇伪元素清楚浮动固定定位fixedemCSS三角 JS细节篇原型链字符串拼接的方法递归 JS内置对象sort的升序和降序字符串大写和小写Objects对象的方法date的用法数字取整数组的最大值与最小值 We…

ROS中使用VLP16激光雷达获取点云数据

ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为&#xff1a;Ubuntu20.04 ROS Noetic 需要将激光雷达与PC连接&#xff0c;然后在设置>网络>有线中将IPv4改为手动&#xff0c;并且地址为192.168.1.100&#xff0c;子网掩码为255.255.255.0&#xff0c…

leetcode61. 旋转链表(java)

旋转链表 leetcode61. 旋转链表题目描述 解题思路代码演示链表专题 leetcode61. 旋转链表 Leetcode链接&#xff1a; https://leetcode.cn/problems/rotate-list/ 题目描述 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例…

浅析 xml 数据格式文件

浅析 xml 数据格式文件 xml ( Extensible Markup Language ) 全称 -> 可拓展的标记语言&#xff1b; xml文件的主要用途&#xff1a;xml文件主要用于数据的 传输 和 存储&#xff0c;并不是展示&#xff1b; xml标签与html的区别&#xff1a;节点的标签使用方式和 html 十分…