position.top 的 div 在滚动时不断变化
position.top of a div changing constantly on scroll
我必须计算自滚动容器内一系列 div 的 position().top。
位置在加载时计算正确,但在滚动时不断变化。
这是一支笔:https://codepen.io/frontend2020/pen/GRWJVvq(打开控制台查看滚动上的数字变化)
我需要那个初始数字永远不会改变,这可能吗?
如果我将相同的逻辑应用于 $(document).on("scroll", xxx);
而不是 $(".container").on("scroll", xxx);
,那么这个数字永远不会改变,这也是我希望在我的情况下也是如此。
非常感谢任何提示或解决方案
为了保留初始值,您可以在页面加载时将它们保存为数据属性:
function saveInitalTopValueAsDataAttribute() {
$(".container div").each(function () {
$(this).data('top', $(this).position().top);
});
}
$(document).ready(function() {
saveInitalTopValueAsDataAttribute();
});
$(".container").on("scroll", function() {
$(this).find('div').each(function(){
console.log( $(this).data('top') );
});
});
body {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body * {
box-sizing: inherit;
}
.container {
margin: 0 auto;
width: 800px;
height: 300px;
overflow: auto;
}
.container div {
height: 400px;
background: red;
}
.container div:first-child {
background: #000;
}
.container div:last-child {
background: purple;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="first"></div>
<div class="second"></div>
<div class="third"></div>
</div>
使用offsetTop
代替position().top
;这是示例codepen link
我必须计算自滚动容器内一系列 div 的 position().top。
位置在加载时计算正确,但在滚动时不断变化。
这是一支笔:https://codepen.io/frontend2020/pen/GRWJVvq(打开控制台查看滚动上的数字变化)
我需要那个初始数字永远不会改变,这可能吗?
如果我将相同的逻辑应用于 $(document).on("scroll", xxx);
而不是 $(".container").on("scroll", xxx);
,那么这个数字永远不会改变,这也是我希望在我的情况下也是如此。
非常感谢任何提示或解决方案
为了保留初始值,您可以在页面加载时将它们保存为数据属性:
function saveInitalTopValueAsDataAttribute() {
$(".container div").each(function () {
$(this).data('top', $(this).position().top);
});
}
$(document).ready(function() {
saveInitalTopValueAsDataAttribute();
});
$(".container").on("scroll", function() {
$(this).find('div').each(function(){
console.log( $(this).data('top') );
});
});
body {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body * {
box-sizing: inherit;
}
.container {
margin: 0 auto;
width: 800px;
height: 300px;
overflow: auto;
}
.container div {
height: 400px;
background: red;
}
.container div:first-child {
background: #000;
}
.container div:last-child {
background: purple;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
<div class="first"></div>
<div class="second"></div>
<div class="third"></div>
</div>
使用offsetTop
代替position().top
;这是示例codepen link