使用純JavaScript的圖像延遲加載

應(yīng)用程序大小和文件請(qǐng)求的一半用于加載圖像稚矿。如果您想使應(yīng)用程序更快掏熬,更輕便,那么考慮圖像優(yōu)化是一個(gè)很好的起點(diǎn)奶栖。

您可以通過延遲加載圖像來加快應(yīng)用程序的速度匹表。僅當(dāng)它們出現(xiàn)在設(shè)備的視口中或附近時(shí)才顯示它們门坷。可以使用Intersection Observer API來完成袍镀。

Intersection Observer

它是一種性能API默蚌,可在元素進(jìn)入或離開視口時(shí)通知您。在隱藏或顯示元素時(shí)獲取信息非常有用苇羡。您可以將其用于分析绸吸,以通過查看當(dāng)前元素來跟蹤用戶花費(fèi)了多少時(shí)間,可以在視頻到達(dá)視圖中的特定點(diǎn)時(shí)開始或停止視頻设江,或者在滾動(dòng)到底部時(shí)加載更多內(nèi)容(例如圖像)頁面的锦茁。
Intersection Observer是跟蹤滾動(dòng)事件的非常有效且完美的工具。

要使用Intersection Observer叉存,我們調(diào)用構(gòu)造函數(shù)并傳遞一個(gè)回調(diào)函數(shù)码俩。該回調(diào)將在觀察到的每個(gè)元素上運(yùn)行。為了觀察特定的元素歼捏,我們選擇它們并observe在每個(gè)元素上調(diào)用方法:

<head>
    <style>
        .box {
            border: 1px solid;
            height: 400px;
            width: 500px;
        }
    </style>
</head>

<body>
    <div class="box">1</div>
    <div class="box">2</div>
    <div class="box">3</div>
    <div class="box">4</div>

    <script>
        const io = new IntersectionObserver((entries) =>
            entries.forEach((entry) =>
                console.log(
                    entry.target.innerText + " entered the view: " + entry.isIntersecting
                )
            )
        );

        document.querySelectorAll(".box").forEach((element) => io.observe(element));
    </script>
</body>

如果運(yùn)行此代碼并檢查瀏覽器控制臺(tái)稿存,則應(yīng)該看到所有div元素都已注冊(cè),并且在滾動(dòng)頁面時(shí)瞳秽,每個(gè)元素在進(jìn)入和離開視口時(shí)都會(huì)輸出輸出瓣履。

延遲加載圖像

當(dāng)瀏覽器在image標(biāo)簽中檢測(cè)到source屬性時(shí),它將從路徑中下載练俐,解析和渲染袖迎。通過操縱源和數(shù)據(jù)集屬性,我們可以決定何時(shí)顯示圖像腺晾。

延遲加載圖像的想法是:

  • 刪除圖像src屬性或添加占位符
  • 將源鏈接放在dataset屬性中
  • 在圖像上調(diào)用 intersection observer
  • 當(dāng)檢測(cè)到相交時(shí)燕锥,從數(shù)據(jù)集中獲取源并將其放置在 src

數(shù)據(jù)集屬性是存儲(chǔ)其他信息以供以后訪問的理想位置。通過將實(shí)際的圖像路徑放在中data-src悯蝉,然后選擇它并將其設(shè)置為src屬性脯宿,我們將加載圖像。

<body>
    <img class="lazy" data-src="lazy-image.jpg">
    <img class="lazy" data-src="lazy-image.jpg">
    <img class="lazy" data-src="lazy-image.jpg">

    <script>
        const io = new IntersectionObserver((entries) =>
            entries.forEach((entry) => {
                // set image source only when it is in the viewport
                if (entry.isIntersecting) {
                    const image = entry.target;
                    // setting image source from the dataset
                    image.src = image.dataset.src;

                    // when image is loaded, we do not need to observe it any more
                    io.unobserve(image);
                }
            })
        );

        document.querySelectorAll(".lazy").forEach((element) => io.observe(element));
    </script>
</body>

這是如何僅使用純JavaScript來延遲加載圖像的最簡單示例泉粉。

需要考慮的事情

圖像標(biāo)簽的大小由圖片定義。如果您沒有為其指定尺寸榴芳,或未為該src屬性放置占位符嗡靡,則所有圖像的大小均為0px,并由觀察者立即加載窟感。

Intersection Observer API主要用于所有現(xiàn)代瀏覽器讨彼。但是,如果您需要對(duì)較舊版本的支持柿祈,則應(yīng)使用polyfill哈误。同樣哩至,一個(gè)好的方法是首先檢查瀏覽器是否具有Intersection Observer。如果沒有蜜自,請(qǐng)運(yùn)行后備代碼菩貌。

結(jié)論

使用圖像延遲加載將使頁面更輕,加載時(shí)間更快重荠,瀏覽器資源的使用更少箭阶,并使用戶體驗(yàn)更加愉悅。

參考

Image Lazy-Loading With Pure JavaScript

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末戈鲁,一起剝皮案震驚了整個(gè)濱河市仇参,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婆殿,老刑警劉巖诈乒,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異婆芦,居然都是意外死亡怕磨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門寞缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來癌压,“玉大人,你說我怎么就攤上這事荆陆√步欤” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵被啼,是天一觀的道長帜消。 經(jīng)常有香客問我,道長浓体,這世上最難降的妖魔是什么泡挺? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮命浴,結(jié)果婚禮上娄猫,老公的妹妹穿的比我還像新娘。我一直安慰自己生闲,他們只是感情好媳溺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碍讯,像睡著了一般悬蔽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捉兴,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天蝎困,我揣著相機(jī)與錄音录语,去河邊找鬼。 笑死禾乘,一個(gè)胖子當(dāng)著我的面吹牛澎埠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盖袭,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼失暂,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鳄虱?” 一聲冷哼從身側(cè)響起弟塞,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拙已,沒想到半個(gè)月后决记,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倍踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年系宫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建车。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扩借,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缤至,到底是詐尸還是另有隱情潮罪,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布领斥,位于F島的核電站嫉到,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏月洛。R本人自食惡果不足惜何恶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嚼黔。 院中可真熱鬧细层,春花似錦、人聲如沸唬涧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爵卒。三九已至,卻和暖如春撵彻,著一層夾襖步出監(jiān)牢的瞬間钓株,已是汗流浹背实牡。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轴合,地道東北人创坞。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像受葛,于是被迫代替她去往敵國和親题涨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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