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

yizhihongxing

下面是使用原生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日

相关文章

  • JS中filter( )数组过滤器的使用

    下面是关于”JS中filter()数组过滤器的使用”的详细讲解。 简介 filter()是JavaScript数组对象的函数,它可以基于某一条件对数组进行过滤,在返回的新数组中只保留符合条件的值。使用数组过滤器可以只保留想要的值,同时节省代码。filter()方法不会修改原始数组,它会返回一个新数组,所以在使用时需要记住将它赋值给一个变量来保存新数组。 使用…

    JavaScript 2023年5月27日
    00
  • JavaScript静态类型检查工具FLOW简介

    JavaScript静态类型检查工具FLOW简介 什么是FLOW FLOW是Facebook推出的一款JavaScript静态类型检查工具。通过FLOW,我们可以在代码编写阶段就能够发现类型错误,从而减少代码运行时出错的风险,提高代码质量和稳定性。 FLOW的安装和使用 安装 FLOW需要通过NPM来进行安装,可以使用以下命令: npm install –…

    JavaScript 2023年5月27日
    00
  • javascript的动态加载、缓存、更新以及复用(一)

    JavaScript 动态加载、缓存、更新以及复用(一) JavaScript 的动态加载、缓存、更新以及复用是优化前端性能的重要手段。下面将为你详细讲解如何实现。 动态加载 JavaScript 的动态加载可以提高网站的性能,并且在某些情况下可以实现更好的网站交互体验。 在 HTML 文件中动态加载 JavaScript 文件 可以通过在 HTML 文件中…

    JavaScript 2023年5月27日
    00
  • JavaScript实现字符串与日期的互相转换及日期的格式化

    JavaScript实现字符串与日期的互相转换及日期的格式化主要包含以下几个步骤: 将日期字符串转换为Date对象 将Date对象转换为字符串 对日期进行格式化 下面将详细阐述这些步骤: 将日期字符串转换为Date对象 可以使用Date.parse()方法将日期字符串转换为Date对象。该方法接收一个日期字符串作为参数,返回相应的毫秒数。 示例代码: con…

    JavaScript 2023年5月27日
    00
  • 详解vue-router导航守卫

    下面就详细讲解下“详解vue-router导航守卫”的完整攻略。 什么是vue-router导航守卫? vue-router导航守卫分为全局守卫和路由独享守卫,可以在导航过程中拦截和控制,用来控制页面跳转、权限校验等操作。可以通过导航守卫来判断用户是否有权限访问某个页面,或者在某个页面离开时做数据清理等操作。 导航守卫一共包含三种类型:全局前置守卫、全局后置…

    JavaScript 2023年6月11日
    00
  • axios拦截器、ElementUI组件的使用方法

    axios拦截器使用方法 1. 安装Axios Axios是一个基于Promise的HTTP库,可以在浏览器和Node.js中使用。安装Axios,请在命令行输入以下命令: npm install axios 2. 添加拦截器 可以使用Axios的拦截器来在请求或响应被处理前拦截它们。 以下是一个示例,向请求头中添加Authorization: import…

    JavaScript 2023年6月10日
    00
  • Javascript中实现String.startsWith和endsWith方法

    首先,需要明确的是,JavaScript中并没有内置的startsWith和endsWith方法,我们需要手动实现这两个方法。 实现startsWith方法 startsWith方法用于检查字符串是否以指定的子串开头。下面是一份实现这个方法的JavaScript代码: String.prototype.startsWith = function(startS…

    JavaScript 2023年5月19日
    00
  • 微信小程序开发WXML模板语法基础教程

    下面是一份“微信小程序开发WXML模板语法基础教程”的完整攻略。 一、WXML模板语法基础 1. WXML是什么? WXML是微信小程序中的一种类似HTML的标记语言。它主要用于定义小程序的结构和内容,包括布局、组件以及数据绑定等等。 2. 基本语法 2.1 标签 WXML中的标签大多数都和HTML类似,比如div、input、image等等,用法也差不多。…

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