国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

原生JS實(shí)現(xiàn)最簡(jiǎn)單的圖片懶加載

villainhr / 2458人閱讀

摘要:原文地址原生實(shí)現(xiàn)最簡(jiǎn)單的圖片懶加載歡迎。什么時(shí)候用懶加載當(dāng)頁(yè)面中需要一次性載入很多圖片的時(shí)候,往往都是需要用懶加載的。屬性是一個(gè)必需的屬性,它規(guī)定在圖像無(wú)法顯示時(shí)的替代文本。假設(shè)來(lái)表示圖片到可視區(qū)域頂部距離并設(shè)來(lái)表示可視區(qū)域的高度。

原文地址:原生JS實(shí)現(xiàn)最簡(jiǎn)單的圖片懶加載

歡迎star。

如果有錯(cuò)誤的地方歡迎指正。

Demo地址:http://axuebin.com/lazyload

照片都是自己拍的哦~

懶加載 什么是懶加載

懶加載其實(shí)就是延遲加載,是一種對(duì)網(wǎng)頁(yè)性能優(yōu)化的方式,比如當(dāng)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,優(yōu)先顯示可視區(qū)域的圖片而不一次性加載所有圖片,當(dāng)需要顯示的時(shí)候再發(fā)送圖片請(qǐng)求,避免打開(kāi)網(wǎng)頁(yè)時(shí)加載過(guò)多資源。

什么時(shí)候用懶加載

當(dāng)頁(yè)面中需要一次性載入很多圖片的時(shí)候,往往都是需要用懶加載的。

懶加載原理

我們都知道HTML中的標(biāo)簽是代表文檔中的一個(gè)圖像。。說(shuō)了個(gè)廢話(huà)。。

標(biāo)簽有一個(gè)屬性是src,用來(lái)表示圖像的URL,當(dāng)這個(gè)屬性的值不為空時(shí),瀏覽器就會(huì)根據(jù)這個(gè)值發(fā)送請(qǐng)求。如果沒(méi)有src屬性,就不會(huì)發(fā)送請(qǐng)求。

嗯?貌似這點(diǎn)可以利用一下?

我先不設(shè)置src,需要的時(shí)候再設(shè)置?

nice,就是這樣。

我們先不給設(shè)置src,把圖片真正的URL放在另一個(gè)屬性data-src中,在需要的時(shí)候也就是圖片進(jìn)入可視區(qū)域的之前,將URL取出放到src中。

實(shí)現(xiàn) HTML結(jié)構(gòu)
loading
loading
loading
loading
loading

仔細(xì)觀察一下,標(biāo)簽此時(shí)是沒(méi)有src屬性的,只有altdata-src屬性。

alt 屬性是一個(gè)必需的屬性,它規(guī)定在圖像無(wú)法顯示時(shí)的替代文本。
data-* 全局屬性:構(gòu)成一類(lèi)名稱(chēng)為自定義數(shù)據(jù)屬性的屬性,可以通過(guò)HTMLElement.dataset來(lái)訪問(wèn)。

如何判斷元素是否在可視區(qū)域 方法一

網(wǎng)上看到好多這種方法,稍微記錄一下。

通過(guò)document.documentElement.clientHeight獲取屏幕可視窗口高度

通過(guò)element.offsetTop獲取元素相對(duì)于文檔頂部的距離

通過(guò)document.documentElement.scrollTop獲取瀏覽器窗口頂部與文檔頂部之間的距離,也就是滾動(dòng)條滾動(dòng)的距離

然后判斷②-③<①是否成立,如果成立,元素就在可視區(qū)域內(nèi)。

方法二(推薦)

通過(guò)getBoundingClientRect()方法來(lái)獲取元素的大小以及位置,MDN上是這樣描述的:

The Element.getBoundingClientRect() method returns the size of an element and its position relative to the viewport.

這個(gè)方法返回一個(gè)名為ClientRectDOMRect對(duì)象,包含了toprightbottonleftwidthheight這些值。

MDN上有這樣一張圖:

可以看出返回的元素位置是相對(duì)于左上角而言的,而不是邊距。

我們思考一下,什么情況下圖片進(jìn)入可視區(qū)域。

假設(shè)const bound = el.getBoundingClientRect();來(lái)表示圖片到可視區(qū)域頂部距離;
并設(shè) const clientHeight = window.innerHeight;來(lái)表示可視區(qū)域的高度。

隨著滾動(dòng)條的向下滾動(dòng),bound.top會(huì)越來(lái)越小,也就是圖片到可視區(qū)域頂部的距離越來(lái)越小,當(dāng)bound.top===clientHeight時(shí),圖片的上沿應(yīng)該是位于可視區(qū)域下沿的位置的臨界點(diǎn),再滾動(dòng)一點(diǎn)點(diǎn),圖片就會(huì)進(jìn)入可視區(qū)域。

也就是說(shuō),在bound.top<=clientHeight時(shí),圖片是在可視區(qū)域內(nèi)的。

我們這樣判斷:

function isInSight(el) {
  const bound = el.getBoundingClientRect();
  const clientHeight = window.innerHeight;
  //如果只考慮向下滾動(dòng)加載
  //const clientWidth = window.innerWeight;
  return bound.top <= clientHeight + 100;
}

這里有個(gè)+100是為了提前加載。

經(jīng)提醒。。這個(gè)方法性能

加載圖片

頁(yè)面打開(kāi)時(shí)需要對(duì)所有圖片進(jìn)行檢查,是否在可視區(qū)域內(nèi),如果是就加載。

function checkImgs() {
  const imgs = document.querySelectorAll(".my-photo");
  Array.from(imgs).forEach(el => {
    if (isInSight(el)) {
      loadImg(el);
    }
  })
}

function loadImg(el) {
  if (!el.src) {
    const source = el.dataset.src;
    el.src = source;
  }
}

這里應(yīng)該是有一個(gè)優(yōu)化的地方,設(shè)一個(gè)標(biāo)識(shí)符標(biāo)識(shí)已經(jīng)加載圖片的index,當(dāng)滾動(dòng)條滾動(dòng)時(shí)就不需要遍歷所有的圖片,只需要遍歷未加載的圖片即可。

函數(shù)節(jié)流

在類(lèi)似于滾動(dòng)條滾動(dòng)等頻繁的DOM操作時(shí),總會(huì)提到“函數(shù)節(jié)流、函數(shù)去抖”。

所謂的函數(shù)節(jié)流,也就是讓一個(gè)函數(shù)不要執(zhí)行的太頻繁,減少一些過(guò)快的調(diào)用來(lái)節(jié)流。

基本步驟:

獲取第一次觸發(fā)事件的時(shí)間戳

獲取第二次觸發(fā)事件的時(shí)間戳

時(shí)間差如果大于某個(gè)閾值就執(zhí)行事件,然后重置第一個(gè)時(shí)間

function throttle(fn, mustRun = 500) {
  const timer = null;
  let previous = null;
  return function() {
    const now = new Date();
    const context = this;
    const args = arguments;
    if (!previous){
      previous = now;
    }
    const remaining = now - previous;
    if (mustRun && remaining >= mustRun) {
      fn.apply(context, args);
      previous = now;
    }
  }
}

這里的mustRun就是調(diào)用函數(shù)的時(shí)間間隔,無(wú)論多么頻繁的調(diào)用fn,只有remaining>=mustRun時(shí)fn才能被執(zhí)行。

實(shí)驗(yàn) 頁(yè)面打開(kāi)時(shí)

可以看出此時(shí)僅僅是加載了img1和img2,其它的img都沒(méi)發(fā)送請(qǐng)求,看看此時(shí)的瀏覽器

第一張圖片是完整的呈現(xiàn)了,第二張圖片剛進(jìn)入可視區(qū)域,后面的就看不到了~

頁(yè)面滾動(dòng)時(shí)

當(dāng)我向下滾動(dòng),此時(shí)瀏覽器是這樣

此時(shí)第二張圖片完全顯示了,而第三張圖片顯示了一點(diǎn)點(diǎn),這時(shí)候我們看看請(qǐng)求情況

img3的請(qǐng)求發(fā)出來(lái),而后面的請(qǐng)求還是沒(méi)發(fā)出~

全部載入時(shí)

當(dāng)滾動(dòng)條滾到最底下時(shí),全部請(qǐng)求都應(yīng)該是發(fā)出的,如圖

完整demo

在這哦:http://axuebin.com/lazyload

原文地址:http://axuebin.com/blog/2017/...

更新 方法三 IntersectionObserver

經(jīng)大佬提醒,發(fā)現(xiàn)了這個(gè)方法

先附上鏈接:

jjc大大:https://github.com/justjavac/the-front-end-knowledge-you-may-dont-know/issues/10

阮一峰大大:http://www.ruanyifeng.com/blog/2016/11/intersectionobserver_api.html

API Sketch for Intersection Observers:https://github.com/WICG/IntersectionObserver

IntersectionObserver可以自動(dòng)觀察元素是否在視口內(nèi)。

var io = new IntersectionObserver(callback, option);
// 開(kāi)始觀察
io.observe(document.getElementById("example"));
// 停止觀察
io.unobserve(element);
// 關(guān)閉觀察器
io.disconnect();

callback的參數(shù)是一個(gè)數(shù)組,每個(gè)數(shù)組都是一個(gè)IntersectionObserverEntry對(duì)象,包括以下屬性:

屬性 描述
time 可見(jiàn)性發(fā)生變化的時(shí)間,單位為毫秒
rootBounds 與getBoundingClientRect()方法的返回值一樣
boundingClientRect 目標(biāo)元素的矩形區(qū)域的信息
intersectionRect 目標(biāo)元素與視口(或根元素)的交叉區(qū)域的信息
intersectionRatio 目標(biāo)元素的可見(jiàn)比例,即intersectionRect占boundingClientRect的比例,完全可見(jiàn)時(shí)為1,完全不可見(jiàn)時(shí)小于等于0
target 被觀察的目標(biāo)元素,是一個(gè) DOM 節(jié)點(diǎn)對(duì)象

我們需要用到intersectionRatio來(lái)判斷是否在可視區(qū)域內(nèi),當(dāng)intersectionRatio > 0 && intersectionRatio <= 1即在可視區(qū)域內(nèi)。

代碼
function checkImgs() {
  const imgs = Array.from(document.querySelectorAll(".my-photo"));
  imgs.forEach(item => io.observe(item));
}

function loadImg(el) {
  if (!el.src) {
    const source = el.dataset.src;
    el.src = source;
  }
}

const io = new IntersectionObserver(ioes => {
  ioes.forEach(ioe => {
    const el = ioe.target;
    const intersectionRatio = ioe.intersectionRatio;
    if (intersectionRatio > 0 && intersectionRatio <= 1) {
      loadImg(el);
    }
    el.onload = el.onerror = () => io.unobserve(el);
  });
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87351.html

相關(guān)文章

  • 原生 JS 實(shí)現(xiàn)簡(jiǎn)單圖片加載

    摘要:什么時(shí)候用懶加載當(dāng)頁(yè)面中需要一次性載入很多圖片的時(shí)候,往往都是需要用懶加載的。屬性是一個(gè)必需的屬性,它規(guī)定在圖像無(wú)法顯示時(shí)的替代文本。假設(shè)來(lái)表示圖片到可視區(qū)域頂部距離并設(shè)來(lái)表示可視區(qū)域的高度。 懶加載什么是懶加載懶加載其實(shí)就是延遲加載,是一種對(duì)網(wǎng)頁(yè)性能優(yōu)化的方式,比如當(dāng)訪問(wèn)一個(gè)頁(yè)面的時(shí)候,優(yōu)先顯示可視區(qū)域的圖片而不一次性加載所有圖片,當(dāng)需要顯示的時(shí)候再發(fā)送圖片請(qǐng)求,避免打開(kāi)網(wǎng)頁(yè)時(shí)加載過(guò)...

    Miracle 評(píng)論0 收藏0
  • 原生JS實(shí)現(xiàn)圖片加載(lazyload)

    摘要:前言圖片懶加載也是比較常見(jiàn)的一種性能優(yōu)化的方法,最近在用做一個(gè)新聞列表的客戶(hù)端時(shí)也用到了,這里就簡(jiǎn)單介紹下實(shí)現(xiàn)原理和部分代碼。,當(dāng)前圖片距離頂部的距離。 前言 ?圖片懶加載也是比較常見(jiàn)的一種性能優(yōu)化的方法,最近在用vue做一個(gè)新聞列表的客戶(hù)端時(shí)也用到了,這里就簡(jiǎn)單介紹下實(shí)現(xiàn)原理和部分代碼。 實(shí)現(xiàn)原理 ?加載頁(yè)面的時(shí)候,圖片一直都是流量大頭,針對(duì)圖片的性能方法也挺多的比如base64、...

    qianfeng 評(píng)論0 收藏0
  • 原生JS實(shí)現(xiàn)圖片加載(lazyload)

    摘要:前言圖片懶加載也是比較常見(jiàn)的一種性能優(yōu)化的方法,最近在用做一個(gè)新聞列表的客戶(hù)端時(shí)也用到了,這里就簡(jiǎn)單介紹下實(shí)現(xiàn)原理和部分代碼。,當(dāng)前圖片距離頂部的距離。 前言 ?圖片懶加載也是比較常見(jiàn)的一種性能優(yōu)化的方法,最近在用vue做一個(gè)新聞列表的客戶(hù)端時(shí)也用到了,這里就簡(jiǎn)單介紹下實(shí)現(xiàn)原理和部分代碼。 實(shí)現(xiàn)原理 ?加載頁(yè)面的時(shí)候,圖片一直都是流量大頭,針對(duì)圖片的性能方法也挺多的比如base64、...

    MangoGoing 評(píng)論0 收藏0
  • 原生JS實(shí)現(xiàn)圖片加載

    摘要:方法返回元素的大小及其相對(duì)于視口的位置。對(duì)象包含了一組用于描述邊框的只讀屬性和,單位為像素。這樣就實(shí)現(xiàn)了圖片的懶加載的簡(jiǎn)單實(shí)現(xiàn),當(dāng)然還可以對(duì)進(jìn)行優(yōu)化等操作,這里不做過(guò)多闡述了。演示地址圖片的懶加載 思路 首先,什么是懶加載,從字面意思就可以簡(jiǎn)單的理解為不到用時(shí)就不去加載,對(duì)于頁(yè)面中的元素,我們可以這樣理解:只有當(dāng)滾動(dòng)頁(yè)面內(nèi)容使得本元素進(jìn)入到瀏覽器視窗時(shí)(或者稍微提前,需給定提前量),我...

    boredream 評(píng)論0 收藏0
  • 原生js實(shí)現(xiàn)瀑布流效果

    摘要:前言最近在整理基礎(chǔ)知識(shí),接觸到了幾個(gè)常用的頁(yè)面特效,其中覺(jué)得用原生實(shí)現(xiàn)瀑布流的案例十分有趣,于是與大家分享一下。瀑布流瀑布流,又稱(chēng)瀑布流式布局。通過(guò)定位的方式是我們實(shí)現(xiàn)瀑布流的最基本的原理,只要我們動(dòng)態(tài)的設(shè)置它的值值,就能讓它排列。 showImg(https://segmentfault.com/img/remote/1460000012621941?w=1052&h=542); 前...

    wangdai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<