我正在查看一个greasemonkey用户脚本的源代码,并注意到他们的css中有以下内容:

.even { background: #fff url(data:image/gif;base64,R0lGODlhBgASALMAAOfn5+rq6uvr6+zs7O7u7vHx8fPz8/b29vj4+P39/f///wAAAAAAAAAAAAAAAAAAACwAAAAABgASAAAIMAAVCBxIsKDBgwgTDkzAsKGAhxARSJx4oKJFAxgzFtjIkYDHjwNCigxAsiSAkygDAgA7) repeat-x bottom}

我可以理解greasemonkey脚本想要在源代码中捆绑任何东西,而不是将其托管在服务器上,这是足够明显的。但由于我以前没有见过这种技术,我考虑了它的使用,它似乎很有吸引力,原因有很多:

它将减少页面加载中的HTTP请求数量,从而提高性能 如果没有CDN,那么它将减少通过与图像一起发送的cookie产生的流量 CSS文件可以被缓存 CSS文件可以被gzip压缩

考虑到IE6(例如)在缓存背景图像方面存在问题,这似乎不是最糟糕的主意……

那么,这是一个好还是坏的做法,为什么不使用它,你会使用什么工具来base64编码图像?

更新-测试结果

用图像测试:http://fragged.org/dev/map-shot.jpg - 133.6Kb 测试网址:http://fragged.org/dev/base64.html 专用CSS文件: http://fragged.org/dev/base64.css 178.1 kb GZIP编码服务器端 结果大小发送到客户端(YSLOW 元件测试):59.3Kb 保存发送到客户端浏览器的数据:74.3Kb

很好,但我想对于较小的图像来说,它就不那么有用了。

更新:Bryan McQuade,谷歌的软件工程师,致力于PageSpeed,在2013年ChromeDevSummit上表示,CSS中的data:uris被认为是一种渲染阻塞反模式,用于交付关键/最小的CSS,在他的演讲#perfmatters: Instant mobile web apps中。请访问http://developer.chrome.com/devsummit/sessions,并记住这是实际的幻灯片


当前回答

为Sublime Text 2的用户带来一点,有一个插件,提供了我们在ST中加载图像的base64代码。

调用Image2base64: https://github.com/tm-minty/sublime-text-2-image2base64

PS:永远不要保存插件生成的这个文件,因为它会覆盖文件并销毁。

其他回答

你可以用PHP编码:)

<img src="data:image/gif;base64,<?php echo base64_encode(file_get_contents("feed-icon.gif")); ?>">

Or display in our dynamic CSS.php file:

background: url("data:image/gif;base64,<?php echo base64_encode(file_get_contents("feed-icon.gif")); ?>");

1 That’s sort of a “quick-n-dirty” technique but it works. Here is another encoding method using fopen() instead of file_get_contents():

<?php // convert image to dataURL
$img_source = "feed-icon.gif"; // image path/name
$img_binary = fread(fopen($img_source, "r"), filesize($img_source));
$img_string = base64_encode($img_binary);
?>

我建议使用两个独立的样式表: 一个包含常规样式定义,另一个包含base64编码的图像。

当然,必须在图像样式表之前包含基本样式表。

这样可以确保您的常规样式表被尽快下载并应用到文档中,同时还可以从减少http请求和data-uri提供的其他好处中获益。

据我调查,

使用: 1. 当你使用svg精灵。 2. 当你的图像是一个较小的大小(最大200mb)。

不要使用: 1. 当你是更大的图像。 2. 作为svg的图标。因为他们已经很好,压缩后gzipped。

如果只引用该图像一次,我认为将其嵌入到CSS文件中没有问题。但一旦你使用多个图像或需要在CSS中多次引用它,你可以考虑使用单个图像映射,而不是你可以从中裁剪单个图像(参见CSS精灵)。

为Sublime Text 2的用户带来一点,有一个插件,提供了我们在ST中加载图像的base64代码。

调用Image2base64: https://github.com/tm-minty/sublime-text-2-image2base64

PS:永远不要保存插件生成的这个文件,因为它会覆盖文件并销毁。