第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何在滾動(dòng)時(shí)替換粘性元素?

如何在滾動(dòng)時(shí)替換粘性元素?

語(yǔ)境我正在制作一個(gè)博客網(wǎng)站,我希望有一個(gè)粘性元素,該元素會(huì)隨著用戶(hù)滾動(dòng)而在每個(gè)新的一年和月份進(jìn)行更新。這樣標(biāo)題就會(huì)顯示列出的博客文章的當(dāng)前月份和年份。編碼的時(shí)候,我嘗試用HTML實(shí)現(xiàn)效果,如果不行就用CSS,如果還是不行就用JS。我相信這是一個(gè)很好的做法,因?yàn)樗褂脙?nèi)置功能并減少了所需的計(jì)算資源,但如果您不同意這個(gè)觀點(diǎn),請(qǐng)告訴我。問(wèn)題理想情況下,元素的樣式在“卡住”時(shí)會(huì)發(fā)生變化。為此,我查看了David Walsh 的解決方案,該解決方案使用IntersectionObserver但在添加多個(gè)元素時(shí)會(huì)出現(xiàn)故障。我面臨的主要問(wèn)題是,當(dāng)有多個(gè)條目時(shí),腳本會(huì)將位于窗口底部邊框的元素檢測(cè)為“固定”。代碼這是一個(gè)片段。我還用相同的代碼制作了一個(gè)jsfiddle 。//Essentially putting David Walsh's code in a loopdocument.querySelectorAll(".myElement").forEach((i) => {const observer = new IntersectionObserver(([i]) => i.target.classList.toggle("is-pinned", i.intersectionRatio < 1),{threshold: [1]});observer.observe(i);})#parent {   height: 2000px; }.myElement {  position: sticky;  top: -1px;}/* styles for when the header is in sticky mode. The transition times accentuate the undesired effect */.myElement.is-pinned {  color: red;  transition: color 0.3s, background-color 0.3s;  background-color: orange;}<div id="parent">  <!-- Adding more than one 'hello' element. The br's are here to add vertical space and be longer than the viewport height -->  <br><br><br><br>  <div class="myElement">Hello!</div>    <br><br><br><br>  <div class="myElement">Hello 2!</div>    <br><br><br><br>  <div class="myElement">Hello 3!</div>    <br><br><br><br>  <div class="myElement">Hello 4!</div>    <br><br><br><br>  <div class="myElement">Hello 5!</div>    <br><br><br><br>  <div class="myElement">Hello 6!</div>    <br><br><br><br>  <div class="myElement">Hello 7!</div>    <br><br><br><br>  <div class="myElement">Hello 8!</div></div>
查看完整描述

2 回答

?
開(kāi)心每一天1111

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊

首先,你只需要一個(gè)?IntersectionObserver。只要您需要相同的回調(diào)和選項(xiàng)(在本例中就是如此),您就可以observe()使用同一個(gè)觀察者來(lái)處理多個(gè)元素。只有您observer.observe(i);需要在循環(huán)內(nèi)。

但是,如果您向上或向下跳轉(zhuǎn)頁(yè)面,則您的單個(gè)觀察者可以同時(shí)調(diào)用多個(gè)條目。因此,您需要循環(huán)所有觀察到的條目。

更重要的是,intersectionRatio不關(guān)心元素在屏幕上的位置。元素在框的頂部和底部都跨越了 100% 可見(jiàn)性閾值。

您只關(guān)心框頂部的元素。該IntersectionObserverEntry對(duì)象還有一個(gè)boundingClientRect屬性可以告訴您該元素現(xiàn)在所在的位置。您可以使用它來(lái)僅切換頂部的元素。

所以你最終會(huì)得到這樣的結(jié)果:

const observer = new IntersectionObserver((entries) => {

? ? for (let i of entries) {

? ? ? ? i.target.classList.toggle(

? ? ? ? ? ? "is-pinned", i.boundingClientRect.y < 0);

? ? }

}, {threshold: [1]});


document.querySelectorAll(".myElement").forEach(i => observer.observe(i));

然而,這仍然給你帶來(lái)了一個(gè)問(wèn)題。在您的示例中,您滾動(dòng)的框足夠長(zhǎng),如果您直接從頂部跳到底部,則會(huì)出現(xiàn)從“框下方可見(jiàn) 0%”到“框頂部可見(jiàn) 99%”的元素。這不會(huì)超過(guò) 100% 閾值,因此 IntersectionObserver 回調(diào)永遠(yuǎn)不會(huì)為這些元素觸發(fā)!這意味著他們沒(méi)有上課is-pinned。


您可以簡(jiǎn)單地向同一個(gè)觀察者添加另一個(gè) 0% 的閾值來(lái)捕獲這些變化:


const observer = new IntersectionObserver((entries) => {

? ? for (let i of entries) {

? ? ? ? i.target.classList.toggle(

? ? ? ? ? ? "is-pinned", i.boundingClientRect.y < 0);

? ? }

}, {threshold: [0, 1]});


document.querySelectorAll(".myElement").forEach(i => observer.observe(i));

現(xiàn)在,從可見(jiàn)到粘性(或反之亦然)的元素和從不可見(jiàn)到粘性(或反之亦然)的元素都會(huì)切換其類(lèi)。


查看完整回答
反對(duì) 回復(fù) 2024-01-18
?
MMMHUHU

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊

你的JS最后一行犯了一個(gè)錯(cuò)誤。將其更改為:


document.querySelectorAll(".myElement").forEach((i) => {

  const observer = new IntersectionObserver(

  ([i]) => i.target.classList.toggle("is-pinned", i.intersectionRatio < 1), {

    threshold: [1]

  });

  observer.observe(document.querySelector(".myElement")); // Use the element instead!

})


查看完整回答
反對(duì) 回復(fù) 2024-01-18
  • 2 回答
  • 0 關(guān)注
  • 168 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)