第一章-JavaScript基础进阶part5:移动端网页特效

news2024/11/25 23:01:18

文章目录

  • 一、触屏事件-touch
    • 1.1 常见touch事件
    • 1.2 触屏事件对象(TouchEvent)
    • 1.3 移动端拖动元素
  • 二、移动端常见特效
    • 2.1 click延时解决方案
  • 三、移动端常用开发插件
    • 3.1 fastclick.js 解决移动端点击事件300ms延迟问题
    • 3.2 Swiper插件的使用

一、触屏事件-touch

1.1 常见touch事件

移动端兼容性较好

  • 常见touch事件如下:
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div class="box" style="width:200px;height:200px;background:pink"></div>
  <script>
  // 调试开启移动端模式
    var box = document.querySelector(".box")
    // 触摸开始
    box.addEventListener("touchstart",function(){
      console.log("触摸开始")
    })
    // 滑动事件
    box.addEventListener("touchmove",function(){
      console.log("触摸滑动中")
    })
    // 放开事件
    box.addEventListener("touchend",function(){
      console.log("放开了")
    })
  </script>
</body>
</html>

1.2 触屏事件对象(TouchEvent)

TouchEvent 是一类描述手指在摸平面(摸屏、触摸板等)的态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等
touchstart、touchmove、touchend 三个事件都会各自有事件对象。

  • touchEvent常用属性:
    • 常用:targetTouches
      在这里插入图片描述
<body>
  <div class="box" style="width:200px;height:200px;background:pink"></div>
  <script>
    var box = document.querySelector(".box")
    // 触摸开始
    box.addEventListener("touchstart",function(e){
      // touches : 正在触发屏幕的所有手指列表
      // targetTouches: 正在触发当前DOM元素的手指列表
      // changedTouches 手指状态发生了改变的列表
      console.log(e.targetTouches[0]) // 可获取到手指坐标等
    })
  </script>
</body>

在这里插入图片描述

Touch对象中pageX, screenX,clientX的区别

  • pageX: 返回触点相对HTML文档左边沿的X坐标(与用户滚动位置无关,因此当存在水平滚动的偏移时,这个值包含了水平滚动的偏移)
  • screenX: 返回触点相对于屏幕左边的X坐标
  • clientX: 返回触点相对于可视区左边沿的X坐标。(不包含水平滚动的偏移)

2、 classList元素类名属性

  • H5新增属性,IE10以上可用,相对于className,classList可以更方便的操作类名
  • 该属性用于在元素中添加,移除及切换CSS类。
  • 添加类: element.classList.add(‘类名’)
  • 移除类: element.classList.remove(‘类名’)
  • 切换类:element.classList.toggle(‘类名’): 切换类名,如元素上无此类名则添加,有则删除
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .box {
        width: 100px;
        height: 100px;
        background: purple;
      }
      .toggle {
        width: 200px;
        height: 200px;
        background: grey;
      }
      .pink {
        background: pink;
      }

      .blue {
        background: blue;
      }
    </style>
  </head>
  <body>
    <button>操作box变色</button>
    <div class="box"></div>
    <div class="toggle"></div>
    <script>
      var box = document.querySelector(".box");
      var toggle = document.querySelector(".toggle");
      var btn = document.querySelector("button");

      // 添加class
      btn.addEventListener("click", function () {
        let classList = box.classList;
        box.classList.add("pink");
      });

      // 移除class
      box.addEventListener("click", function () {
        this.classList.remove("pink");
      });

      // 切换
      toggle.addEventListener("click", function () {
        this.classList.toggle("blue")
      });
    </script>
  </body>
</html>

1.3 移动端拖动元素

  1. touchstart、touchmove、touchend可以实现拖动元素
  2. 但是拖动元素需要当前手指的坐标值我们可以使用 targetTouches[0]里面的pageX和 pageY
  3. 移动端拖动的原理: 手指移动中,计算出手指移动的距离。然后用盒子原来的位置+ 手指移动的距离
  4. 手指移动的距离:手指滑动中的位置减去 手指刚开始触摸的位置

拖动元素三步:

  • 触摸元素touchstart: 获取手指初始坐标,同时获得盒子原来的位置
  • 移动手指touchmove: 计算手指的滑动距离,并且移动盒子
  • 离开手指touchend:
    注意: 手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动e.preventDefault0:
 <body>
    <div
      class="box"
      style="
        width: 200px;
        height: 200px;
        background: pink;
        position: absolute;
        left: 10px;
        top: 10px;
      "
    ></div>
    <script>
      var box = document.querySelector(".box");
      var x = 0;
      var y = 0;
      var posX = box.offsetLeft;
      var posY = box.offsetTop;
      box.addEventListener("touchstart", function (e) {
        let touchObj = e.targetTouches[0];
        x = touchObj.pageX;
        y = touchObj.pageY;
        posX = this.offsetLeft
        posY = this.offsetTop
      });
      box.addEventListener("touchmove", function (e) {
        let touchObj = e.targetTouches[0];
        // 计算移动距离
        moveX = touchObj.pageX - x;
        moveY = touchObj.pageY - y;
        this.style.left = posX + moveX + "px";
        this.style.top = posY + moveY + "px";
      });
    </script>
  </body>

二、移动端常见特效

2.1 click延时解决方案

移动端click 事件会有300ms的延时,原因是移动端屏幕双击会缩放(doubletap to zoom)页面。
解决方案:
1、禁用绽放。浏览器禁用默认的双击缩放行为并且去掉300ms的点击延迟
<meta name="viewport" content="user-scalable=no">
2、自己封装点击事件(不推荐)
利用touch事件自己封闭这个事件解决300ms延迟

  • 1、当手指触摸屏幕,记录当前触摸时间.
  • 2、当我们手指离开屏幕,用离开的时间减去触摸的时间
  • 3、如果时间小于150ms,并且没有滑动过屏幕,那么我们就定义为点击
    3、利用fastclick插件
// 封装tap,解决click 300ms延时
function tap(obj, callback) {
  var isMove = false;
  var startTime = 0;
  obj.addEventListener("touchstart", function (e) {
    startTime = Date.now(); // 记灵触摸时间
  });
  obj.addEventListener("touchmove", function (e) {
    isMove = true;
  });
  obj.addEventListener("touchend", function (e) {
    if (!isMove && Date.now() - startTime < 150) {
      callback && callback(); // 执行回调函数
    }
    isMove = false
    startTime = 0;
  });
}
// 调用
tap(div,fn)

三、移动端常用开发插件

JS 插件是js文件,它遵循一定规范编写,方便程序展示效果,拥有特定功能且方便调用。如轮播图和瀑布流插件。
特点:它一般是为了解决某个问题而专门存在,其功能单一,并且比较小。

3.1 fastclick.js 解决移动端点击事件300ms延迟问题

github地址:https://github.com/ftlabs/fastclick
文件地址:lib/fastclick.js
1、引入文件

<script type='application/javascript' src='/path/to/fastclick.js'></script>

2、使用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./fastclick.js"></script>
  </head>
  <body>
    <div
      class="box"
      style="width: 200px; height: 200px; background: pink"
    ></div>
    <script>
      var box = document.querySelector(".box");
      var start = new Date();
      // 普通点击事件
      box.addEventListener("click", function () {
        var time = new Date() - start;
        console.log(time, "click");
      });
      box.addEventListener("touchstart", function () {
        var time = new Date() - start;
        console.log(time, "touch");
      });

      // 使用fastclick.js
      if ("addEventListener" in document) {
        document.addEventListener(
          "DOMContentLoaded",
          function () {
            // 注册
            FastClick.attach(document.body);
          },
          false
        );
      }
      // 正常绑定click事件,可节省至少一半时间
      // box.addEventListener("click", function () {
      //   var time = new Date() - start;
      //   console.log(time, "fastclick");
      // });
    </script>
  </body>
</html>

3.2 Swiper插件的使用

官网地址:https://www.swiper.com.cn/

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

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

相关文章

网络防御(2)

1. 什么是防火墙&#xff1f; 2. 状态防火墙工作原理&#xff1f; 3. 防火墙如何处理双通道协议&#xff1f; 一、什么是防火墙&#xff1f; 防火墙是一种网络安全设备或软件&#xff0c;用于保护计算机网络免受未经授权的访问&#xff0c;并管理网络流量。它作为一个安全边界…

golang trace view 视图详解

大家好&#xff0c;我是蓝胖子&#xff0c;在golang中可以使用go pprof的工具对golang程序进行性能分析&#xff0c;其中通过go trace 命令生成的trace view视图对于我们分析系统延迟十分有帮助&#xff0c;鉴于当前对trace view视图的介绍还是很少&#xff0c;在粗略的看过tra…

双向带头循环链表+OJ题讲解

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

前端渲染数据

在前端对接受后端数据处理后返回的接收值的时候&#xff0c;为了解决数据过于庞大&#xff0c;而对数据进行简化处理例如性别&#xff0c;经常会使用1&#xff0c; 0这俩个来代替文字的男&#xff0c;女。以下就是前端渲染的具体实现。 以下是部分代码 <el-table-columnpr…

维深(Wellsenn):2023中国消费端VR内容开发商调研报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 国内互联网大厂商入局VR&#xff0c;字节跳动、网易表态明确。字节跳动2021年收购国内头部VR硬件厂商PICO后&#xff0c;加速构建VR内容生态&#xff0c;2021年 成立海南创见未来当前已推出VR视频应用…

fabric.js里toDataURL后,画布内容展示不全?

复现场景&#xff1a; 用fabric生成画布后&#xff0c;转成图片&#xff0c;然后直接在浏览器里打开&#xff0c;画布展示内容缺失 画布原图&#xff1a; toDataURL后链接在浏览器打开&#xff1a; 原因解析&#xff1a; base64链接太长&#xff0c;输入浏览器链接被截断&…

HOT79-跳跃游戏 II

leetcode原题链接&#xff1a;跳跃游戏 II 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j &…

VUE+view table.exportCsv()导出.csv文档时如何防止数据格式为科学计数

当使用table.exportCsv()方法导出数据时&#xff0c;出现科学计数法问题&#xff0c;像电话号码&#xff0c;身份证号码等&#xff0c;当数据大于15位后面的会用0替代。 针对这一问题&#xff0c;解决方法如下&#xff1a;就是再数字前加上制表符“\t”注意双引号&#xff0c;…

设计模式-简单工厂模式(静态工厂模式)java实现

介绍 简单工厂模式根据所提供的参数数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。 意图 提供一个类&#xff0c;负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator…

机械工业信息研究院:2023年中国生物制药行业报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 医药工业宏观情况分析 2021 年生物制药带动医药工业经 济指标大幅增长。根据统计&#xff0c;2021年规 模以上医药工业增加值同比增长 23.1%&#xff0c;增速较上年同期提升 17.2个百分点&#xff0…

MVSnet点云定量评估指标总结

根据MVSnet论文[1]原文说明&#xff0c;点云评估主要从准确性和完整性两个方面来评估。 针对准确性的评估&#xff0c;采用平均距离指标来度量&#xff0c;具体指标分别为Acc、Comp、overall&#xff0c;准确性指标越低越好&#xff0c;表示R与G之间的距离越小&#xff0c;恢复…

《CodeGeeX2 一个让你编码效率翻倍的扩展,分享几个使用小技巧》学习笔记

《CodeGeeX2 一个让你编码效率翻倍的扩展&#xff0c;分享几个使用小技巧》学习笔记 【Only Key Control】使用按键触发提示 使用注释来提升CodeGeeX生成代码的准确性 在函数的顶部添加对函数的说明然后输入function的关键字再使用【Alt /】来触发自动补全 使用CodeGeeX解释…

构建Docker容器监控系统(Cadvisor +Prometheus+Grafana)

Cadvisor PrometheusGrafana 1.1、Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 1.2、安装docker-ce [rootloc…

LeetCode 热题 100 JavaScript--98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 *** Definition for …

根据渲染数据长度动态渲染后缀图标

在动态获取数据时&#xff0c;想要渲染后面的图标是根据数据的长度渲染图标位置&#xff0c;效果如下&#xff1a; 代码如下&#xff1a; <el-row :gutter"60"><el-col :span"24"><el-form-item><el-input v-model.trim"form…

zuul实现黑名单,request多次读取问题,stream close

一&#xff0c;背景及设计 1.需要在网关实现黑名单功能&#xff0c;实现拦截指定接口。黑名单用户&#xff0c;会加入指定黑名单列表&#xff0c;关联对应功能&#xff0c;如用户登录&#xff0c;用户下单&#xff0c;用户接单。 2.表设计 平台表&#xff1a;不同系统 黑名单…

TimedCache 类的作用和使用

TimedCache 类的作用是实现一个带有过期时间的缓存。它允许存储键值对&#xff0c;并在一定时间后自动删除过期的键值对。使用 TimedCache 可以提高程序的性能&#xff0c;减少对数据库或其他资源的访问次数。 使用 TimedCache 类时&#xff0c;可以按照以下步骤进行操作&…

干货!esp8266+ds3231低功耗解决方案,在特定时间唤醒

最近首次接触esp8266&#xff0c;也是第一次接触硬件&#xff0c;在一个墨水屏日历项目上遇到了低功耗问题&#xff0c;特此记录。 此墨水屏日历不需要一直处于启动状态&#xff0c;我希望它每几小时或者每天启动一次即可。 解决方案 1&#xff1a;仅使用内部 RTC 通过将GPIO…

Android监听设备亮灭屏广播(动态广播代码)

MainActivity中 public class MainActivity extends Activity {private WakeAndLockReceiver wakeAndLockReceiver;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//注册亮屏和息…

强化学习研究 PG

由于一些原因&#xff0c; 需要学习一下强化学习。用这篇博客来学习吧&#xff0c; 用的资料是李宏毅老师的强化学习课程。 深度强化学习(DRL)-李宏毅1-8课&#xff08;全&#xff09;_哔哩哔哩_bilibili 这篇文章的目的是看懂公式&#xff0c; 毕竟这是我的弱中弱。 强化…