Vanilla JS 中具有 Momentum 的水平滚动

2023-12-02

我目前正在开发一个项目,我想要一个水平滑块。我使这个滑块可拖动,并找到了一些代码使其能够随动量滑动。我设法用鼠标滚轮进行水平滚动,但我不知道如何使其与动量效果一起工作。我能怎么做 ?

Lorem ipsum dolor sat amet,consectetur adipiscing elit。前庭 nec dapibus leo。 Nunc odio Massa,tempor eu aliquam vel,viverra vitae est. Suspendisse dignissim nisi arcu。 Vivamus non sem et mi auctor varius。在我们的祖国、在希梅内奥斯的概念中,阶级是有默契的社会关系的。 Proin blanditmalesuada sem,vel gravida totortor volutpat nec。 Ut eu 前庭 neque。

(抱歉,但我认为我无法更准确,我需要向您展示代码以使您理解)

// Slider dragging

const slider = document.querySelector('.slider');
let isDown = false;
let startX;
let scrollLeft;

slider.addEventListener('mousedown', (e) => {
    isDown = true;
    slider.classList.add('active');
    startX = e.pageX - slider.offsetLeft;
    scrollLeft = slider.scrollLeft;
    cancelMomentumTracking();
});

slider.addEventListener('mouseleave', () => {
    isDown = false;
    slider.classList.remove('active');
});

slider.addEventListener('mouseup', () => {
    isDown = false;
    slider.classList.remove('active');
    beginMomentumTracking();
});

slider.addEventListener('mousemove', (e) => {
    if(!isDown) return;
    e.preventDefault();
    const x = e.pageX - slider.offsetLeft;
    const walk = (x - startX); //scroll-fast
    var prevScrollLeft = slider.scrollLeft;
    slider.scrollLeft = scrollLeft - walk;
    velX = slider.scrollLeft - prevScrollLeft;
});

// Momentum 

var velX = 0;
var momentumID;

slider.addEventListener('wheel', (e) => {
    cancelMomentumTracking();
});  

function beginMomentumTracking(){
    cancelMomentumTracking();
    momentumID = requestAnimationFrame(momentumLoop);
}

function cancelMomentumTracking(){
    cancelAnimationFrame(momentumID);
}

function momentumLoop(){
    slider.scrollLeft += velX * 2;
    velX *= 0.95; 
    if (Math.abs(velX) > 0.5){
        momentumID = requestAnimationFrame(momentumLoop);
    }
}

//Scroll

const scrollContainer = document.querySelector(".slider");

scrollContainer.addEventListener("wheel", (evt) => {
    evt.preventDefault();
    scrollContainer.scrollLeft += evt.deltaY;
});
.slider {
    display: flex;
    width: 100vw;
    height: 75vh;
    cursor: grab;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    -ms-overflow-style: none;
    scrollbar-width: none;
}

.slider:active {
    cursor: grabbing;
}

.slider::-webkit-scrollbar {
    display: none;
}

.slide {
    margin: auto;
    margin-left: 3rem;
    flex-shrink: 0;
    width: 70%;
    height: 80%;
    background-color: crimson;
}

.slide:last-child {
    margin-right: 3rem;
}
<div class="slider" data-scroll-container="">
            <div class="slide" id="slide-1"></div>
            <div class="slide" id="slide-2"></div>
            <div class="slide" id="slide-3"></div>
            <div class="slide" id="slide-4"></div>
            <div class="slide" id="slide-5"></div>
        </div>

将其添加到您的函数中。它并不像我希望的那么顺利,但它完成了工作:

scrollContainer.addEventListener("wheel", (evt) => {
    // scrollContainer.scrollLeft += evt.deltaY;

    window.requestAnimationFrame(() => {
        scrollContainer.scrollTo({ top: 0, left: scrollContainer.scrollLeft + (evt.deltaY * 2), behavior: "smooth" });
    });
});

我所做的是我更换了scrollLeft行动与scrollTo其中有一个smooth行为参数。我还添加了evt.deltaY * 2因为就我而言,滚动不够。

我想要改进的是使用滚轮时的滚动捕捉以及更少的“卡顿”。

请参阅此处的演示(滚动到蓝色/紫色框)-JavaScript 平滑水平滚动

JavaScript Smooth Horizontal Scrolling

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vanilla JS 中具有 Momentum 的水平滚动 的相关文章

  • 防止用户在下拉菜单中选择默认值

    我试图阻止用户选择默认的下拉菜单选项 有没有办法在下拉菜单选项中添加文本而不是值 我的代码
  • 如何并排放置两个

    我有两个 div 我想要并排放置的元素 如下所示 navigation content 我想要导航 div 根据需要尽可能大 但不能更大 收缩以适应行为 内容 div 然后应该填充剩余的空间 如何在不指定百分比 例如 20 80 的情况下使
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 如何更改 Bootstrap 3 div 列顺序

    正在做我的第一个响应式设计 在 Bootstrap 3 中可能会出现类似的情况 在 lg 上更改此设置 a b c sm 上的这个 a c b 您可以使用两个 div 一个用于第一类型的布置 另一个用于第二类型的布置 第一个仅在 lg 中显
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • JSTL 在循环中每 5 个字段集创建一个新行

    您好 我目前正在迭代并在表中显示字段集列表 为了让布局变得更得体一些 我想在每次循环到达第五个字段集时创建一个新行 谢谢 JSP div class det table class det tr td td tr table div
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 三级十进制有序列表 CSS

    我有一个 html 中的三级有序列表 我想为其提供如下样式 1 Item 1 1 1 Item 2 1 1 1 Item 3 下一个 plunker 中有一个 html 示例 http plnkr co edit DqhZ5pJILTUHG
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值
  • 带显示块的SPAN

    和默认有什么区别 div 元素和默认值 span 元素与display block HTML 元素的有效性和语义存在差异 否则它们是相同的 div and span两者都被定义为通用容器 在 HTML 方面没有更深层次的含义 一个默认为块显

随机推荐

  • Google Sheet Api get 函数在 nodejs 中返回未定义的值

    function changeData auth sheetId var sheets google sheets v4 sheets spreadsheets values update auth auth spreadsheetId s
  • 增量压缩和一次性压缩有什么区别?

    我正在尝试使用bz2 and or lzmapython 中的包 我正在尝试以 csv 格式压缩数据库转储 然后将其放入zip文件 我让它与这两个包一起使用一次性压缩 其代码如下所示 with ZipFile something zip w
  • 如何使用R中的Leaflet用一条线连接两个坐标

    我正在尝试使用 R 中的 Leaflet 包来绘制放大器并根据下表中的纬度和经度信息连接标记 Observation InitialLat InitialLong NewLat NewLong A 62 469722 6 187194 51
  • D3 Topojson 圆,半径以英里为单位

    假设现有投影 topojson 我想做的是在半径 r 以英里为单位的点 long lat 处创建一个圆 我知道有一个 d3 geo 函数可以实现此目的 但经过一番考虑后 我认为它与我的特定应用程序不太兼容 所以现在我正在寻找使用原生 svg
  • ios - 以编程方式将 .m4a 转换为 .mp3 文件

    这里我有m4a格式的音频 我需要转换成mp3格式 为此 我使用的代码为 void toMp3 NSString m4aFilePath pathToSave NSString mp3FileName NSString stringWithF
  • 从我的 Android 应用程序调用 Google Pay Intent 时出现错误“您已超出银行设置的最大交易金额”

    我在 Android 应用程序中遇到 Google Pay 集成 应用内支付 问题 当我提出交易请求时 我收到错误 您已超出银行设置的最大交易金额 即使这是我的第一笔交易 当我尝试直接从 Google Pay 发送金额时 它起作用了 Thi
  • 监控和维护应用程序在光盘上的大小的解决方案

    我正在构建一个广泛使用 CoreData 的应用程序 并且我的许多模型都具有 UIImage 和 NSData 属性 用于图像和视频 由于将数据直接存储到 CoreData 中并不是一个好主意 因此我构建了一个文件管理器类 该类根据创建的上
  • RapidXML 给出空的 CDATA 节点

    我编写了下面的代码来获取 CDATA 节点值 我得到了节点的名称 但值是空白的 我将解析标志更改为 parse full 但它也不起作用 如果我从 XML 中手动删除 它会给出预期的值 但在解析之前删除它不是一个选项 代码 include
  • Promises - 在 Promise.all 中捕获所有拒绝[重复]

    这个问题在这里已经有答案了 我有这个虚拟代码 var Promise require bluebird function rej1 return new Promise reject new Error rej1 function rej2
  • Bootstrap 导航栏在滚动时折叠

    我在我的项目中使用引导灰度主题 它有一个在滚动时折叠的导航栏 或者如果我转到同一页面上的链接 download 等 问题是当我从其他页面转到锚链接时 导航栏在滚动之前不会折叠 我想解决方案是在java脚本中添加该行 但我真的不知道要添加什么
  • 如何解决OSError:[WinError 2]不可能找到指定文件:'c:\\ python39 \\ Scripts \\ chardetect.exe'

    正如标题中所述 每次我尝试通过 pip 安装某些内容时 在安装结束时都会出现错误 WARNING Failed to write executable trying to use deleteme logic Rolling back un
  • 如何获取JRadioButton的文本值

    我正在用java创建一个项目 我的程序有 80 个 JRadioButtons 我需要获取它们的文本值 现在这些单选按钮已添加到 ButtonGroup 每个单选按钮有 4 个单选按钮 我知道如何通过以下代码从单选按钮获取文本值 radio
  • 如何不屏蔽 GitHub Actions 中的输出?

    作为 GitHub Actions 中 PowerShell 脚本的一部分 我尝试输出一个 json 对象列表 以便稍后作为另一个作业的矩阵重新使用 使用以下命令我将编写输出 Write Host set output name value
  • XSLT 更改元素中的名称空间

    我正在尝试使用以下 xsl 代码更改元素属性的命名空间
  • ZendGdata框架路径设置错误

    你好 我正在使用 ZendGdata 1 12 5 框架在 youtube 上上传视频 我在我的 php 代码中使用了以下内容 path ZendGdata 1 12 5 library set include path get inclu
  • 如何使用 WS-UsernameToken 获取结果摘要?

    我有来自以下文档ONVIF 程序员指南 我目前正在尝试重现结果摘要使用指南中给出的相同条目 这是我的代码 private string GenerateHashedPassword string nonce string created s
  • Cassandra 无法在 Java 10 上启动

    我有一个全新的 Windows 10 家庭版安装 并全新安装了 JDK 10 0 1 这是我访问 JDK 下载站点时 Oracle 推荐的安装版本 我刚刚下载了 Cassandra 3 11 2 解压缩 d 它 并将 bin 目录放在我的类
  • firebase 云函数 API Google Cloud Storage 错误

    随着 Firebase Cloud Functions 的推出 我们正在考虑将当前的一些 Node js 服务器端代码迁移到云函数 我遇到的一个问题是从 GCS 存储桶下载文件到磁盘上的临时文件 然后将其作为附件通过电子邮件发送 使用 ma
  • 在初始 init“firebase”后添加/编辑 pod 文件

    因此 当我将 pod 文件安装到我的项目中时 我忘记添加到 FirebaseDatabase 中 现在我想将其添加到我该如何做 再次执行 pod init 过程会不会把事情弄乱 我的 Pod 文件照片 您应该只添加所需的新 Pod 然后运行
  • Vanilla JS 中具有 Momentum 的水平滚动

    我目前正在开发一个项目 我想要一个水平滑块 我使这个滑块可拖动 并找到了一些代码使其能够随动量滑动 我设法用鼠标滚轮进行水平滚动 但我不知道如何使其与动量效果一起工作 我能怎么做 Lorem ipsum dolor sat amet con