談?wù)処ntersectionObserver懶加載

概念

IntersectionObserver接口(從屬于Intersection Observer API)為開發(fā)者提供了一種可以異步監(jiān)聽目標(biāo)元素與其祖先或視窗(viewport)交叉狀態(tài)的手段蛤育。祖先元素與視窗(viewport)被稱為根(root)揪阶。

這是MDN上給的官方概念挫酿,不用去管它奢讨,我粘出來只是為了顯得專業(yè)點(diǎn)嘛...

重點(diǎn)看這里監(jiān)聽目標(biāo)元素與其祖先或視窗交叉狀態(tài)的手段靠闭,其實(shí)就是觀察一個(gè)元素是否在視窗可見斗埂。

是否可見

可以看到,交叉了就是說明當(dāng)前元素在視窗里叠洗,當(dāng)前就是可見的了甘改。

API

var io = new IntersectionObserver(callback, options)

其實(shí)就是一個(gè)簡(jiǎn)單的構(gòu)造函數(shù)。

以上代碼會(huì)返回一個(gè)IntersectionObserver實(shí)例灭抑,callback是當(dāng)元素的可見性變化時(shí)候的回調(diào)函數(shù)十艾,options是一些配置項(xiàng)(可選)。

我們使用返回的這個(gè)實(shí)例來進(jìn)行一些操作腾节。

io.observe(document.querySelector('img'))  開始觀察忘嫉,接受一個(gè)DOM節(jié)點(diǎn)對(duì)象
io.unobserve(element)   停止觀察 接受一個(gè)element元素
io.disconnect() 關(guān)閉觀察器

options

root

用于觀察的根元素荤牍,默認(rèn)是瀏覽器的視口,也可以指定具體元素榄融,指定元素的時(shí)候用于觀察的元素必須是指定元素的子元素

threshold

用來指定交叉比例参淫,決定什么時(shí)候觸發(fā)回調(diào)函數(shù)救湖,是一個(gè)數(shù)組愧杯,默認(rèn)是[0]

const options = {
    root: null,
    threshold: [0, 0.5, 1]
}
var io = new IntersectionObserver(callback, options)
io.observe(document.querySelector('img'))

上面代碼鞋既,我們指定了交叉比例為0力九,0.5,1邑闺,當(dāng)觀察元素img0%跌前、50%、100%時(shí)候就會(huì)觸發(fā)回調(diào)函數(shù)

rootMargin

用來擴(kuò)大或者縮小視窗的的大小陡舅,使用css的定義方法抵乓,10px 10px 30px 20px表示top、right靶衍、bottom 和 left的值

const options = {
    root: document.querySelector('.box'),
    threshold: [0, 0.5, 1],
    rootMargin: '30px 100px 20px'
}

為了方便理解灾炭,我畫了張圖,如下

options

首先我們來看下圖上的問題颅眶,藍(lán)線是什么呢蜈出?他就是咱們定義的root元素,我們添加了rootMargin屬性涛酗,將視窗的增大了铡原,虛線就是現(xiàn)在的視窗,所以元素現(xiàn)在也就在視窗里面了商叹。

由此可見燕刻,root元素只有在rootMargin為空的時(shí)候才是絕對(duì)的視窗。

說了簡(jiǎn)單的options剖笙,接下來我們看下callback卵洗。

callback

上面我們說到,當(dāng)元素的可見性變化時(shí)枯途,就會(huì)觸發(fā)callback函數(shù)忌怎。

callback函數(shù)會(huì)觸發(fā)兩次,元素進(jìn)入視窗(開始可見時(shí))和元素離開視窗(開始不可見時(shí))都會(huì)觸發(fā)

var io = new IntersectionObserver((entries)=>{
    console.log(entries)
})

io.observe($0)

以上代碼酪夷,請(qǐng)?jiān)赾hrome控制臺(tái)進(jìn)行調(diào)試榴啸,這里我使用了$0選擇了上一次我審查元素的選擇的節(jié)點(diǎn)

運(yùn)行結(jié)果如下

運(yùn)行結(jié)果

我們可以看到callback函數(shù)有個(gè)entries參數(shù),它是個(gè)IntersectionObserverEntry對(duì)象數(shù)組晚岭,接下來我們重點(diǎn)說下IntersectionObserverEntry對(duì)象

IntersectionObserverEntry

IntersectionObserverEntry提供觀察元素的信息鸥印,有七個(gè)屬性。

boundingClientRect 目標(biāo)元素的矩形信息
intersectionRatio 相交區(qū)域和目標(biāo)元素的比例值 intersectionRect/boundingClientRect 不可見時(shí)小于等于0
intersectionRect 目標(biāo)元素和視窗(根)相交的矩形信息 可以稱為相交區(qū)域
isIntersecting 目標(biāo)元素當(dāng)前是否可見 Boolean值 可見為true
rootBounds 根元素的矩形信息,沒有指定根元素就是當(dāng)前視窗的矩形信息
target 觀察的目標(biāo)元素
time 返回一個(gè)記錄從IntersectionObserver的時(shí)間到交叉被觸發(fā)的時(shí)間的時(shí)間戳

上面幾個(gè)矩形信息的關(guān)系如下

關(guān)系.png

?? 劃重點(diǎn)

intersectionRatioisIntersecting是用來判斷元素是否可見的库说,押題咯...

懶加載

好了狂鞋,通過上面一些概念我們大概了解了IntersectionObserver是個(gè)什么東西,接下來我們用它來寫點(diǎn)代碼潜的,寫什么呢骚揍?沒錯(cuò)就是懶加載。

通過IntersectionObserver來實(shí)現(xiàn)懶加載啰挪,就簡(jiǎn)單的多了信不,我們只需要設(shè)置回調(diào),判斷當(dāng)前元素是否可見亡呵,再進(jìn)行渲染操作就行了抽活,而不用去關(guān)心內(nèi)部的計(jì)算。

主要代碼如下

const io = new IntersectionObserver(()=>{ // 實(shí)例化 默認(rèn)基于當(dāng)前視窗
    
})  

let ings = document.querySelectorAll('[data-src]') // 將圖片的真實(shí)url設(shè)置為data-src src屬性為占位圖 元素可見時(shí)候替換src

function callback(entries){  
    entries.forEach((item) => { // 遍歷entries數(shù)組
        if(item.isIntersecting){ // 當(dāng)前元素可見
            item.target.src = item.target.dataset.src  // 替換src
            io.unobserve(item.target)  // 停止觀察當(dāng)前元素 避免不可見時(shí)候再次調(diào)用callback函數(shù)
        }   
    })
}

imgs.forEach((item)=>{  // io.observe接受一個(gè)DOM元素锰什,添加多個(gè)監(jiān)聽 使用forEach
    io.observe(item)
})
    

本想錄制個(gè)GIF圖下硕,使用Recordlt始終上傳不了,誰有好用的GIF圖錄制軟件請(qǐng)推薦個(gè)汁胆,不勝感激梭姓。。

吶沦泌,給你花??

因篇幅有限糊昙,完整代碼請(qǐng)戳github ??

??注意

目前IntersectionObserver是一個(gè)實(shí)驗(yàn)中的功能,請(qǐng)酌情使用谢谦。

兼容性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末释牺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子回挽,更是在濱河造成了極大的恐慌没咙,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千劈,死亡現(xiàn)場(chǎng)離奇詭異祭刚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)墙牌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涡驮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喜滨,你說我怎么就攤上這事捉捅。” “怎么了虽风?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棒口,是天一觀的道長(zhǎng)寄月。 經(jīng)常有香客問我,道長(zhǎng)无牵,這世上最難降的妖魔是什么漾肮? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茎毁,結(jié)果婚禮上克懊,老公的妹妹穿的比我還像新娘。我一直安慰自己充岛,他們只是感情好保檐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崔梗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垒在。 梳的紋絲不亂的頭發(fā)上蒜魄,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音场躯,去河邊找鬼谈为。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踢关,可吹牛的內(nèi)容都是我干的伞鲫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼签舞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秕脓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起儒搭,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吠架,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后搂鲫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傍药,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年魂仍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拐辽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡擦酌,死狀恐怖俱诸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仑氛,我是刑警寧澤乙埃,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布闸英,位于F島的核電站,受9級(jí)特大地震影響介袜,放射性物質(zhì)發(fā)生泄漏甫何。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一遇伞、第九天 我趴在偏房一處隱蔽的房頂上張望辙喂。 院中可真熱鬧,春花似錦鸠珠、人聲如沸巍耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炬太。三九已至,卻和暖如春驯耻,著一層夾襖步出監(jiān)牢的瞬間亲族,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工可缚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎迫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓帘靡,卻偏偏與公主長(zhǎng)得像知给,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子描姚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,672評(píng)論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理涩赢,服務(wù)發(fā)現(xiàn),斷路器轰胁,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案谒主? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 自從有了網(wǎng)紅狗Momo打的廣告后,周清包子鋪的生意爆紅了起來赃阀,吃包子的不僅有人們霎肯,還多了一些寵物,所以周清在...
    0fc085975bd2閱讀 186評(píng)論 0 0
  • 最好的愛情是不會(huì)因?yàn)橐粭l沒有回復(fù)的短信榛斯,一句無心的話观游,一個(gè)無關(guān)緊要的異性朋友而斷言你不愛我,而是當(dāng)你穿過樹林翻過山...
    詩(shī)韻風(fēng)情閱讀 234評(píng)論 0 0