gpt4 book ai didi

javascript - 如果第一个 child 有任何负值,getBoundingClientRect() 为所有 child 返回相同的值

转载 作者:行者123 更新时间:2023-11-30 21:17:37 29 4
gpt4 key购买 nike

背景

我正在构建一个无限水平的图像滚动:

<div class="infinite-thumbs">
<img src="1.jpg" class="thumb thumb-one">
<img src="2.jpg" class="thumb thumb-two">
<img src="3.jpg" class="thumb thumb-three">
...
<img src="10.jpg" class="thumb thumb-ten">
</div>

<style lang="stylus">

.infinite-thumbs
position absolute
width 100%
height 180px
bottom 40px
white-space nowrap
overflow auto
overflow-y hidden

.thumb
position relative
display inline-block
width 200px
height 180px

</style>

在此处了解有关 Stylus 的更多信息:stylus-lang.com


然后我有一些 jQuery/JS在屏幕外处理图像的克隆和附加:

function scrollUpdate() {

$('.thumb').each(function() {

var bounding = $(this)[0].getBoundingClientRect();

if (bounding.right < 0) {
var $el = $(this);
$el.clone(true).appendTo('.infinite-thumbs');
$el.remove();
}

});

}

$('.infinite-thumbs').on('scroll', function () {
window.requestAnimationFrame(scrollUpdate);
});

所以 scrollUpdate()遍历每个 .thumb元素并检查它是否在屏幕上可见。如果不是 ( bounding.right < 0 ),那么它会被克隆并附加到 .infinite-thumbs 的末尾元素。



问题

我遇到的问题是,一旦 .thumb 之一元素为 bounding.right 返回负值所有 .thumb元素返回完全相同的一组 bounding值(value)观。

因此,当所有内容都可见时,我会在我的控制台中看到:

.thumb-one: { top : 0, right : 200, ... }
.thumb-two: { top : 0, right : 400, ... }
.thumb-three: { top : 0, right : 600, ... }
...
.thumb-ten: { top : 0, right : 2000, ... }

但是一旦第一个子元素 ( .thumb-one ) 获得负数 bounding.right值(value),我在我的控制台中得到这个:

.thumb-one: { top : 0, right : -1, ... }
.thumb-two: { top : 0, right : -1, ... }
.thumb-three: { top : 0, right : -1, ... }
...
.thumb-ten: { top : 0, right : -1, ... }

什么给了?为什么他们都会返回 bounding对象具有完全相同的值只是因为其中之一在屏幕外?

有人知道这里发生了什么吗?



注意:

Both $.fn.offset() and $.fn.position() behave in the same way as getBoundingClientRect(); they return the same set of values for each .thumb once .thumb-one has a negative value in its result.

最佳答案

发生这种情况是因为您在检查所有拇指的位置之前删除了元素。删除第一个元素会导致下一个元素成为第一个元素,离开屏幕。这样,每个拇指都会采取相同的“正确”位置。

解决方案在“每个”循环之外创建一个临时数组,并用它来保存屏幕外的缩略图。然后,在循环之后,以与之前相同的方式克隆、删除和追加元素。像这样:

function scrollUpdate() {
var offScreenElements = [];
$('.thumb').each(function() {

var bounding = $(this)[0].getBoundingClientRect();

if (bounding.right < 0) {
offScreenElements.push($(this));
}
});
$.each(offScreenElements, function(index, element) {
element.clone(true).appendTo('.infinite-thumbs');
element.remove();
});
}

关于javascript - 如果第一个 child 有任何负值,getBoundingClientRect() 为所有 child 返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45517672/

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