亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

IntersactionObserver() 僅觀察一行的第一個元素,而不是所有元素

IntersactionObserver() 僅觀察一行的第一個元素,而不是所有元素

MMMHUHU 2023-09-07 16:06:23
我正在嘗試 IntersectionObserver(),它的行為很奇怪:我使用一個非常簡單的布局,在同一個 div 中只有 8 個圖像與 Flexbox,使用換行,所以基本上這 8 個圖像將自己定位在不同的行中,根據視口的大小。我首先將過濾器類(添加模糊過濾器)應用于每個元素,然后在它們顯示在屏幕上時將其刪除:HTML:<div class="flex--cont">            <div class="box box-2">                <img src="img/1.jpg" alt="" class="img img-1">            </div>            <div class="box box-1">                <img src="img/2.jpg" alt="" class="img img-2">            </div>            <div class="box box-3">                <img src="img/3.jpg" alt="" class="img img-3">            </div>            <div class="box box-4">                <img src="img/4.jpg" alt="" class="img img-4">            </div>            <div class="box box-5">                <img src="img/5.jpg" alt="" class="img img-5">            </div>            <div class="box box-6">                <img src="img/6.jpg" alt="" class="img img-6">            </div>            <div class="box box-7">                <img src="img/7.jpg" alt="" class="img img-7">            </div>            <div class="box box-8">                <img src="img/8.jpg" alt="" class="img img-8">            </div>        </div>腳本語言const allImage = Array.from(document.querySelectorAll(".img"));allImage.forEach((img) => img.classList.add("filter"));const removeFilter = function (entries, observer) {  const [entry] = entries;  const image = entry.target;  image.classList.remove("filter");};const ImageObserver = new IntersectionObserver(removeFilter, {  root: null,  threshold: 0.15,});allImage.forEach((img) => ImageObserver.observe(img));問題是觀察者實際上只觀察每行的第一個元素,所以如果我有 2 行,它只會獲得第 1 和第 5 個圖像,如果我有 3 行,它會獲得第 1、第 4 和第 7 個圖像等等。我確實已將其應用于所有圖像。它為什么要這么做?感謝您的回答!
查看完整描述

1 回答

?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

只有第一個發生了變化,因為這就是您通過僅解構第一個數組元素來更改顏色函數的目標:


const [entry] = entries;


但是,InteractionObserver回調不是針對每個條目調用的,而是針對同時觸發的所有條目調用的;因此該entries數組包含所有被觀察的項目,您需要isIntersecting像這樣檢查屬性:


const changeColor = function(entries) {

  entries.forEach(entry => {

    if(entry.isIntersecting) {

      entry.target.style.background = 'blue';

    } else {

      entry.target.style.background = 'red';

    }

  })

}

來自 MDN 文檔


let callback = (entries, observer) => {

  entries.forEach(entry => {

    // Each entry describes an intersection change for one observed

    // target element:

    //   entry.boundingClientRect

    //   entry.intersectionRatio

    //   entry.intersectionRect

    //   entry.isIntersecting

    //   entry.rootBounds

    //   entry.target

    //   entry.time

  });

};


查看完整回答
反對 回復 2023-09-07
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號