当前位置:首页 > JavaScript

js实现手机滑动效果

2026-03-01 08:43:58JavaScript

实现手机滑动效果的基本方法

在JavaScript中实现手机滑动效果通常涉及监听触摸事件(touchstart、touchmove、touchend),计算滑动距离和方向,并更新UI。以下是核心实现步骤:

监听触摸事件

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

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

element.addEventListener('touchmove', (e) => {
  moveX = e.touches[0].clientX - startX;
  e.preventDefault(); // 阻止默认滚动行为
});

element.addEventListener('touchend', () => {
  // 滑动结束后的处理
});

计算滑动距离和方向

element.addEventListener('touchend', () => {
  const threshold = 50; // 滑动阈值
  if (Math.abs(moveX) > threshold) {
    if (moveX > 0) {
      console.log('向右滑动');
    } else {
      console.log('向左滑动');
    }
  }
});

实现平滑滑动动画

使用CSS过渡或transform实现平滑动画效果:

element.style.transform = `translateX(${moveX}px)`;
element.style.transition = 'transform 0.3s ease'; // 添加过渡效果

完整示例代码

const slider = document.getElementById('slider');
let startX, currentX, isDragging = false;

slider.addEventListener('touchstart', (e) => {
  isDragging = true;
  startX = e.touches[0].clientX;
  currentX = startX;
  slider.style.transition = 'none'; // 拖动时禁用过渡
});

slider.addEventListener('touchmove', (e) => {
  if (!isDragging) return;
  const x = e.touches[0].clientX;
  const deltaX = x - currentX;
  currentX = x;

  // 更新元素位置
  const currentTranslate = getTranslateX(slider);
  slider.style.transform = `translateX(${currentTranslate + deltaX}px)`;
});

slider.addEventListener('touchend', () => {
  isDragging = false;
  const translateX = getTranslateX(slider);
  const threshold = 100;

  // 根据滑动距离决定最终位置
  if (Math.abs(translateX) > threshold) {
    const direction = translateX > 0 ? 1 : -1;
    const newPosition = direction * slider.offsetWidth;
    slider.style.transition = 'transform 0.3s ease';
    slider.style.transform = `translateX(${newPosition}px)`;
  } else {
    // 回到原点
    slider.style.transition = 'transform 0.3s ease';
    slider.style.transform = 'translateX(0)';
  }
});

function getTranslateX(element) {
  const transform = window.getComputedStyle(element).transform;
  if (transform === 'none') return 0;
  const matrix = transform.match(/^matrix\((.+)\)$/)[1].split(', ');
  return parseFloat(matrix[4]);
}

使用第三方库简化实现

对于更复杂的需求,可以考虑使用现成的滑动库:

Swiper.js示例:

const swiper = new Swiper('.swiper-container', {
  loop: true,
  pagination: {
    el: '.swiper-pagination',
  },
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  },
});

性能优化建议

避免在touchmove事件中执行复杂计算或频繁DOM操作,使用requestAnimationFrame优化动画:

function animateSlider() {
  requestAnimationFrame(() => {
    slider.style.transform = `translateX(${currentPosition}px)`;
  });
}

考虑使用passive事件监听器提高滚动性能:

js实现手机滑动效果

element.addEventListener('touchmove', handler, { passive: true });

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

相关文章

vue实现翻页效果

vue实现翻页效果

使用Vue实现翻页效果 在Vue中实现翻页效果通常需要结合分页组件和数据处理逻辑。以下是几种常见方法: 基础分页组件实现 <template> <div>…

h5实现手机摇一摇功能

h5实现手机摇一摇功能

实现原理 手机摇一摇功能基于设备加速度传感器(DeviceMotionEvent),通过监听设备的加速度变化来判断用户是否进行了摇晃动作。HTML5提供了相关API获取设备传感器数据。 基本…

vue实现点选效果

vue实现点选效果

实现点选效果的基本思路 在Vue中实现点选效果通常涉及监听用户的点击事件,并通过动态绑定类名或样式来改变元素的外观。核心是利用Vue的响应式数据和事件绑定机制。 使用v-bind和v-on实现 通过…

vue实现翻书效果

vue实现翻书效果

Vue实现翻书效果的方法 翻书效果可以通过CSS动画和Vue的动态绑定实现,以下是几种常见的实现方式: 使用CSS transform和transition 通过CSS的transform属性实现翻…

react如何添加效果

react如何添加效果

React 添加动画效果的方法 使用 CSS 过渡动画 在 React 组件中直接通过 className 或 style 属性应用 CSS 过渡效果。定义 CSS 类包含 transition 属性…

vue 实现toogle效果

vue 实现toogle效果

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