利用CSS、JavaScript及Ajax實現圖片預加載的三大方法

預加載圖片是提高用戶體驗的一個很好方法。圖片預先加載到瀏覽器中,訪問者便可順利地在你的網站上沖浪,并享受到極快的加載速度。這對圖片畫廊及圖片占據很大比例的網站來說十分有利,它保證了圖片快速、無縫地發布,也可幫助用戶在瀏覽你網站內容時獲得更好的用戶體驗。本文將分享三個不同的預加載技術,來增強網站的性能與可用性。

方法一:用CSS和JavaScript實現預加載

實現預加載圖片有很多方法,包括使用CSS、JavaScript及兩者的各種組合。這些技術可根據不同設計場景設計出相應的解決方案,十分高效。

單純使用CSS,可容易、高效地預加載圖片,代碼如下:

#preload-01 { background: url(http://domain.tld/image-01.png) no-repeat -9999px -9999px; }  
#preload-02 { background: url(http://domain.tld/image-02.png) no-repeat -9999px -9999px; }  
#preload-03 { background: url(http://domain.tld/image-03.png) no-repeat -9999px -9999px; }  

將這三個ID選擇器應用到(X)HTML元素中,我們便可通過CSS的background屬性將圖片預加載到屏幕外的背景上。只要這些圖片的路徑保持不變,當它們在Web頁面的其他地方被調用時,瀏覽器就會在渲染過程中使用預加載(緩存)的圖片。簡單、高效,不需要任何JavaScript。

該方法雖然高效,但仍有改進余地。使用該法加載的圖片會同頁面的其他內容一起加載,增加了頁面的整體加載時間。為了解決這個問題,我們增加了一些JavaScript代碼,來推遲預加載的時間,直到頁面加載完畢。代碼如下:

// better image preloading @ <a href="http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/">http://perishablepress.com/press/2009/12/28/3-ways-preload-images-css-javascript-ajax/</a>  
function preloader() {  if (document.getElementById) {  document.getElementById("preload-01").style.background = "url(http://domain.tld/image-01.png) no-repeat -9999px -9999px";  document.getElementById("preload-02").style.background = "url(http://domain.tld/image-02.png) no-repeat -9999px -9999px";  document.getElementById("preload-03").style.background = "url(http://domain.tld/image-03.png) no-repeat -9999px -9999px";  }  
}  
function addLoadEvent(func) {  var oldonload = window.onload;  if (typeof window.onload != 'function') {  window.onload = func;  } else {  window.onload = function() {  if (oldonload) {  oldonload();  }  func();  }  }  
}  
addLoadEvent(preloader);  

在該腳本的第一部分,我們獲取使用類選擇器的元素,并為其設置了background屬性,以預加載不同的圖片。

該腳本的第二部分,我們使用addLoadEvent()函數來延遲preloader()函數的加載時間,直到頁面加載完畢。

如果JavaScript無法在用戶的瀏覽器中正常運行,會發生什么?很簡單,圖片不會被預加載,當頁面調用圖片時,正常顯示即可。

方法二:僅使用JavaScript實現預加載

上述方法有時確實很高效,但我們逐漸發現它在實際實現過程中會耗費太多時間。相反,我更喜歡使用純JavaScript來實現圖片的預加載。下面將提供兩種這樣的預加載方法,它們可以很漂亮地工作于所有現代瀏覽器之上。

JavaScript代碼段1

只需簡單編輯、加載所需要圖片的路徑與名稱即可,很容易實現:

<div class="hidden">  <script type="text/javascript">  <!--//--><![CDATA[//><!--  var images = new Array()  function preload() {  for (i = 0; i < preload.arguments.length; i++) {  images[i] = new Image()  images[i].src = preload.arguments[i]  }  }  preload(  "http://domain.tld/gallery/image-001.jpg",  "http://domain.tld/gallery/image-002.jpg",  "http://domain.tld/gallery/image-003.jpg"  )  //--><!]]>  </script>  
</div>  

該方法尤其適用預加載大量的圖片。我的畫廊網站使用該技術,預加載圖片數量達50多張。將該腳本應用到登錄頁面,只要用戶輸入登錄帳號,大部分畫廊圖片將被預加載。?

JavaScript代碼段2

該方法與上面的方法類似,也可以預加載任意數量的圖片。將下面的腳本添加入任何Web頁中,根據程序指令進行編輯即可。

<div class="hidden">  <script type="text/javascript">  <!--//--><![CDATA[//><!--  if (document.images) {  img1 = new Image();  img2 = new Image();  img3 = new Image();  img1.src = "http://domain.tld/path/to/image-001.gif";  img2.src = "http://domain.tld/path/to/image-002.gif";  img3.src = "http://domain.tld/path/to/image-003.gif";  }  //--><!]]>  </script>  
</div>  

正如所看見,每加載一個圖片都需要創建一個變量,如“img1?=?new?Image();”,及圖片源地址聲明,如“img3.src?=?"../path/to/image-003.gif";”。參考該模式,你可根據需要加載任意多的圖片。

我們又對該方法進行了改進。將該腳本封裝入一個函數中,并使用?addLoadEvent(),延遲預加載時間,直到頁面加載完畢。

function preloader() {  if (document.images) {  var img1 = new Image();  var img2 = new Image();  var img3 = new Image();  img1.src = "http://domain.tld/path/to/image-001.gif";  img2.src = "http://domain.tld/path/to/image-002.gif";  img3.src = "http://domain.tld/path/to/image-003.gif";  }  
}  
function addLoadEvent(func) {  var oldonload = window.onload;  if (typeof window.onload != 'function') {  window.onload = func;  } else {  window.onload = function() {  if (oldonload) {  oldonload();  }  func();  }  }  
}  
addLoadEvent(preloader);  

方法三:使用Ajax實現預加載

上面所給出的方法似乎不夠酷,那現在來看一個使用Ajax實現圖片預加載的方法。該方法利用DOM,不僅僅預加載圖片,還會預加載CSS、JavaScript等相關的東西。使用Ajax,比直接使用JavaScript,優越之處在于JavaScript和CSS的加載不會影響到當前頁面。該方法簡潔、高效。

window.onload = function() {  setTimeout(function() {  // XHR to request a JS and a CSS  var xhr = new XMLHttpRequest();  xhr.open('GET', 'http://domain.tld/preload.js');  xhr.send('');  xhr = new XMLHttpRequest();  xhr.open('GET', 'http://domain.tld/preload.css');  xhr.send('');  // preload image  new Image().src = "http://domain.tld/preload.png";  }, 1000);  
};  

上面代碼預加載了“preload.js”、“preload.css”和“preload.png”。1000毫秒的超時是為了防止腳本掛起,而導致正常頁面出現功能問題。

下面,我們看看如何用JavaScript來實現該加載過程:

window.onload = function() {  setTimeout(function() {  // reference to <head>  var head = document.getElementsByTagName('head')[0];  // a new CSS  var css = document.createElement('link');  css.type = "text/css";  css.rel  = "stylesheet";  css.href = "http://domain.tld/preload.css";  // a new JS  var js  = document.createElement("script");  js.type = "text/javascript";  js.src  = "http://domain.tld/preload.js";  // preload JS and CSS  
        head.appendChild(css);  head.appendChild(js);  // preload image  new Image().src = "http://domain.tld/preload.png";  }, 1000);  };  

這里,我們通過DOM創建三個元素來實現三個文件的預加載。正如上面提到的那樣,使用Ajax,加載文件不會應用到加載頁面上。從這點上看,Ajax方法優越于JavaScript。

轉自:http://www.csdn.net/article/2013-10-15/2817187-3-ways-preload-images-css-javascript-ajax

轉載于:https://www.cnblogs.com/chenjiacheng/p/6867158.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ThinkJS前端搭配vue時的Nginx配置

Thinkjs 作為奇舞團開源的nodejs mvc框架之一&#xff0c;引起了很多NodeJS程序員的親賴。但是其關于靜態文件處理部分支持不夠完善&#xff0c;主要是體現在SPA單頁應用&#xff0c;之前在ThinkJS 2.*版本時寫過一個關于處理單頁應用靜態資源的middleware think-resource-spa,…

SQL疑難雜癥【4 】大量數據查詢的時候避免子查詢

前幾天發現系統變得很慢&#xff0c;在Profiler里面發現有的SQL執行了幾十秒才返回結果&#xff0c;當時的SQL如下&#xff1a; 可以看得出來&#xff0c;在652行用了子查詢&#xff0c;恰巧目標表(QS_WIP)中的記錄數為100000000&#xff0c;通過如下SQL可以得到&#xff1a; S…

2020-11-27

總結各種RGB轉YUV的轉換公式 如果數據位寬都以8位來說.ITU709:允許 0~255之間所有數據 ITU601:只允許 16~235之間數據, 601是SDTV的數據結構&#xff1b; 656是SDTV的interface 709是HDTV的數據結構 &#xff1b;1120是HDTV的interface 最近在學習視頻的顏色空間轉換&#x…

python學習筆記1-基礎語法

1 在3版本中print需要加上括號2 多行語句&#xff1a;用\連接 1 item_one1 2 item_two2 3 item_three3 4 total item_one \ 5 item_two \ 6 item_three 7 print (total) 3 引號   字符串通常在引號中 不管是單引號 雙引號還是三引號   必須保證前后一致…

『原創』一個基于Win CE 5.0的Txt文件閱讀器

最近&#xff0c;拿到一臺親戚送的GPS導航儀&#xff0c;其系統是基于WinCE5.0的&#xff0c;所以我覺得可以寫點小程序上去&#xff0c;上網一搜&#xff0c;還附帶破解方法&#xff0c;把GPS破解后就變成一臺屏幕超大的PDA了&#xff0c;于是我想用它看電子書&#xff0c;無奈…

ARM Cortex-A系列(A53、A57、A73等)處理器性能分類與對比

在如今這個電子產品泛濫的年代&#xff0c;僅僅靠品牌或是外觀已經不足以辨別產品的優劣&#xff0c;其內置的處理器自然也就成為了分辨產品是否高端的標準之一。那么我們今天就不妨好好了解一下近幾年來電子產品中較為主流的RAM處理器。 在這之前讓我們先簡單認識一下處理器的…

批量創建10個系統帳號tianda01-tianda10并設置密碼

#1、添加用戶 useradd tianda01#2、非交互式給密碼 echo "pass"|passwd --stdin tianda#3、01-10 加0思路 (1)echo {00..10}(2)seq -w 10#隨機密碼6種方法 (1)echo $RANDOM | md5sum | cut -c 1-8(2)yum -y install expect mkpasswd -l 12 -d 5 #expect隨機mkpasswd …

DIV常用屬性大全自己整理

一、屬性列表 代碼如下:color : #999999 文字顏色 font-family : 宋體 文字字型 font-size : 10pt 文字大小 font-style:itelic 文字斜體育 font-variant:small-caps 小字體 letter-spacing : 1pt 文字間距 line-height : 200% 設定行高 font-weight:bold 文字粗體 vertical-a…

.NET 3.5 - DLINQ(LINQ to SQL)之面向對象的添加、查詢、更新和刪除

步步為營VS 2008 .NET 3.5(8) - DLINQ(LINQ to SQL)之面向對象的添加、查詢、更新和刪除作者&#xff1a;webabcd介紹以Northwind為示例數據庫&#xff0c;DLINQ(LINQ to SQL)之完全面向對象的添加操作、查詢操作、更新操作和刪除操作示例Sample.aspx <% Page Language&quo…

ARM處理器的分類

對于ARM處理器而言&#xff0c;其目前有Classic系列、Cortex-M系列、Cortex-R系列、Cortex-A系列和Cortex-A50系列5個大類。 Classic系列 該系列處理器由三個子系列組成&#xff1a; ARM7系列&#xff1a;基于ARMv3或ARMv4架構 ARM9系列&#xff1a;基于ARMv5架構 ARM11系列…

Poj 1019

傳送門&#xff1a;http://poj.org/problem?id1019 主要是找數學規律 然后用好pow和log函數&#xff0c;由于數組過大&#xff0c;數組的類型用unsigned 1 #include<iostream>2 #include<cmath>3 using namespace std;4 5 int t;6 int k;7 int n;8 unsigned a[312…

ARM版本系列及家族成員梳理

ARM公司簡介 ARM是Advanced RISC Machines的縮寫&#xff0c;它是一家微處理器行業的知名企業&#xff0c;該企業設計了大量高性能、廉價、耗能低的RISC &#xff08;精簡指令集&#xff09;處理器。 1985年第一個ARM原型在英國劍橋誕生。 公司的特點是只設計芯片&#xff0c…

z-index ie無效

首先來個 解釋了三個原因&#xff1a;http://www.cnblogs.com/hakuci/archive/2011/01/05/1926212.html 我這個還比較特殊 爸爸級別在最底層 遮羞層在中間 兒子最外邊 <div>遮羞層</div> z-index2 <div>爺爺 <div>小爸爸</div> <div>爸…

數據結構與算法問題 AVL二叉平衡樹

AVL樹是帶有平衡條件的二叉查找樹。這個平衡條件必須保持&#xff0c;并且它必須保證樹的深度是O&#xff08;logN&#xff09;。 一棵AVL樹是其每一個節點的左子樹和右子樹的高度最多差1的二叉查找樹。&#xff08;空樹的高度定義為-1&#xff09;。在插入以后。僅僅有那些從插…

tomcat源碼閱讀之StandardHost和StandardEngine

StandardHost及UML類圖&#xff1a; 1、StandardHost類是Host接口的默認實現&#xff1b;其繼承自ContainerBase類&#xff0c;說明他也是一個容器類&#xff0c;既然是容器類&#xff0c;那肯定也有管道對象PipeLine和閥門&#xff0c;其基礎閥門&#xff08;Basic Valve&…

安防監控產業鏈全景梳理

安防行業是隨著現代社會安全需求應運而生的產業&#xff0c;圍繞著視頻監控技術的改革創新&#xff0c;行業從“看得見、看得遠、看得清到看得懂”&#xff0c;一共經歷模擬監控、數字監控、網絡高清監控和智能監控4個階段&#xff0c;每一階段的突破&#xff0c;都由上游技術的…

Vue項目搭建步驟

一&#xff0e; vue-cli初始化1. 全局安裝 vue-cli  npm install --global vue-cli2. 創建一個基于 webpack 模板的新項目  vue init webpack my-project3. 安裝依賴  cd my-project  npm install (換源安裝: npm install --registry https://registry.npm.taobao.org …

Python tutor 簡介

Python tutor 能夠直觀顯示object 引用關系。 網址是 http://www.pythontutor.com/visualize.html 先分享一下我的一個Python tutor&#xff1a; 點我出現神奇&#xff1a; 1&#xff09; 編輯code。 2&#xff09; 運行&#xff0c; 能夠看到以下界面。 這個工具是很酷的&…

提高CSS性能

1、選擇器 了解CSS的查找匹配原理&#xff0c;讓CSS更簡潔、高效使用高效率的CSS選擇器如何使CSS渲染更高效 總結 不要在ID選擇器前使用標簽名 一般寫法&#xff1a;div#divBox 更好寫法&#xff1a;#divBox 解釋&#xff1a; 因為ID選擇器是唯一的&#xff0c;加上div反而增加…

光學鏡頭行業發展現狀及趨勢,智能手機應用領域占比最高

一、光學鏡頭分類 光學鏡頭也叫攝像鏡頭或攝影鏡頭&#xff0c;簡稱鏡頭&#xff0c;其功能就是光學成像。光學鏡頭是光學成像系統中的必備組件&#xff0c;直接影響到成像質量的好壞&#xff0c;影響算法的實現和效果。從結構來看&#xff0c;光學鏡頭一般由精密五金、塑膠零…