当前位置:首页 > JavaScript

js实现触摸下拉列表

2026-01-31 06:52:42JavaScript

实现触摸下拉列表的步骤

监听触摸事件

使用touchstarttouchmovetouchend事件来检测用户的触摸操作。这些事件可以捕获触摸的开始、移动和结束。

const list = document.getElementById('dropdown-list');

list.addEventListener('touchstart', handleTouchStart, false);
list.addEventListener('touchmove', handleTouchMove, false);
list.addEventListener('touchend', handleTouchEnd, false);

记录触摸位置

touchstart事件中记录初始触摸位置,用于计算后续的滑动距离。

let startY;

function handleTouchStart(e) {
    startY = e.touches[0].clientY;
}

计算滑动距离

touchmove事件中计算当前触摸位置与初始位置的垂直距离,判断是否为下拉操作。

function handleTouchMove(e) {
    const currentY = e.touches[0].clientY;
    const distanceY = currentY - startY;

    if (distanceY > 0) {
        e.preventDefault(); // 阻止默认行为
        list.style.transform = `translateY(${distanceY}px)`;
    }
}

触发下拉动作

touchend事件中判断滑动距离是否达到阈值,如果是则触发下拉动作。

function handleTouchEnd(e) {
    const endY = e.changedTouches[0].clientY;
    const distanceY = endY - startY;

    if (distanceY > 50) { // 阈值设为50px
        // 触发下拉刷新或其他动作
        console.log('下拉动作触发');
    }
    list.style.transform = 'translateY(0)';
}

添加动画效果

为下拉动作添加平滑的动画效果,提升用户体验。

list.style.transition = 'transform 0.3s ease';

处理边界情况

确保下拉列表在顶部时才能触发下拉动作,避免与其他滚动冲突。

function handleTouchMove(e) {
    if (list.scrollTop > 0) return;

    const currentY = e.touches[0].clientY;
    const distanceY = currentY - startY;

    if (distanceY > 0) {
        e.preventDefault();
        list.style.transform = `translateY(${distanceY}px)`;
    }
}

完整代码示例

以下是一个完整的触摸下拉列表实现示例:

js实现触摸下拉列表

const list = document.getElementById('dropdown-list');
let startY;

list.addEventListener('touchstart', handleTouchStart, false);
list.addEventListener('touchmove', handleTouchMove, false);
list.addEventListener('touchend', handleTouchEnd, false);

list.style.transition = 'transform 0.3s ease';

function handleTouchStart(e) {
    startY = e.touches[0].clientY;
}

function handleTouchMove(e) {
    if (list.scrollTop > 0) return;

    const currentY = e.touches[0].clientY;
    const distanceY = currentY - startY;

    if (distanceY > 0) {
        e.preventDefault();
        list.style.transform = `translateY(${distanceY}px)`;
    }
}

function handleTouchEnd(e) {
    const endY = e.changedTouches[0].clientY;
    const distanceY = endY - startY;

    if (distanceY > 50) {
        console.log('下拉动作触发');
        // 这里可以添加下拉刷新的逻辑
    }
    list.style.transform = 'translateY(0)';
}

注意事项

  • 确保下拉列表的CSS样式允许触摸事件,例如overflow-y: auto
  • 在移动设备上测试时,注意不同浏览器的默认行为可能不同。
  • 如果下拉列表内容动态加载,可能需要重新绑定事件。

标签: 列表js
分享给朋友:

相关文章

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

jquery列表

jquery列表

jQuery 列表操作 jQuery 提供了多种方法来操作 HTML 列表(如 <ul> 或 <ol>),包括动态添加、删除、修改列表项,以及事件绑定等。 创建列表 使用 j…

vue实现列表权限

vue实现列表权限

实现列表权限控制的方法 在Vue中实现列表权限控制通常涉及前端逻辑与后端数据的配合。以下是几种常见方法: 基于角色或权限码的渲染控制 通过v-if或v-show指令根据用户权限动态渲染列表项: &…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…