大家可能注意到了,網(wǎng)頁上有些圖片的src或css背景圖片的url后面跟了一大串字符,比如:data:image/png;base64, ivborw0kggoaaaansuheugnzvjlywr5ccllpaaaahhjrefueno8zjsoxcambfb/keauffr0cbng3nqpw68arzdalozpppfibhh5eab8b+tlt9myq6i1buqfaq1cksvcxz2acs6406kugpt5/kuvgz5bdcszo99zodczgvt4mjjzmvkqcha68iiepb86gaiov8cdadliuqbs7md3waaaabjru5erkjggg%3d%3d。那么這是什么呢?這是data uri scheme。
data uri scheme是在rfc2397中定義的,目的是將一些小的數(shù)據(jù),直接嵌入到網(wǎng)頁中,從而不用再從外部文件載入。比如上面那串字符,其實(shí)是一張小圖片,將這些字符復(fù)制黏貼到火狐的地址欄中并轉(zhuǎn)到,就能看到它了,一張1x36的白灰png圖片。
在上面的data uri中,data表示取得數(shù)據(jù)的協(xié)定名稱,image/png 是數(shù)據(jù)類型名稱,base64 是數(shù)據(jù)的編碼方法,逗號后面就是這個image/png文件base64編碼后的數(shù)據(jù)。
目前,data uri scheme支持的類型有:
data:,文本數(shù)據(jù)
data:text/plain,文本數(shù)據(jù)
data:text/html,html代碼
data:text/html;base64,base64編碼的html代碼
data:text/css,css代碼
data:text/css;base64,base64編碼的css代碼
data:text/javascript,javascript代碼
data:text/javascript;base64,base64編碼的javascript代碼
data:image/gif;base64,base64編碼的gif圖片數(shù)據(jù)
data:image/png;base64,base64編碼的png圖片數(shù)據(jù)
data:image/jpeg;base64,base64編碼的jpeg圖片數(shù)據(jù)
data:image/x-icon;base64,base64編碼的icon圖片數(shù)據(jù)
base64簡單地說,它把一些 8-bit 數(shù)據(jù)翻譯成標(biāo)準(zhǔn) ascii 字符,網(wǎng)上有很多免費(fèi)的base64 編碼和解碼的工具,在php中可以用函數(shù)base64_encode() 進(jìn)行編碼,如echo base64_encode(file_get_contents(‘wg.png’));
目前,ie8、firfox、chrome、opera瀏覽器都支持這種小文件嵌入。
舉個圖片的例子:
網(wǎng)頁中一張圖片可以這樣顯示:
<img src=“http://www.letuknowit.com/images/wg.png”/>
也可以這樣顯示:
代碼如下:
<img src=“data:image/png;base64,ivborw0kggoaaaansuheugaaaaeaaaakcayaaabidfamaaaagxrfwhrtb2z0d2fyzqbbzg9izsbjbwfnzvjlywr5ccllpaaaahhjrefueno8zjsoxcambfb/keauffr0cbng3nqpw68arzdalozpppfibhh5eab8b+tlt9myq6i1buqfaq1cksvcxz2acs6406kugpt5/lckuvgz5bdcsb13zo99zodczgvt4mjjzmvkqcha68iiepb86gaiov8cdadliuqbs7md3waaaabjru5erkjggg%3d%3d”/>
我們把圖像文件的內(nèi)容直接寫在了html 文件中,這樣做的好處是,節(jié)省了一個http 請求。壞處呢,就是瀏覽器不會緩存這種圖像。大家可以根據(jù)實(shí)際情況進(jìn)行自由取舍。