首頁 web前端 html教學 Data URI和MHTML完整解決所有瀏覽器_HTML/Xhtml_網頁製作

Data URI和MHTML完整解決所有瀏覽器_HTML/Xhtml_網頁製作

May 16, 2016 pm 04:42 PM
data uri

Data URI

Data URI 是由 RFC 2397 定義的一種把小文件直接嵌入文件的方案。透過以下語法就可以把小檔案變成指定編碼直接嵌入頁面中:

data:[][;base64],

  1. MIME-type:指定嵌入資料的 MIME。其形式是[type]/[subtype]; parameter,例如png圖片對應的MIME是image/png。 parameter可以用來指定附加的信息,更多情況下是用於指定text/plain和text/htm等的文字編碼方式的charset參數。預設是text/plain;charset=US-ASCII。
  2. base64:聲明後面的資料的編碼是base64的,否則資料必須要用百分號編碼(即對內容進行urlencode)。

在上個世紀HTML4.01引入了Data URI方案 ,到今天為止除了IE6和IE7之外,所有主流瀏覽器都支援,但IE8 Data URI的支援還是有限制的,只支援object(僅是圖片時)、img、input type=image、link和CSS中的URL,且資料量不能大於32K。

優點:

  1. 減少HTTP請求數,沒有了TCP連線消耗和同一網域下瀏覽器的並發數限制。
  2. 對於小檔案會降低頻寬。雖然編碼後資料量會增加,但卻減少了http頭,當http頭的資料量大於檔案編碼的增量,那麼就會降低頻寬。
  3. 對於HTTPS站點,HTTPS和HTTP混用會有安全提示,而HTTPS相對於HTTP來講開銷要大更多,所以Data URI在這方面的優勢更明顯。
  4. 可以把整個多媒體頁面儲存為一個檔案。

缺點

  1. 無法重複利用,同一個文件應用多次同一個內容,則需要重複多次,資料量大量增加,增加了下載時間。
  2. 無法被獨自緩存,所以其包含文件重新載入時,它也要重新載入。
  3. 客戶端需要重新解碼和顯示,增加了點消耗。
  4. 不支援資料壓縮,base64編碼會增加1/3大小,而urlencode後資料量會增加更多。
  5. 不利於安全軟體的過濾,同時也存在一定的安全隱患。

MHTML

MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML)的縮寫,是由RFC 2557定義的把一個多媒體的頁面所有內容都保存到同一個文件解決方案。這個方案是由微軟提出從IE5.0開始支持,另外Opera9.0也開始支持,Safari可以把文件保存為.mht(MHTML文件的後綴)格式,但不支持顯示它。

MHTML和Data URI也比較類似,有更強大的功能和更複雜的語法,並且沒有Data URI中「無法重複利用」的缺點,但MHTML使用起來不夠靈活方便,例如對資源引用的URL在mht檔案中可以是相對位址,否則必須是絕對位址。 hedger在《Cross Browser Base64 Encoded Images Embedded in HTML》針對IE的解決方案使用的是相對路徑就是因為聲明了Content-type:message/rfc822使IE按照MHTML來解析,如果不修改Content -type則需要使用MHTML協議,這個時候必須使用絕對路徑,如《MHTML – when you need data: URIs in IE7 and under》

應用

Data URI和MHTML兩者的配合可以完整的解決所有的主流瀏覽器,它們由於無法被緩存和重複利用的缺陷,所以並不適合直接在頁面中使用,但在CSS和JavaScript文件中對圖片適當地使用有非常大的優越性:

  1. 大幅減少請求數,現在大型網站的CSS引用了大量的圖片資源。
  2. CSS和JavaScript都可以被緩存,間接的實作了資料的快取。
  3. 利用CSS可以解決Data URI的重複利用問題
  4. 告別CSS Sprites,CSS Sprites的出現是為了減少請求數,但它除了帶來在不確定情況下的異常外,CSS Sprites還需要人為的圖片合併,即使有合併工具也依舊必須人為地在如何有效的拼圖上耗費大量的時間,並帶來維護的困難。當你遵循一定的設計原則後,你就可以完全拋棄CSS Sprites來編寫CSS,最後使用工具在上傳到伺服器環節把圖片轉換成Data URI和MHTML,如《利用data-uri合併樣式表和圖片》中用python實現的工具,這可以節省大量的時間。
  5. base64編碼把圖片檔案增加了1/3,Data URI和MHTML同時使用相當於增加了2/3,但CSS和JavaScript可以使用gzip壓縮,其可以節省2/3的資料量,所以使用gzip壓縮後的最終資料量是(1 1/3) * 2 * (1/3) = 8/9,所以最終流量是減少的。

為了方便在CSS中實作Data URI和MHTML,我寫了一個Data URI & MHTML 生成器,你可以看利用其產生Data URI & MHTML應用程式實例

在CSS檔案中使用應用MHTML時URL必須使用絕對路徑,導致非常不靈活,所以可以考慮使用CSS expression來解決(DEMO),例如:

   /*
   http://old9.blogsome.com/2008/10/26/css-expression-reloaded/
   http://dancewithnet.com/2009/07/27/ get-right-url-from-html/
   */
  *background-image:expression(function(ele){
    ele.style.backgroundImage = 'url(mhtml:'          '!03114501408821761.gif)';
  }(this)) 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
nginx location中uri的截取如何實現 nginx location中uri的截取如何實現 May 18, 2023 pm 12:07 PM

說明:location中的root和aliasroot指令只是將搜尋的根設定為root設定的目錄,即不會截斷uri,而是使用原始uri跳轉該目錄下查找文件aias指令則會截斷匹配的uri,然後使用alias設定的路徑加上剩餘的uri作為子路徑進行查找location中的proxy_pass的uri如果proxy_pass的url不帶uri如果尾部是"/",則會截斷匹配的uri如果尾部不是"/",則不會截斷匹配的uri如果proxy_pass的url帶uri

data資料夾裡面是什麼數據 data資料夾裡面是什麼數據 May 05, 2023 pm 04:30 PM

data資料夾裡面是系統及程式的數據,例如軟體的設定和安裝包等,Data資料夾中各個資料夾則代表的是不同類型的資料存放資料夾,無論Data資料指的是檔案名稱Data還是擴充名data,都是系統或程式自訂的資料文件,Data是資料保存的備份類別文件,一般可以用meidaplayer、記事本或word開啟。

Nginx Location指令URI符合規則是什麼 Nginx Location指令URI符合規則是什麼 May 14, 2023 pm 11:58 PM

1.介紹location指令是http模組當中最核心的一項配置,根據預先定義的url匹配規則來接收用戶發送的請求,根據匹配結果,將請求轉發到後台伺服器、非法的請求直接拒絕並返回403、 404、500錯誤處理等。 2.location指令語法location[=|~|~*|^~|@]/uri/{…}或location@name{…}3、uri匹配模式location指令分為兩種匹配模式:1>普通字符串匹配:以=開頭或開頭無引導字元(~)的規則2>正則匹配:以~或~*開頭表示正則匹配,~*

mysql load data亂碼怎麼辦 mysql load data亂碼怎麼辦 Feb 16, 2023 am 10:37 AM

mysql load data亂碼的解決方法:1、找到出現亂碼的SQL語句;2、修改語句為「LOAD DATA LOCAL INFILE "employee.txt" INTO TABLE EMPLOYEE character set utf8;」即可。

xdata和data有哪些差別 xdata和data有哪些差別 Dec 11, 2023 am 11:30 AM

差異有:1、xdata通常指的是自變量,data則指整個資料集;2、xdata主要用於建立資料分析模型,data則用於進行資料分析與統計;3、xdata通常用於迴歸分析、變異數分析、預測建模,data則可使用各種統計方法進行分析;4、xdata通常需要進行資料預處理,data則可以包含完整的原始資料。

URL和URI之間有什麼區別 URL和URI之間有什麼區別 Aug 10, 2023 pm 05:15 PM

URL和URI之間的區別是:1、URI是用來標識互聯網上的資源的字串序列,而URI並不關注資源的位置,而只關注它的標識符;2、URL提供了關於資源在互聯網上位置的詳細信息,而URI是一種更廣義的概念,不僅涵蓋了URL,還包括了用於標識資源的其他形式,如URN;3、URL是URI的一種特殊類型,用於定位互聯網上的資源,而URI則是一種更廣義的標識符,用於唯一地標識和命名資源。

退貨多於銷售:人道愛拼正在成為一場商業災難 退貨多於銷售:人道愛拼正在成為一場商業災難 Aug 08, 2024 pm 01:14 PM

人性化的AI Pin推出後不久,嚴厲的評論顯示,這款AI小工具還沒有做好上市的準備,因為最初宣傳的大多數功能要么無法正常工作,要么根本就缺失,電池壽命也很短。

vue元件中data不能是函數嗎 vue元件中data不能是函數嗎 Dec 19, 2022 pm 05:22 PM

不是,vue元件中data必須是一個函數。 vue中元件是用來重複使用的,為了防止data重複使用,將其定義為函數。 vue元件中的data資料都應該是互相隔離,互不影響的,元件每復用一次,data資料就應該被複製一次,之後,當某一處複用的地方元件內data資料被改變時,其他重複使用地方元件的data資料不受影響,就需要透過data函數傳回一個物件作為元件的狀態。

See all articles