当前位置:首页 > JavaScript

js实现手机滑动效果

2026-01-30 17:40:53JavaScript

实现基础滑动效果

使用touchstarttouchmovetouchend事件监听触摸操作:

let startX, moveX;
const slider = document.querySelector('.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', () => {
    // 滑动结束后的处理逻辑
});

添加惯性滑动效果

通过计算滑动速度和方向实现惯性效果:

let startTime, velocity;
const threshold = 50; // 滑动判定阈值

slider.addEventListener('touchmove', (e) => {
    const currentTime = Date.now();
    const deltaX = e.touches[0].clientX - startX;
    velocity = deltaX / (currentTime - startTime);
    startTime = currentTime;
});

slider.addEventListener('touchend', () => {
    const distance = velocity * 100; // 根据速度计算惯性距离
    if (Math.abs(distance) > threshold) {
        slider.style.transition = 'transform 0.5s ease-out';
        slider.style.transform = `translateX(${distance}px)`;
    }
});

限制滑动边界

防止元素滑出可视区域:

const maxSlide = 200; // 最大滑动距离

slider.addEventListener('touchmove', (e) => {
    const currentX = e.touches[0].clientX - startX;
    if (Math.abs(currentX) > maxSlide) {
        return;
    }
    slider.style.transform = `translateX(${currentX}px)`;
});

使用CSS优化性能

添加硬件加速和过渡效果:

.slider {
    will-change: transform;
    transition: transform 0.3s cubic-bezier(0.25, 0.1, 0.25, 1);
}

完整示例代码

整合所有功能的实现:

js实现手机滑动效果

class TouchSlider {
    constructor(element) {
        this.el = element;
        this.startX = 0;
        this.currentX = 0;
        this.velocity = 0;
        this.lastTime = 0;
        this.isDragging = false;
        this.setupEvents();
    }

    setupEvents() {
        this.el.addEventListener('touchstart', this.handleStart.bind(this));
        this.el.addEventListener('touchmove', this.handleMove.bind(this));
        this.el.addEventListener('touchend', this.handleEnd.bind(this));
    }

    handleStart(e) {
        this.isDragging = true;
        this.startX = e.touches[0].clientX;
        this.currentX = this.getTranslateX();
        this.lastTime = Date.now();
    }

    handleMove(e) {
        if (!this.isDragging) return;
        e.preventDefault();

        const x = e.touches[0].clientX;
        const deltaX = x - this.startX;
        const now = Date.now();
        const deltaTime = now - this.lastTime;

        this.velocity = deltaX / deltaTime;
        this.lastTime = now;

        this.setTranslateX(this.currentX + deltaX);
    }

    handleEnd() {
        this.isDragging = false;
        const momentum = this.velocity * 100;

        this.el.style.transition = 'transform 0.5s cubic-bezier(0.25, 0.1, 0.25, 1)';
        this.setTranslateX(this.getTranslateX() + momentum);

        setTimeout(() => {
            this.el.style.transition = '';
        }, 500);
    }

    getTranslateX() {
        const transform = window.getComputedStyle(this.el).transform;
        if (transform === 'none') return 0;
        return parseInt(transform.split(',')[4].trim());
    }

    setTranslateX(x) {
        this.el.style.transform = `translateX(${x}px)`;
    }
}

// 初始化
new TouchSlider(document.querySelector('.slider'));

注意事项

  • 移动端需要添加viewport元标签确保正确显示
  • 考虑添加passive: true提高滚动性能
  • 对于复杂场景建议使用现成库如Hammer.js或Swiper.js
  • 测试不同设备的触摸事件差异,特别是iOS和Android的细微区别

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

相关文章

js实现图片滚动效果

js实现图片滚动效果

使用CSS动画实现图片滚动 通过CSS的@keyframes和animation属性实现无缝滚动效果。将图片容器设置为横向排列,通过动画平移位置。 <style> .scroll-c…

vue实现吸附效果

vue实现吸附效果

实现吸附效果的基本思路 吸附效果通常指当页面滚动到某个位置时,元素固定在视口的特定位置。Vue中可以通过监听滚动事件结合CSS的position: sticky或动态样式切换实现。 使用CSS的po…

js实现点击效果

js实现点击效果

实现点击效果的JavaScript方法 使用addEventListener绑定点击事件 通过document.getElementById或document.querySelector获取DOM元素…

vue 实现分页效果

vue 实现分页效果

使用 Element UI 实现分页 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI: npm install…

vue实现开关效果

vue实现开关效果

使用Vue实现开关效果 使用v-model绑定数据 通过v-model绑定一个布尔值来控制开关状态。当用户点击开关时,布尔值会自动更新。 <template> <div cla…

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…