使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)

下面是使用原生JS封装Web App滑动效果(惯性滑动、滑动回弹)的攻略:

1. 问题背景

在开发Web APP时,我们会涉及到页面的滑动效果,例如图片浏览、列表滑动等。虽然很多UI框架(如iView、Element UI等)都提供了比较方便的组件,但是自己手写滑动效果,既能提升自己的技能水平,又能优化页面性能。

2. 实现思路

实现惯性滑动,需要监听touchstart、touchmove、touchend事件,通过计算手指在滑动过程中的速度以及加速度,来模拟惯性效果。实现滑动回弹,需要合理运用CSS3属性和贝塞尔曲线。

3. 实现步骤

3.1 监听touch事件

//代码示例1:监听touch事件
let startX, startY, endX, endY = 0;
let touchArea = document.getElementById('touchArea');
// touchstart事件
touchArea.addEventListener('touchstart', function (e) {
  startX = e.touches[0].clientX;
  startY = e.touches[0].clientY;
}, false);
// touchmove事件
touchArea.addEventListener('touchmove', function (e) {
  endX = e.touches[0].clientX;
  endY = e.touches[0].clientY;
  // 阻止页面的滑动默认事件
  e.preventDefault();
}, false);
// touchend事件
touchArea.addEventListener('touchend', function (e) {
  let diffX = endX - startX;
  let diffY = endY - startY;
  // 自己的业务逻辑
}, false);

3.2 计算滑动距离和时间

//代码示例2:计算滑动距离和时间
let startTime, endTime = 0;
// touchstart事件
touchArea.addEventListener('touchstart', function (e) {
  startX = e.touches[0].clientX;
  startY = e.touches[0].clientY;
  startTime = new Date().getTime();
}, false);
// touchend事件
touchArea.addEventListener('touchend', function (e) {
  endX = e.changedTouches[0].clientX;
  endY = e.changedTouches[0].clientY;
  endTime = new Date().getTime();
  let diffX = endX - startX;
  let diffY = endY - startY;
  let diffTime = endTime - startTime;
  // 计算速度和加速度
  let speedX = diffX / diffTime;
  // 自己的业务逻辑
}, false);

3.3 实现惯性滑动

//代码示例3:实现惯性滑动
// touchend事件
touchArea.addEventListener('touchend', function (e) {
  endX = e.changedTouches[0].clientX;
  endY = e.changedTouches[0].clientY;
  endTime = new Date().getTime();
  let diffX = endX - startX;
  let diffY = endY - startY;
  let diffTime = endTime - startTime;
  // 计算速度和加速度
  let speedX = diffX / diffTime;
  // 模拟惯性滑动
  let distance = 0;
  let currentX = touchArea.offsetLeft;
  let timer = setInterval(function () {
    distance = speedX * 20;
    currentX += distance;
    if (Math.abs(currentX) > Math.abs(diffX)) {
      currentX = diffX;
      clearInterval(timer);
    }
    touchArea.style.left = currentX + 'px';
    speedX = speedX * 0.95;
  }, 20);
}, false);

3.4 实现滑动回弹

//代码示例4:实现滑动回弹
// touchend事件
touchArea.addEventListener('touchend', function (e) {
  endX = e.changedTouches[0].clientX;
  endY = e.changedTouches[0].clientY;
  endTime = new Date().getTime();
  let diffX = endX - startX;
  let diffY = endY - startY;
  let diffTime = endTime - startTime;
  // 计算速度和加速度
  let speedX = diffX / diffTime;
  // 模拟惯性滑动
  let distance = 0;
  let currentX = touchArea.offsetLeft;
  let timer = setInterval(function () {
    distance = speedX * 20;
    currentX += distance;
    if (Math.abs(currentX) > Math.abs(diffX)) {
      currentX = diffX;
      clearInterval(timer);
      // 滑动回弹
      touchArea.style.transition = 'All ease-in-out 0.2s';
      touchArea.style.webkitTransition = 'All ease-in-out 0.2s';
      touchArea.style.animation = 'bounce 0.2s';
      touchArea.style.webkitAnimation = 'bounce 0.2s';
    }
    touchArea.style.left = currentX + 'px';
    speedX = speedX * 0.95;
  }, 20);
}, false);

4. 示例说明

示例1:使用原生JS实现惯性滑动和滑动回弹效果:代码地址

示例2:基于示例1的改进版本,结合H5C3的transition和animation实现更加细腻的滑动效果:代码地址

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用原生js封装webapp滑动效果(惯性滑动、滑动回弹) - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JavaScript下的时间格式处理函数Date.prototype.format

    JavaScript中,我们可以使用Date对象来表示时间。Date对象提供了多种方法用来获取或者设置时间,其中Date.prototype.format()方法可以用来将日期格式化成指定格式的字符串。下面是这个函数的攻略: 1. 基本语法 dateString.format(formatString) 说明: dateString:一个日期对象 forma…

    JavaScript 2023年5月27日
    00
  • layui的表单验证支持ajax判断用户名是否重复的实例

    以下是使用layui实现表单验证并通过ajax判断用户名是否重复的攻略: 1. 准备工作 首先,需要在网页中引入layui的核心文件和layui的form模块。可以通过以下方式在HTML文档中引入layui的核心文件和form模块: <!– 引入layui核心文件 –> <script src="https://cdn.jsd…

    JavaScript 2023年6月10日
    00
  • JavaScript操纵窗口的方法小结

    以下是关于“JavaScript操纵窗口的方法小结”的完整攻略: JavaScript操纵窗口的方法小结 在前端开发中,我们经常需要通过JavaScript操纵窗口,实现弹出新窗口、关闭窗口、调整窗口大小等操作。下面我们就来介绍一些常用的JavaScript操纵窗口的方法: 弹出新窗口 我们可以通过window.open()方法来实现弹出新窗口的功能。该方法…

    JavaScript 2023年6月11日
    00
  • javascript asp教程第六课– response方法

    下面是详细讲解“javascript asp教程第六课– response方法”的完整攻略: 一、什么是response对象? 在 ASP 中,response 对象代表向客户端发送输出时使用的方法和属性。它允许 ASP 页面向客户端浏览器发送文本、HTML、XML 或任何其他类型的数据。下面是response对象的一些常用方法: Write(strTex…

    JavaScript 2023年5月28日
    00
  • 用javascript动态调整iframe高度的方法

    让我们来详细讲解一下“用JavaScript动态调整iframe高度的方法”。 1. 初步思路 我们知道,iframe是用来在网页中嵌入其他网页的一种标签,它可以让我们把其他页面的内容直接展现在当前页面上,那么我们如何动态调整嵌入页面的高度呢? 我们首先需要获取iframe的内容高度,然后再通过JavaScript动态设置iframe的高度。 2. 获取if…

    JavaScript 2023年6月11日
    00
  • javascript跳转与返回和刷新页面的实例代码

    下面我来给大家详细讲解一下“JavaScript跳转与返回和刷新页面的实例代码”的攻略。 一、JavaScript跳转页面 要实现JS跳转页面,可以使用 window.location 对象,可以修改当前页面的 URL 地址,还可以打开新的页面。下面是实现JS跳转页面的示例代码: // 跳转到百度首页 window.location.href = &quot…

    JavaScript 2023年6月11日
    00
  • javascript实现日期格式转换

    实现日期格式转换可以使用JavaScript内置的Date对象。下面是完整攻略: 步骤一:创建Date对象 要将日期格式进行转换,需要先创建一个Date对象。可以通过以下代码创建一个当前日期的Date对象: var today = new Date(); 也可以使用参数来创建自定义的日期对象。例如,以下代码创建了一个具有指定日期的Date对象: var cu…

    JavaScript 2023年5月27日
    00
  • Marked.js让您的文档编辑更加轻松自如

    ​ 低代码应用平台——kintone既可以保留更改记录,也有流程管理的功能,在公司内部分享会议记录啊、wiki等文档或学习资料等时非常的便利。 kintone还有丰富的文本编辑框,可以对内容进行编辑提高易读性。但是还是有不少人觉得如果能够使用Markdown编辑,将更加轻松,文本也将更加美观。※特别受程序员的欢迎:) 这次就向大家介绍如何使用Cybozu C…

    JavaScript 2023年5月8日
    00
合作推广
合作推广
分享本页
返回顶部