圖片延遲加載方案

圖片延遲加載的原理是什么摄乒?

圖片延遲加載的原理就是先不設(shè)置img的src屬性蛹磺,等合適的時(shí)機(jī)(比如滾動(dòng)卸亮、滑動(dòng)等)再把圖片真實(shí)url放到img的src屬性上叫榕。
過多的圖片會(huì)嚴(yán)重影響網(wǎng)頁(yè)的加載速度党瓮,移動(dòng)網(wǎng)絡(luò)下的流量消耗巨大详炬,延遲加載幾乎是標(biāo)配。

圖片延遲加載的使用場(chǎng)景有哪些寞奸?

  1. 好奇心日?qǐng)?bào)首頁(yè)和列表頁(yè)都有很多固定寬高的圖片呛谜。
  2. 好奇心日?qǐng)?bào)文章詳情頁(yè)的圖片,這些圖片需要自適應(yīng)寬度且保持寬高比(防止頁(yè)面抖動(dòng))枪萄。
固定寬高延遲加載

這個(gè)比較簡(jiǎn)單隐岛,設(shè)置好固定寬高,直接使用最簡(jiǎn)單的延遲加載即可
淘寶mobile首頁(yè)的延遲加載有個(gè)點(diǎn)做得特別好瓷翻,滾動(dòng)結(jié)束后只加載當(dāng)前視窗可見的圖片聚凹,不會(huì)加載滾動(dòng)超過視窗的圖片割坠,也不會(huì)加載還沒滾動(dòng)到的視窗圖片。

非固定寬高的延遲加載

目前大概有兩種方案妒牙,各有優(yōu)劣彼哼,具體看情況使用:
第一種方案使用padding-top或者padding-bottom來實(shí)現(xiàn)固定寬高比。優(yōu)點(diǎn)是純css方案湘今,缺點(diǎn)是html冗余敢朱,對(duì)輸出到第三方不友好

<div style="padding-top:75%">
    <img data-src="" alt="" class="lazyload">
<div>

第二種方案在頁(yè)面初始化階段利用ratio設(shè)置實(shí)際寬高值,優(yōu)點(diǎn)是html干凈摩瞎,對(duì)輸出到第三方友好蔫饰,缺點(diǎn)是依賴js,理論上會(huì)至少抖動(dòng)一次

<img data-src="" alt="" class="lazyload" data-ratio="0.75">
更進(jìn)一步結(jié)合srcset

除了上面說的延遲加載愉豺,我們可以更進(jìn)一步的引入srcset篓吁,通過設(shè)置srcset來保證加載最匹配的圖片,這樣對(duì)于一倍屏蚪拦,二倍屏杖剪,三倍屏來說,可以做到不浪費(fèi)流量且效果最好驰贷。

都有哪些延遲加載開源方案盛嘿?

jquery_lazyload

依賴于jquery

<img class="lazy" data-original="img/example.jpg" width="640" height="480">
// 初始化
$("img.lazy").lazyload();

lazysizes 推薦

原生js,不依賴于jquery/zepto
自動(dòng)監(jiān)測(cè)可能發(fā)生變化的lazyload節(jié)點(diǎn)括袒,不需要額外初始化
支持響應(yīng)式圖片srcset
性能高次兆,改善SEO

// 引入js文件
<script src="lazysizes.min.js" async=""></script>

// 非響應(yīng)式 例子
<img data-src="image.jpg" class="lazyload" />
// 響應(yīng)式 例子,自動(dòng)計(jì)算合適的圖片
<img
    data-sizes="auto"
    data-src="image2.jpg"
    data-srcset="image1.jpg 300w,
    image2.jpg 600w,
    image3.jpg 900w" class="lazyload" />
// iframe 例子
<iframe frameborder="0"
    class="lazyload"
    allowfullscreen=""
    data-src="http://www.youtube.com/embed/ZfV-aYdU4uE">
</iframe>

lazyload

依賴jquery/zepto

<!-- 直接賦予圖片寬高 -->
<img class="lazy" data-original="img/example.jpg" width="640" height="480">
<!-- 或:通過css賦予圖片寬高 -->
<style>
    .lazy{width:640px;height:480px;}
</style>
<img class="lazy" data-original="img/example.jpg">
<!-- 或:自適應(yīng)寬度的圖片樣式(常用于移動(dòng)端) -->
<style>
    .lazy{width:100%;height:0;padding-top:75%;background-size:100%;}
    /* 假設(shè)高寬比為 480:640锹锰,即75%芥炭,并使用背景圖的方式將圖片鋪在padding-top區(qū)域內(nèi)
    (padding的百分比是寬度的百分比而不是高度的,即使是padding-top|padding-bottom) */
</style>
<div class="lazy" data-original="img/example.jpg"><div>
<!-- 請(qǐng)參閱examples/enabled_image_full_width.html -->
<!-- 初始化 -->
$(".lazy").lazyload();

微信如何實(shí)現(xiàn)延遲加載恃慧?

研究了微信延遲加載的代碼园蝠,還解決了一個(gè)問題,那就是常見于移動(dòng)端的自適應(yīng)寬度的延遲加載痢士,即根據(jù)情況具體計(jì)算寬高彪薛。

// 源碼
<img 
    data-s="300,640" 
    data-type="jpeg" 
    data-src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPB2fK6uP13R4RS9Y7fHtk5bUd7A9R9zRyZ1nupW8ZVjHwBiaZUa3SkcPg/0?wx_fmt=jpeg" 
    data-ratio="0.8003597122302158" 
    data-w=""  
/>

// 解析后的代碼
<img 
    data-s="300,640" 
    data-type="jpeg" 
    data-src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPBLbT37dSYzNyhwDTiac0WiaribF0Vt7I3Zd7AG9xXSCUoch61KicnYnfqIw/0?wx_fmt=jpeg" 
    data-ratio="0.8003597122302158" 
    data-w="" 
    src="http://mmbiz.qpic.cn/mmbiz/meG6Vo0MeviaLibiaARRszfMpiaXtejcktPBLbT37dSYzNyhwDTiac0WiaribF0Vt7I3Zd7AG9xXSCUoch61KicnYnfqIw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&retryload=1" 
    style="width: 414px !important; visibility: visible !important; height: 331.349px !important;" 
/>

/* 其中
data-s:表示可選的圖片尺寸大小
data-type:表示圖片類型
data-src:表示圖片鏈接
data-ratio:表示長(zhǎng)寬比
*/

由于源碼是壓縮模式的,做簡(jiǎn)單的猜測(cè)如下:

  1. 對(duì)于延遲加載怠蹂,微信采用的模式和正常的延遲加載的模式類似善延,即用data-src存儲(chǔ)真實(shí)的圖片鏈接
  2. 為了解決移動(dòng)端的自適應(yīng)寬度的問題,微信存儲(chǔ)了長(zhǎng)寬比城侧,然后進(jìn)入頁(yè)面就計(jì)算在不同設(shè)備里的真實(shí)寬高易遣,并設(shè)置在style

其他問題?

  1. 接入第三方平臺(tái)的網(wǎng)頁(yè)怎么處理赞庶?
    由于好奇心日?qǐng)?bào)的文章會(huì)輸出到第三方平臺(tái)训挡,比如今日頭條/一點(diǎn)資訊等平臺(tái)澳骤,這些平臺(tái)對(duì)html都有一定的規(guī)范。這時(shí)候就需要后臺(tái)在輸出之前對(duì)html做一些轉(zhuǎn)換澜薄。
    為了簡(jiǎn)單起見为肮,類似<div class="lazy" data-original="img/example.jpg"><div>的方案不太適合讓后臺(tái)轉(zhuǎn)換,所以微信這種動(dòng)態(tài)計(jì)算方法可以借鑒肤京。
  2. 怎么處理響應(yīng)式圖片颊艳?
    響應(yīng)式圖片能夠根據(jù)當(dāng)前屏幕分辨率加載最匹配的圖片,能夠因地制宜忘分,詳見圖片響應(yīng)式解決方案
  3. 方案有了棋枕,回頭追加一篇具體實(shí)踐踩坑的博文
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妒峦,隨后出現(xiàn)的幾起案子重斑,更是在濱河造成了極大的恐慌,老刑警劉巖肯骇,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窥浪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笛丙,警方通過查閱死者的電腦和手機(jī)漾脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胚鸯,“玉大人骨稿,你說我怎么就攤上這事〗” “怎么了坦冠?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)傲须。 經(jīng)常有香客問我蓝牲,道長(zhǎng),這世上最難降的妖魔是什么泰讽? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮昔期,結(jié)果婚禮上已卸,老公的妹妹穿的比我還像新娘。我一直安慰自己硼一,他們只是感情好累澡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著般贼,像睡著了一般愧哟。 火紅的嫁衣襯著肌膚如雪奥吩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天蕊梧,我揣著相機(jī)與錄音霞赫,去河邊找鬼。 笑死肥矢,一個(gè)胖子當(dāng)著我的面吹牛端衰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播甘改,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼旅东,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了十艾?” 一聲冷哼從身側(cè)響起抵代,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忘嫉,沒想到半個(gè)月后主守,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榄融,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年参淫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧杯。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涎才,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出力九,到底是詐尸還是另有隱情耍铜,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布跌前,位于F島的核電站棕兼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抵乓。R本人自食惡果不足惜伴挚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望灾炭。 院中可真熱鬧茎芋,春花似錦、人聲如沸蜈出。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铡原。三九已至偷厦,卻和暖如春商叹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背只泼。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工剖笙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜妓。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓枯途,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親籍滴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酪夷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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