javascript - addEventListener 在 div 中滚动
问题描述
我正在尝试按类或 id 来定位 div 的滚动,但我无法使其工作。console.log(scrolled) 不会激活控制台中的任何内容。有人可以帮我吗?
我使用的 JS 是
document.getElementsByClassName('.site-content').addEventListener('scroll', () => {
const scrolled = document.getElementsByClassName('.site-content').scrollY;
console.log(scrolled);
});
我的部分的 CSS 是
.site-content{
width:100vh;
height:100vw;
overflow-x: hidden;
overflow-y: scroll;
transform: rotate(-90deg) translateX(-100vh);
transform-origin: top left;
position:absolute;
scrollbar-width:none;
-ms-overflow-style:none;
}
解决方案
你有几个问题:
getElementsByClassName()
返回一个HTMLCollection(类似于数组),而不是单个元素,因此您不能addEventListener()
在其上使用。相反,您可以使用querySelector()
which 将返回单个元素。请注意, usingquerSelector()
是一种比 is 更优化的获取单个元素的.getElementsByClassName(class)[0]
方法。该.getElementsByClassName()
方法将在整个 DOM 树中搜索具有该类的元素,然后[0]
用于获取搜索完成后找到的第一个元素(丢弃它找到的所有其他元素)。虽然querySelector()
将在 DOM 中搜索您的元素,并在找到与该类匹配的元素后立即停止搜索,但它不会继续寻找更多的元素.getElementsByClassName()
。scrollY
不是您从中获取的元素.querySelector()
的属性。相反,您可以使用该.scrollTop
属性。您的脚本在页面加载之前运行,这意味着您的脚本将无法找到您尝试使用
querySelector()
. 有几种方法可以解决这个问题,一种方法是将<script></script>
包含代码的标签移动到结束</body>
标签之前,以便它只在加载 HTML 元素后运行。最后,每次使用
.querySelector()
. 这是您添加事件侦听器时的一次,然后是每次滚动事件发生时(这是很多次!)。由于查询 DOM 是一项昂贵的操作,因此最好将其保持在最低限度。您可以改为查询 DOM 一次以获取您的元素,并在回调中使用该元素引用来处理滚动事件。
修复以上几点:
const scrollContent = document.querySelector('.site-content'); // store in a variable so we can reference the element in multiple locations
scrollContent.addEventListener('scroll', () => {
const scrolled = scrollContent.scrollTop; // reuse `scrollContent` innstead of querying the DOM again
console.log(scrolled);
});
推荐阅读
- opengl - 如何对 Renderbuffer 深度信息进行采样并在 CPU 代码中进行处理,而不会对性能造成影响?
- python - 在自定义模型中,keras.layers.Embedding Output Shape 是多个
- date - ListView 中的倒计时 (Flutter)
- python - 如何在 numpy python 中创建螺旋矩阵?
- javascript - 如何在 UI Kitten v5 选择中传递动态数组?
- bash - 仅同步某些文件扩展名并在单独的 git 分支之间排除其他文件扩展名的最佳方法是什么?
- python - Tkinter - 从循环中创建的按钮中检索文本
- nginx - 如何在 nginx 中上游化请求之前在 LUA 代码中设置 proxy_http_version
- c - 三元运算符中的字符测试函数
- c++ - 如何使用 Direct2D 从 BITMAPINFOHEADER 和 BYTE 渲染位图