原生 JS 实现移动端 Touch 滑动反弹
发布日期:2021-05-10 07:22:36 浏览次数:24 分类:精选文章

本文共 3181 字,大约阅读时间需要 10 分钟。

Touch 滑动实现详解

在移动端开发中,Touch事件是处理触摸操作的核心语音。通过Touch事件可以实现许多有趣的交互效果,比如滑动、缩放、选择框等。在本文中,我们将重点探讨Touch滑动的实现方法,具体包括滑动效果的创建、滑动区间限制以及滑动反弹效果的设置。


一、触摸事件基础

在移动端,触摸事件主要包含以下几种类型:

  • touchstart:用户第一次接触屏幕时触发,用于记录初始触摸点。
  • touchmove:用户在屏幕上移动触尖时触发,可用来处理滑动或缩放操作。
  • touchend:用户释放触尖时触发,通常用于处理滑动完成后的反馈。
  • 理解这些事件的处理流程是实现触摸效果的基础。

    Event 对象的信息

    • changedTouches:包含最新的触摸点信息。
    • targetTouches:包含目标元素的所有触摸点信息。
    • touches:所有可用触摸点的伪数组。

    这些对象在处理滑动时提供了触摸点的坐标信息,帮助开发者实现精确的控制。


    二、滑动效果实现

    为了实现类似PC端滚动的移动端滑动效果,我们需要进行以下步骤:

    1. HTML结构准备

    2. CSS样式设置

    • 数显元素并设置其样式,使其显示为滚动列表。
    • 使用 overflow:hidden 表示超出区域的内容将隐藏。
    • 设置 position:fixed 确保滑动效果相对于固定位置显示。

    3. touchmove处理逻辑

    touchmove 事件中,获取手指的移动位置,并根据该位置的变化动态调整列表的位置。

    var draw = document.querySelector('#draw');var ul = draw.children[0];var startY = 0;var centerY = 0;var maxDown = 50;var maxUp = -(ul.offsetHeight - draw.offsetWidth) + maxDown;// touchmove 处理ul.addEventListener('touchmove', function(e) {  // 清除过渡效果  this.style.transition = 'none';    // 获取差值  var dy = e.changedTouches[0].clientY - startY;    // 计算当前偏移量  var tempY = centerY + dy;    // 判断是否超出最大滑动范围  if(tempY > maxDown || tempY < maxUp) {    // 超出时限制位置    if(tempY > maxDown) {      tempY = maxDown;    } else if(tempY < maxUp) {      tempY = maxUp;    }  }    // 设置列表偏移  this.style.transform = 'translateY(' + tempY + 'px)';    // 记录当前偏移量  centerY = tempY;});// touchend 处理ul.addEventListener('touchend', function(e) {  // 获取差值  var dy = e.changedTouches[0].clientY - startY;    // 更新中心位置  centerY = centerY + dy;    // 判断是否需要反弹  if(centroid < maxUpBounce || centroid > maxDownBounce) {    // 需要反弹时,跳转到反弹点    if(centroid < maxUpBounce) {      centroid = maxUpBounce;    } else {      centroid = maxDownBounce;    }        // 添加过渡效果    this.style.transition = 'transform 0.5s';    this.style.transform = 'translateY(' + centroid + 'px)';  }});

    三、优化与限制

    为了实现代码优化和更好的用户体验,我们可以对滑动效果进行以下限制:

    1. 滑动区间限制

    // 检查是否超出上下限值if(tempY > maxDown || tempY < maxUp) {  // 超出时直接限制到最大值  if(tempY > maxDown) {    tempY = maxDown;  } else if(tempY < maxUp) {    tempY = maxUp;  }}

    2. 滑动反弹效果

    // 在touchend 处理中加入反弹逻辑// 例如:设置反弹间隔var maxUpBounce = 0;var maxDownBounce = -(ul.offsetHeight - draw.offsetHeight);// touchend 处理ul.addEventListener('touchend', function(e) {  // 提取用户的移动距离  var dy = e.changedTouches[0].clientY - startY;  centroid += dy;    // 判断是否需要反弹  if(centroid < maxUpBounce || centroid > maxDownBounce) {    // 需要反弹时,跳转到反弹点    if(centroid < maxUpBounce) {      centroid = maxUpBounce;    } else {      centroid = maxDownBounce;    }        // 添加过渡效果    this.style.transition = 'transform 0.5s';    this.style.transform = 'translateY(' + centroid + 'px)';  }});

    四、代码优化总结

    在实现上述功能的同时,我们需要注意性能问题:

  • 过渡效果:定期清除或设置过渡效果能提升滑动流畅度。
  • 变量管理:确保变量的命名清晰,便于维护和阅读。
  • 错误处理:在处理事件时,加入异常捕捉,防止空指针等错误。
  • 性能监控:使用性能工具分析页面的资源使用情况,优化代码结构。
  • 通过以上优化,能够实现一个流利、自然的滑动效果,满足用户预期的功能需求。


    五、完整代码示例

      
    Touch 滑动反弹

    六、优化建议

  • 阻止默认事件:在处理自定义事件时,可能需要使用 e.preventDefault()防止浏览器默认行为。
  • 事件冒泡:考虑事件是否需要冒泡处理,避免在不必要的情况下使用冒泡。
  • 状态管理:在处理复杂交互时增加状态变量,避免逻辑混乱。
  • 动画优化:在过渡处理时添加áhl速度和延迟,提升用户体验。
  • 通过以上方法,可以根据实际需求进一步优化Touch滑动效果。

    上一篇:不可思议的纯 CSS 滚动进度条效果
    下一篇:从零到一:实现通用一镜到底 H5

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年04月25日 13时31分08秒