如果第一个子项具有任何负值,则getBoundingClientRect()为所有子项返回相同的值

时间:2017-08-05 02:38:08

标签: javascript jquery getboundingclientrect

上下文

我正在建立一个无限水平的图像卷轴:

<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值。

所以当一切都可见时,我会在我的控制台中看到它:

.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值,我就会在我的控制台中得到它:

.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对象,因为其中一个对象是屏幕外的?

任何人都知道这里发生了什么?



注意:

  

$.fn.offset()$.fn.position()的行为方式与此相同   getBoundingClientRect();它们为每个返回相同的值集   .thumb .thumb-one一旦input:checked的结果为负值。

1 个答案:

答案 0 :(得分:1)

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

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

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();
    });
}