data uri
data uri 是由 rfc 2397 定义的一种把小文件直接嵌入文档的方案。通过如下语法就可以把小文件变成指定编码直接嵌入到页面中:
data:[<mime-type>][;base64],<data>
在上个世纪 html4.01引入了data uri方案 ,到今天为止除了ie6和ie7之外,所有主流浏览器都支持,但ie8对data uri的支持还是有限制的,只支持object(仅是图片时)、img、input type=image、link和css中的url,且数据量不能大于32k。
优点:
缺点:
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文件中对图片适当地使用有非常大的优越性:
为了方便在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:' +
document.getelementbyid('data-uri-css').getattribute('href',4) +
'!03114501408821761.gif)';
}(this));
新闻热点
疑难解答