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

来源:http://www.cnblogs.com/wswq/archive/2017/01/21/6336573.html
-Advertisement-
Play Games

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


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

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

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

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

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

將這三個ID選擇器應用到(X)HTML元素中,我們便可通過CSS的background屬性將圖片預載入到屏幕外的背景上。只要這些圖片的路徑保持不變,當它們在Web頁面的其他地方被調用時,瀏覽器就會在渲染過程中使用預載入(緩存)的圖片。簡單、高效,不需要任何JavaScript。該方法雖然高效,但仍有改進餘地。使用該法載入的圖片會同頁面的其他內容一起載入,增加了頁面的整體載入時間。為瞭解決這個問題,我們增加了一些JavaScript代碼,來推遲預載入的時間,直到頁面載入完畢。代碼如下:

function preloader() {
        if (document.getElementById) {
                document.getElementById("p1").style.background = "url(image-01.png) no-repeat";
                document.getElementById("p2").style.background = "url(image-02.png) no-repeat";
                document.getElementById("p3").style.background = "url(image-03.png) no-repeat";
        }
}
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

<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>

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

正如所看見,每載入一個圖片都需要創建一個變數,如“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.qdfuns.com/notes/36458/93b1e49cbfc3d30d568b414e242b5aa1.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS的優先順序和繼承問題 ★CSS的衝突,即優先順序 CSS本身的設置可以同時應用多個樣式在同一個元素,此時樣式之間可能出現衝突而達不到用戶所想要的效果。 ★解決CSS衝突的優先順序規則: ● CSS層疊樣式表引入方法的優先順序:內聯式>內嵌式>鏈接式>導入式 ● 在多個外部樣式中,後出現的樣式的優先順序高 ...
  • CSS選擇符 【通配選擇符】 *星號選擇器將匹配頁面里的每一個元素,但我建議你永遠不要再生產代碼中使用它。它給瀏覽器帶來大量不必要的負擔。 *{ margin:0; padding:0; } 【標簽選擇符】(也叫類型選擇符):也就是把html標簽名作為選擇符 demo: ul {} 【id選擇符】: ...
  • HTML5(WEB前端),在2012年及以前,一直處於一種萌芽期的狀態當中,直至2013年才進入行業的成長期。HTML5(WEB前端)在2013和2014年,隨著行業的推動慢慢的增長,直至2015年迎來了行業的大爆發,HTML5迅速被推上舞臺,這個詞語也成了不少人閑談中的常見辭彙。 2016年,泡... ...
  • 1.html 2.css 3.js ...
  • COLPICK是一款非常的輕小,無需圖片就可以實現顏色選擇器的jquery插件,只用 JS 和 CSS 就實現了全部功能,而且非常直觀,類似Photoshop的界面,使用方便。顏色的明暗很容易自定義,整個整個都是用html5+ CSS3實現外觀而,插件只有28 KB,瀏覽器載入速度可以說是非常快的, ...
  • html代碼 js代碼 上傳服務端代碼 "查看博客c 最齊全的上傳文件方法" 附近下載 "上傳文件js" ...
  • 我們經常會需要驗證字元串的格式,比如密碼長度範圍、電子郵件格式、固定電話號碼和手機號碼格式等,這個時候我們經常會需要用到正則表達式。但是正則表達式用起來性能會低一點,所以在需要驗證的時候能不使用正則表達式還是儘量不要使用正則表達式。下麵貼出來我寫的一個驗證類,裡面包含了一些常用的驗證。這些都是服務端 ...
  • https://github.com/jobbole/awesome-javascript-cn http://collect.w3ctrain.com ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...