当前位置:首页 > JavaScript

js实现手机滑动效果

2026-04-04 09:21:51JavaScript

使用Touch事件实现滑动效果

在移动端实现滑动效果,主要通过监听touchstarttouchmovetouchend事件来实现。以下是一个基础实现示例:

let startX, moveX;
const slider = document.getElementById('slider');

slider.addEventListener('touchstart', (e) => {
  startX = e.touches[0].clientX;
});

slider.addEventListener('touchmove', (e) => {
  moveX = e.touches[0].clientX - startX;
  e.preventDefault();
  slider.style.transform = `translateX(${moveX}px)`;
});

slider.addEventListener('touchend', () => {
  // 滑动结束后的处理逻辑
  slider.style.transform = 'translateX(0)';
  slider.style.transition = 'transform 0.3s ease';
});

添加惯性滑动效果

为了使滑动更自然,可以添加惯性效果:

let startX, moveX, velocity;
const slider = document.getElementById('slider');
let lastMoveTime = 0;

slider.addEventListener('touchmove', (e) => {
  const now = Date.now();
  const deltaTime = now - lastMoveTime;
  const currentX = e.touches[0].clientX;
  velocity = (currentX - startX) / deltaTime;
  startX = currentX;
  lastMoveTime = now;

  moveX = e.touches[0].clientX - startX;
  slider.style.transform = `translateX(${moveX}px)`;
});

slider.addEventListener('touchend', () => {
  const distance = moveX + velocity * 100;
  slider.style.transform = `translateX(${distance}px)`;
  slider.style.transition = 'transform 0.5s cubic-bezier(0.25, 0.1, 0.25, 1)';
});

使用CSS Transform优化性能

为了确保滑动流畅,应该使用CSS transform而不是直接修改left/top属性:

.slider {
  transition: transform 0.3s ease;
  will-change: transform;
}

实现滑动边界限制

防止滑动超出容器边界:

const maxLeft = 0;
const maxRight = 300;

slider.addEventListener('touchend', () => {
  let finalPosition = moveX;

  if (finalPosition > maxRight) {
    finalPosition = maxRight;
  } else if (finalPosition < maxLeft) {
    finalPosition = maxLeft;
  }

  slider.style.transform = `translateX(${finalPosition}px)`;
});

使用第三方库简化实现

如果项目允许使用第三方库,可以考虑以下选项:

  1. Hammer.js:专门处理手势事件的库

    const hammer = new Hammer(slider);
    hammer.on('pan', (e) => {
    slider.style.transform = `translateX(${e.deltaX}px)`;
    });
  2. Swiper.js:完整的滑动组件解决方案

    const mySwiper = new Swiper('.swiper-container', {
    // 配置选项
    });

处理多指触摸的情况

如果需要支持多指操作,需要调整事件处理逻辑:

js实现手机滑动效果

slider.addEventListener('touchstart', (e) => {
  if (e.touches.length > 1) return;
  startX = e.touches[0].clientX;
});

性能优化建议

  1. 使用requestAnimationFrame进行动画更新
  2. 避免在事件处理函数中进行复杂的DOM操作
  3. 对频繁操作的元素使用will-changeCSS属性
  4. 考虑使用passive事件监听器提高滚动性能
    slider.addEventListener('touchmove', (e) => {
    // 处理逻辑
    }, { passive: true });

标签: 效果手机
分享给朋友:

相关文章

vue实现效果

vue实现效果

Vue 实现常见效果的方法 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现表单元素与数据的双向绑定。例如输入框与数据的实时同步: <input v-model=…

js实现滚动条效果

js实现滚动条效果

实现滚动条效果的方法 使用原生JavaScript实现滚动条 通过监听滚动事件,可以动态调整滚动条的位置和样式。以下是一个基础实现示例: // 获取DOM元素 const container = d…

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class 实…

vue实现tag效果

vue实现tag效果

实现基本标签结构 使用 Vue 的模板语法创建标签容器和单个标签元素。通过 v-for 动态渲染标签列表,结合 v-bind:key 确保渲染性能。 <template> <…

vue实现折叠效果

vue实现折叠效果

使用 v-show 或 v-if 实现基础折叠 通过 Vue 的指令 v-show 或 v-if 控制元素的显示与隐藏。v-show 通过 CSS 的 display 属性切换,v-if 直接操作 D…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…