首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js touch 惯性滚动

惯性滚动(Inertial Scrolling)是一种模拟现实世界中物体滚动行为的交互效果,它允许用户在触摸屏幕上滑动后,内容会继续滚动一段距离,然后逐渐减速直至停止。这种效果在移动设备上非常常见,尤其是在浏览列表或页面时。

基础概念

惯性滚动主要依赖于以下几个物理概念:

  • 速度:用户手指滑动的速度。
  • 加速度:随着时间的推移,速度的变化率。
  • 摩擦力:模拟现实世界中的阻力,使滚动最终停止。

相关优势

  1. 用户体验:惯性滚动提供了更自然的滚动体验,使用户感觉更接近真实世界的物理行为。
  2. 减少操作:用户不需要精确控制滚动停止的位置,系统会自动处理减速过程。
  3. 流畅性:通过平滑的减速动画,增强了界面的流畅性和响应性。

类型

惯性滚动通常分为以下几种类型:

  • 线性惯性滚动:滚动速度随时间线性减小。
  • 非线性惯性滚动:滚动速度随时间非线性减小,通常更符合真实世界的物理规律。

应用场景

惯性滚动广泛应用于各种移动应用和网页设计中,特别是在以下场景:

  • 长列表:如新闻应用、社交媒体应用中的动态列表。
  • 图片浏览:相册应用或图片查看器。
  • 文档阅读:电子书或PDF阅读器。

实现惯性滚动的JavaScript示例

以下是一个简单的JavaScript示例,使用touchstarttouchmovetouchend事件来实现基本的惯性滚动效果:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Inertial Scrolling</title>
    <style>
        #scrollContainer {
            width: 100%;
            height: 300px;
            overflow: hidden;
            position: relative;
        }
        #scrollContent {
            width: 100%;
            transition: transform 0.3s ease-out;
        }
        .item {
            height: 100px;
            border-bottom: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div id="scrollContainer">
        <div id="scrollContent">
            <div class="item">Item 1</div>
            <div class="item">Item 2</div>
            <div class="item">Item 3</div>
            <!-- Add more items as needed -->
        </div>
    </div>

    <script>
        const container = document.getElementById('scrollContainer');
        const content = document.getElementById('scrollContent');
        let startY, startScrollTop, velocity;

        container.addEventListener('touchstart', (e) => {
            startY = e.touches[0].pageY;
            startScrollTop = content.scrollTop;
            velocity = 0;
        });

        container.addEventListener('touchmove', (e) => {
            const currentY = e.touches[0].pageY;
            const deltaY = currentY - startY;
            content.scrollTop = startScrollTop - deltaY;
        });

        container.addEventListener('touchend', () => {
            const time = 300; // Duration of the deceleration animation in ms
            const distance = content.scrollTop - startScrollTop;
            const acceleration = distance / (time * time);
            const steps = 60; // Number of steps for the animation
            const stepDuration = time / steps;

            let currentStep = 0;
            const animate = () => {
                if (currentStep < steps) {
                    content.scrollTop -= acceleration * stepDuration * stepDuration;
                    currentStep++;
                    requestAnimationFrame(animate);
                }
            };

            animate();
        });
    </script>
</body>
</html>

可能遇到的问题及解决方法

  1. 滚动不流畅
    • 原因:可能是由于计算或动画帧率不足导致的。
    • 解决方法:优化动画逻辑,确保使用requestAnimationFrame进行平滑动画,并减少不必要的计算。
  • 滚动过度或不足
    • 原因:惯性计算的参数设置不当,导致滚动行为不符合预期。
    • 解决方法:调整加速度和时间参数,使其更符合实际需求。
  • 兼容性问题
    • 原因:不同浏览器或设备对触摸事件的支持程度不同。
    • 解决方法:进行充分的跨浏览器和设备测试,并使用polyfill或回退机制来处理不支持的情况。

通过以上方法,可以有效实现并优化惯性滚动效果,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原生 JS 实现惯性滚动,给鼠标滚轮增加阻尼感,纵享丝滑

前言当我们在移动终端上滑动页面,手指离开屏幕后,页面的滚动并不会马上停止,而是在一段时间内继续保持惯性滚动,并且滑动阻尼感和持续时间与滑动手势的幅度成正比。...可以通过以下例子感受两种滚动的差异:图片https://code.juejin.cn/pen/7272919488994279484本文将教会你如何让鼠标滚轮也能够丝滑地操作网页,带来更舒适的页面惯性滚动体验...,同时讲解其中技术原理与细节,用最少量的代码实现 JS 鼠标惯性滚动。...实现原理首先需要利用 DOM 事件禁止鼠标滚动,转为 JS 控制。...(value);}此时页面就可以像往常一样滚动了,并且是不依赖系统默认事件的,由 JS 代理滚动效果,接下来我们继续往方法里处理如何平滑过渡。

1.8K41
  • 让 touch 系列事件触发的滚动响应更快

    1写在前面 我们都知道,对于移动端的网页而言,滚动是十分重要的交互。 然而 touch 系列事件触发(滚动后)经常会引发严重的性能问题。...在极个别例子下,这会导致意外的滚动。可以通过在意外滚动发生的元素上添加CSS属性touch-action: none 来阻止滚动发生。继续阅读,你可以了解到更多相关技术的细节。...如果你希望某个元素(无论进行任何 touch 操作都)不会使浏览器发生滚动或缩放,可以往该元素的CSS中加入touch-action: none。...如果想某个元素只可以水平滚动或缩放,可以使用touch-action: pan-y pinch-zoom。...开发者在需要时,应该在 touch 系列事件发生前,使用touch-action这一 CSS 属性去阻止某元素滚动或缩放。

    99520

    touch-action导致安卓页面无法滚动

    能搜到的方案是两种,一种是通过css方式,一种是通过js的方式。...css方式:比较简单 touch-action:none js方式:在touch的事件监听方法上绑定第三个参数{ passive: false } elem.addEventListener( '...就是ios基本都可以的,但是安卓中的页面滚动都没了。这是为什么呢?这个就要看下touch-action的更官方的触摸说明了。 默认情况下,平移(滚动)和捏手势由浏览器独占处理。...文档参考来源:touch-action 说人话 这段话阐明的就是触摸事件整个的进行过程,既然它可以通过css来约定滚动的行为,那么就意味着你写了touch-action:none,就会导致原来的页面滚动失效了...怎么解决呢 先临时把对应的touch:none,全局的写法去掉了,用了js的部分去完成或者只在控制需要的元素内进行指定这行代码。由此也总结了几个问题或者教训吧。

    4.2K00

    JS判断滚动条是否停止滚动

    背景:昨天一个同事有种需求,有一个展示数据区域的div,带滚动条,当滚动条滚动时,需要向后台发请求,计算数据,再拿到前台展示。        ...分析:由于数据量级别较大,所以当滚动条滚动时,如果时时向后台发请求,对服务器和浏览器都造成巨大的压力。想到的解决方案是,当滚动条停止时,再去发请求计算数据。...那么问题来了,如何判断滚动条是否停止了呢?        解决:搜索了一下,js本身是无法判断滚动条是在滚动状态还是停止状态,只有通过其它方式了。...后来想到的思路是当滚动条滚动的时候,发起一个定期执行的方法,并记录一次当前滚动条到顶部的距离,这个方法中判断此时滚动条到顶部的距离是否和上次记录的相等,如果相等,那么说明停止滚动了,不相等,还在滚动。...-- // 让浏览器出现滚动条 for(var i = 0; i < 100; i++) { document.write(""); } var topValue = 0,//

    17.4K00

    JS中的touch事件与canvas绘图

    不管有多少个手指放在了屏幕上,只要再触摸一下屏幕就会触发 touchmove:当手指在屏幕上滑动的时候触发该是事件,在这期间可以通过event.preventDefault()来阻止滚动 touchend...Touch对象属性 所有属性均为只读属性。 Touch.identifier 此 Touch 对象的唯一标识符. 一次触摸动作(我们指的是手指的触摸)在平面上移动的整个过程中, 该标识符不变....Touch.clientX 触点相对于可见视区(visual viewport)左边沿的的X坐标. 不包括任何滚动偏移....Touch.clientY 触点相对于可见视区(visual viewport)上边沿的的Y坐标. 不包括任何滚动偏移. Touch.pageX 触点相对于HTML文档左边沿的的X坐标....当存在水平滚动的偏移时, 这个值包含了水平滚动的偏移. Touch.pageY 触点相对于HTML文档上边沿的的Y坐标. 当存在垂直滚动的偏移时, 这个值包含了垂直滚动的偏移.

    7.6K41
    领券