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

如何修复我用vanilla JavaScript写的水平滚动脚本

要修复使用vanilla JavaScript编写的水平滚动脚本,首先需要了解脚本的具体问题和目标效果。以下是一些常见问题及其解决方案:

常见问题及解决方案

  1. 滚动不流畅
    • 原因:可能是由于频繁的DOM操作或重绘导致的性能问题。
    • 解决方案:使用requestAnimationFrame来优化动画效果。
  • 滚动方向错误
    • 原因:可能是由于事件处理程序中的逻辑错误。
    • 解决方案:检查事件处理程序中的条件判断,确保滚动方向正确。
  • 滚动范围超出边界
    • 原因:可能是由于没有正确计算滚动范围。
    • 解决方案:在滚动事件中添加边界检查逻辑。

示例代码

假设你有一个简单的水平滚动脚本,以下是一个可能的实现和修复示例:

原始代码

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Horizontal Scroll</title>
    <style>
        .scroll-container {
            width: 100%;
            overflow-x: auto;
            white-space: nowrap;
        }
        .scroll-item {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: lightblue;
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <div class="scroll-container" id="scrollContainer">
        <div class="scroll-item"></div>
        <div class="scroll-item"></div>
        <div class="scroll-item"></div>
        <!-- More items -->
    </div>
    <button onclick="scrollLeft()">Scroll Left</button>
    <button onclick="scrollRight()">Scroll Right</button>

    <script>
        function scrollLeft() {
            var container = document.getElementById('scrollContainer');
            container.scrollLeft -= 100;
        }

        function scrollRight() {
            var container = document.getElementById('scrollContainer');
            container.scrollLeft += 100;
        }
    </script>
</body>
</html>

修复后的代码

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Horizontal Scroll</title>
    <style>
        .scroll-container {
            width: 100%;
            overflow-x: auto;
            white-space: nowrap;
        }
        .scroll-item {
            display: inline-block;
            width: 200px;
            height: 200px;
            background-color: lightblue;
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <div class="scroll-container" id="scrollContainer">
        <div class="scroll-item"></div>
        <div class="scroll-item"></div>
        <div class="scroll-item"></div>
        <!-- More items -->
    </div>
    <button onclick="scrollLeft()">Scroll Left</button>
    <button onclick="scrollRight()">Scroll Right</button>

    <script>
        function scrollLeft() {
            smoothScroll(document.getElementById('scrollContainer'), -100);
        }

        function scrollRight() {
            smoothScroll(document.getElementById('scrollContainer'), 100);
        }

        function smoothScroll(container, delta) {
            const start = container.scrollLeft;
            const change = delta;
            const duration = 200; // milliseconds
            let startTime = null;

            function animateScroll(currentTime) {
                if (!startTime) startTime = currentTime;
                const timeElapsed = currentTime - startTime;
                const run = ease(timeElapsed, start, change, duration);
                container.scrollLeft = run;
                if (timeElapsed < duration) requestAnimationFrame(animateScroll);
            }

            function ease(t, b, c, d) {
                t /= d / 2;
                if (t < 1) return c / 2 * t * t + b;
                t--;
                return -c / 2 * (t * (t - 2) - 1) + b;
            }

            requestAnimationFrame(animateScroll);
        }
    </script>
</body>
</html>

解释

  1. 平滑滚动:通过requestAnimationFrame和缓动函数ease实现平滑滚动效果。
  2. 边界检查:可以在smoothScroll函数中添加边界检查逻辑,确保滚动范围不超出容器边界。

参考链接

通过以上方法,你可以修复水平滚动脚本中的常见问题,并提升用户体验。

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

相关·内容

  • 2019 年 最受欢迎10个 JavaScript 动画库!

    作为一名前端开发者,当我浏览网页寻找一个整洁 Javascript 动画库时,发现很多 “推荐” 动画库都有一段时间没维护了。...经过一些研究,收集了 10个最好 Javascript 动画库,你可以放心在你应用程序中使用 .Three.js ?...超过 15k 星星,Velocity是一个快速 Javascript 动画引擎,拥有与jQuery $.animate() 相同API。它具有彩色动画、转换、循环、画架、SVG支持和滚动。...超过 10k 星星,Vivus是一个零依赖JavaScript类,可以让你为SVG制作动画,让它们具有被绘制外观。 您可以使用许多可用动画之一,或创建自定义脚本来绘制SVG。...GSAP 是一个JavaScript库,用于创建高性能、零依赖、跨浏览器动画,据称在超过400万个网站上使用。GSAP是灵活,可以与React、Vue、Angular和vanilla JS协同工作。

    1.6K10

    轻量级工具Vite到底牛在哪, 一文全知道

    背景与工作方式 在过去Webpack、Rollup 等构建工具作为主场明星时,我们代码都是基于ES Module 规范去。...#app’) 无论我们应用程序大小如何,HMR都能稳定快速更新。...在package.json中只包含vite依赖和一些脚本来构建并启动开发环境。...之后还会花更多时间在修复错误上,改善捆绑软件能够优化并缩短其构建时间。 相比之下,Vite能轻而易举地做到。测试者尝试设置了四个堆栈,并且几乎立即对其进行了一些自定义设置。...项目中绑定工具越多,整体就会越脆弱。如果一个组件发生故障或引入了重大更改,则整个流程将中断,我们必须再次深入研究每个工具和插件及其复杂性,以对其进行修复,Vite从根本上减轻了开发负担。

    4.1K40

    toxssin-XSS 漏洞利用命令行界面和有效负载生成器

    该项目最初是(现在仍然是)一项基于研究创造性努力,旨在探索 XSS 漏洞可能通过使用 vanilla JavaScript、可信证书和廉价技巧引入可利用深度。...-out cert.pem -days 365 强烈建议使用受信任证书运行 toxssin(请参阅本文档中的如何获取有效证书)。...XSS 开发障碍 根据我经验,尝试包含外部 JS 脚本跨站点脚本攻击有 4 个主要障碍: “混合内容”错误,可以通过通过 https 提供 JavaScript 有效负载来解决(即使使用自签名证书)...变更日志 2022-06-19- 添加了exec提示命令(您现在可以针对会话执行自定义 JS 脚本)。 2022-06-23- 添加了两个简单脚本作为测试exec提示命令模板。...修复了 cmd 提示符向后历史访问并进行了一些改进。 未来 我们想法是使其更清晰、更可靠并扩展其功能。目前,正在努力改进文件捕获。

    86620

    CSS 中 关于 Overflow ,你需要了解这些知识点!

    大家都说简历没项目就帮大家找了一个项目,还附赠【搭建教程】。 Hidden ? 当内容比其父内容长时,它将被剪切。但是,可以使用 Javascript 滚动内容。 Scroll ?...Overflow-Y 该家伙负责y轴或元素垂直边。 例和事例 简单滑块 我们可以通过水平裁剪内容并使其滚动来创建快速简单滑块。 ?...水平滚动问题 通常,我们会遇到水平滚动问题,当原因未知时,滚动滚动会变得更加困难。 在本节中,将列出水平滚动一些常见原因,以便大家以后在构建布局时可以想到到它们。...大家都说简历没项目就帮大家找了一个项目,还附赠【搭建教程】。 长词或链接 处理内容中长字或链接时,它应该换行,否则,将会出现水平滚动。 ? 为了解决这个问题,我们需要中断长单词和链接。...在这种情况下,要做是打开DevTools,然后开始删除元素并注意。 一旦水平滚动消失了,就可以确定引起问题元素。

    4.1K20

    现代浏览器内部机制(四): 换个角度看事件

    合成器接收到输入事件 在上一篇文章中,我们研究了合成器如何通过光栅化图层来平滑处理滚动。如果页面上没有事件监听器,合成器线程会创建一个完全独立于主线程合成帧。...合成器线程又是怎样找出需要被触发事件呢? 非快速滚动区域 因为运行 JavaScript 是主线程任务,当一个页面被合成,合成器线程将页面上挂在了事件处理器区域标记为“非快速滚动区域”。...假设此时页面上有个容器,你只想让它进行水平滚动。...举个例子,如果你希望保证你 app 不会阻塞解析,你可以在同步脚本策略之下运行你 app。当 sync-script:none 打开时,会阻塞解析 JavaScript 都会被阻止执行。...这一策略会防止任何“脚本阻塞解析”发生,浏览器就再也不用担心解析被阻塞这件事情了。 总结 当我在构建网站时,通常只关注怎么代码以及怎样才能让自己效率变得更高。

    1K20

    不敢相信,技术栈,居然被P站秒了

    使用ES来解决搜索问题; (5)服务是go; (6)大数据体系Vertica; 画外音:Vertica是一款基于列存储,支持PB级别结构化数据存储数据库。...(7)前端NodeJS也有使用; 提问:一个页面至少包含一个视频,一个GIF广告,一些直播视频预览,一些视频微缩图,如何监控页面性能,如何找到花时间最长地方?...画外音:IntersectionObserver API提供了一种异步观察目标元素是否进入视口(viewport)方法,它可以方便实现,懒加载图片,页面无限下滑,根据滚动到相应区域灵活执行任务或动画等需求...提问:你们播放器,除了播放相对可控视频资源,你们还引入了很多第三方广告,在开发过程中,你们是如何模拟这些动态脚本加载?...答:能够为P站工作是自豪。与我亲近与熟悉的人都知道这款产品,并着迷于这些产品。 提问:最后,作为P站FE,还有什么想分享

    1.8K10

    2020年你应该关注这50款前端热门工具,JavaScript插件篇(一)

    github star 2.6k ,该插件能够很方便集成到你项目中,使用起来简单易用,此插件主要有以下特点: 原生javaScript脚本 零依赖 简单易用 体积小,压缩版仅6KB 功能丰富 可定制...此插件主要有以下特点: 方便你集成到 Angular, React, Vue 和 Vanilla 项目中 灵活设置参数和方法,定制个性化软键盘 基于弹性盒子布局,易于集成和设计 支持外挂个性化插件,...5、Rellax.js 官网地址:https://github.com/ChrisCavs/rallax.js 一款零依赖纯原生 JavaScript 插件,可以帮你快速实现滚动视差效果。...6、FrenchKiss.js 官网地址:https://github.com/koala-interactive/frenchkiss.js FrenchKiss.js是一个JavaScript编写快速...小节 关于 JavaScript 插件就分享到这里,如果你喜欢分享,麻烦给个关注、点赞加转发哦,你支持,就是分享动力,在下篇文章将和大家分享一些关于CSS、HTML、测试及数据工具,敬请期待

    1.5K20

    2020年你应该关注这50款前端热门工具,JavaScript插件篇(一)

    github star 2.6k ,该插件能够很方便集成到你项目中,使用起来简单易用,此插件主要有以下特点: 原生javaScript脚本 零依赖 简单易用 体积小,压缩版仅6KB 功能丰富 可定制...此插件主要有以下特点: 方便你集成到 Angular, React, Vue 和 Vanilla 项目中 灵活设置参数和方法,定制个性化软键盘 基于弹性盒子布局,易于集成和设计 支持外挂个性化插件,...5、Rellax.js 官网地址:https://github.com/ChrisCavs/rallax.js 一款零依赖纯原生 JavaScript 插件,可以帮你快速实现滚动视差效果。...6、FrenchKiss.js 官网地址:https://github.com/koala-interactive/frenchkiss.js FrenchKiss.js是一个JavaScript编写快速...小节 关于 JavaScript 插件就分享到这里,如果你喜欢分享,麻烦给个关注、点赞加转发哦,你支持,就是分享动力,在下篇文章将和大家分享一些关于CSS、HTML、测试及数据工具,敬请期待

    2.5K30

    2019 年 11 个受欢迎 JavaScript 动画库!

    超过20Kstar,Anime是一个JavaScript动画库,可以处理CSS属性,单个CSS转换,SVG或任何DOM属性以及JavaScript对象。...超过15kstar,Velocity是一个快速 Javascript 动画引擎,拥有与jQuery $.animate() 相同API。它具有彩色动画、转换、循环、画架、SVG支持和滚动。...超过10kstar,Vivus是一个零依赖JavaScript类,可以让你为SVG制作动画,让它们具有被绘制外观。 您可以使用许多可用动画之一,或创建自定义脚本来绘制SVG。...GSAP 是一个JavaScript库,用于创建高性能、零依赖、跨浏览器动画,据称在超过400万个网站上使用。GSAP是灵活,可以与React、Vue、Angular和vanilla JS协同工作。...拥有15Kstar和零依赖,这个库为 web 和移动浏览器提供了简单滚动动画,以动画方式显示滚动内容。它支持多种简洁效果类型,甚至允许你使用自然语言定义动画。

    2.4K20

    Dan Abramov脑中JS知识图谱

    使用JavaScript头几年里,觉得自己是个骗子。尽管我可以框架建立网站,但还是缺少一些东西。惧怕JavaScript工作面试,因为对基础知识掌握得不够牢固。...对象字面量是通过在你程序中写下它来创建一个对象值,比如{}或{flavor: "vanilla"}。在{}里面,我们可以有多个property: value键值对,逗号分隔。...可能是最被误解JavaScript概念,this就像一个函数特殊参数。你不会自己把它传给一个函数。相反,JavaScript自己会传递它,这取决于你如何调用函数。...在能够建立一个正确心智模型之前,对自己JavaScript知识感到非常焦虑,希望能够帮助下一代开发者更早地弥补这个差距。 如果你想和我一起深入研究这些主题,有东西给你。...Just JavaScript提炼出来关于JavaScript如何工作心智模型,它将以惊人Maggie Appleton视觉插图为特色。

    1.8K73

    jQuery 自定义网页滚动条样式插件 mCustomScrollbar 介绍和使用方法

    还用了window load ((window).load()) 来激活插件功能,因为这样,就可以保证在页面对象全部加载完成之后,加载插件。...在介绍参数时候,想先为新手介绍两种参数值写法,分别是直接和合并。 我们平时接触插件参数,都是直接跟着参数写上参数值,这个比较直观简单。...,没有严格按照这个规则导致插件无法运行。...("scrollTo","left");:滚动到最左边(水平滚动条) $(selector).mCustomScrollbar("scrollTo","right");:滚动到最右边(水平滚动条 $(selector...这当然是无法 Javascript 来实现,因为浏览器是一个容器,Javascript 是容器里面的代码,怎么会把容器修改了呢?当然,有问题就肯定有解决方法。

    14.1K30

    “第二”编程语言

    真正开始编程是在大四实习时候,开发主要用是Java,Web方向。但那会公司比较小,既要学着后端又要学着前端,所以JavaScript也算熟悉。但在那会看来,这两者并没有太大差别。...对于Python,越久,对它越是喜欢。Python代码总是看起来很像伪代码,可以很少代码实现我们想要东西,爬虫、数据分析、网站、脚本,都可以Python轻易实现。...然后是JavaScript,靠着它做了一些小东西,比如我主页,blog,瞎编名人名言motto。靠着它做了一些工作之外喜欢东西。 最后说说Python。...Python最多是爬虫,比如我比较喜欢看小说,Python爬了N多本某网站5星小说。在工作中也有一些特殊场景需要用到爬虫小知识,如果想偷懒的话。...维护blog脚本也是Python。偶尔也会用Python做一些简单数据处理和分析。Python在工作上和工作之外都帮了很多。

    88270

    SCrollTOP scrollHeight

    大家好,又见面了,是你们朋友全栈君。 jQuery 里和滚动条有关概念很多,但是有三个属性和滚动拖动有关,就是:scrollTop、scrollLeft、scrollHeight。...,所以浏览器打开后,可以看到垂直滚动条。...滚动条向下拖动一段距离,看到页面效果如下(右部a、b是抓图后,PS标出来): 那么,这里外部div scrollTop、scrollHeight 属性到底是什么呢?...其实,图中标出a、b,对我们编程js代码没有任何具体意义,它仅仅具有象征意义。 实际上,在js代码里,滚动条是被抽象为一个“点”来对待。...本示例判断是没有水平滚动情况,在有水平滚动条时,情况会有细小变化,所以nScrollTop + nDivHight >= nScrollHight语句中,需要用“>=”比较运算符,而没有水平滚动时候

    2.3K20

    JQuery Div scrollTop ScrollHeight

    大家好,又见面了,是你们朋友全栈君。 jQuery 里和滚动条有关概念很多,但是有三个属性和滚动拖动有关,就是:scrollTop、scrollLeft、scrollHeight。...滚动条向下拖动一段距离,看到页面效果如下(右部a、b是抓图后,PS标出来): 那么,这里外部div scrollTop、scrollHeight 属性到底是什么呢?...其实,图中标出a、b,对我们编程js代码没有任何具体意义,它仅仅具有象征意义。 实际上,在js代码里,滚动条是被抽象为一个“点”来对待。...程序中,在外部divscroll(滚动)事件中侦测和执行if判断语句,是非常消耗CPU资源鼠标拖拉滚动条,只要有一个像素变动就会触发该事件。但点击滚动条两头箭头,事件触发频率会低得多。...本示例判断是没有水平滚动情况,在有水平滚动条时,情况会有细小变化,所以nScrollTop + nDivHight >= nScrollHight语句中,需要用“>=”比较运算符,而没有水平滚动时候

    2.8K10
    领券