gpt4 book ai didi

javascript - 如何在 div 的位置添加事件监听器?

转载 作者:太空宇宙 更新时间:2023-11-04 06:12:30 25 4
gpt4 key购买 nike

我想要一个 div 的 css 属性在兄弟 div 到达视口(viewport)顶部时发生变化。

具体来说,我希望“second-subdiv”只有在“first-subdiv”到达视口(viewport)顶部时才会overflow: scroll

基本上我想在“second-subdiv”上设置overflow: hidden 然后写几行我会说的js:

add.EventListener(when-first-subdiv-is-on-top, 改变溢出属性)

<div class="first-div">
<h1>Title</h1>
</div>

<div class= "second-div">
<div class="first subdiv">
<h1>You are Beautiful</h1>
</div>
<div class="second subdiv">
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
<h2>Something Good</h2>
</div>
</div>
html, body {
margin: 0;
padding: 0;
}
.first-div {
margin: 0;
width: 100%;
height: 80vh;
background-color: red;
display: flex;
justify-content: center;
align-items: center;
h1 {
color: white;
}
}
.second-div {
display: flex;
justify-content: space-around;
}
.subdiv {
width: 50%;
height: 100vh;
text-align: center;
overflow: scroll;
}
.first.subdiv {
background-color: magenta;
}
.second.subdiv {

}

有什么帮助吗?

谢谢,

马特奥

最佳答案

让我们首先定义一个函数来实现所需的样式逻辑。

const EPSILON = 0.5;

function setOverflow () {
var firstDiv = document.querySelector('.first.subdiv');
var secondDiv = document.querySelector('.second.subdiv');
var rect = firstDiv.getBoundingClientRect();
if (Math.abs(rect.top) < EPSILON) {
secondDiv.style.overflow = 'scroll';
}
else {
secondDiv.style.overflow = 'hidden';
}
}

函数setOverflow将读取 .first.subdiv 的位置, 使用 get​Bounding​Client​Rect ,并检查其是否为 top -坐标足够接近零(即窗口的顶部边框)并相应地设置溢出样式属性。作为top -坐标通常不会正好为 0足够接近 0 的公差由 EPSILON 定义为介于 -0.5 和 0.5 之间。变量。

每当 .first.subdiv 的位置时,此函数必须运行元素更改,以便可以重新计算溢出属性。您至少需要这些事件:load , resize , scroll , 但您可能需要更多,具体取决于您的最终结果。例如,如果图像是动态添加的,则 .first.subdiv 的位置可能会在没有触发上述任何事件的情况下发生变化。您可能需要查看 Dale Harris 的建议并选择 Intersection Observer API .

为避免多次重新计算溢出,将函数调用包装在 window.requestAnimationFrame 中.

function maybeSetOverflow () {
if (!setOverflow.isBusy) {
setOverflow.isBusy = true;
window.requestAnimationFrame(() => {setOverflow.isBusy = false; setOverflow()});
}
}

window.addEventListener('scroll', maybeSetOverflow);
window.addEventListener('resize', maybeSetOverflow);
window.addEventListener('load' , maybeSetOverflow);

函数maybeSetOverflow将忽略对 setOverflow 的重复调用,如果它已被调用,但未在动画帧中执行。

只需将这两个代码部分包装在 <script> 中即可把它放在你的 <body> 的底部.

关于javascript - 如何在 div 的位置添加事件监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com