482

我正在查看油脂猴用户脚本的来源,并在他们的 css 中注意到以下内容:

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

我可以理解,greasemonkey 脚本希望将它可以在源中捆绑的任何内容,而不是将其托管在服务器上,这很明显。但由于我以前没有见过这种技术,所以我考虑了它的用途,它似乎很有吸引力,原因有很多:

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

考虑到 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.1Kb

  • GZIP编码服务器端

  • 发送到客户端的结果大小(YSLOW 组件测试):59.3Kb

  • 保存发送到客户端浏览器的数据:74.3Kb

不错,但我猜它对于较小的图像的用处会稍微小一些。

更新: Bryan McQuade 是 Google 的一名软件工程师,负责 PageSpeed,他在 ChromeDevSummit 2013 上表示,CSS 中的 data:uris 在他的演讲中被认为是一种渲染阻塞反模式,用于提供关键/最小的 CSS #perfmatters: Instant mobile web apps。请参阅http://developer.chrome.com/devsum​​mit /sessions并记住这一点 -实际幻灯片

4

12 回答 12

169

当您希望单独缓存图像和样式信息时,这不是一个好主意。此外,如果您将大图像或大量图像编码到您的 css 文件中,则浏览器将花费更长的时间来下载文件,而您的站点没有任何样式信息,直到下载完成。对于您不打算经常更改的小图像,如果它是一个很好的解决方案。

至于生成base64编码:

于 2009-07-14T08:36:12.250 回答
55

此答案已过时,不应使用。

1) 2017 年移动设备的平均延迟要快得多。https://opensignal.com/reports/2016/02/usa/state-of-the-mobile-network

2) HTTP2 多路复用 https://http2.github.io/faq/#why-is-http2-multiplexed

绝对应该为移动网站考虑“数据 URI”。通过蜂窝网络进行 HTTP 访问时,每个请求/响应都会产生更高的延迟。因此,在某些用例中,将图像作为数据插入 CSS 或 HTML 模板可能对移动 Web 应用程序有益。您应该根据具体情况来衡量使用情况——我并不是主张应该在移动 Web 应用程序的任何地方使用数据 URI。

请注意,移动浏览器对可缓存文件的总大小有限制。iOS 3.2 的限制非常低(每个文件 25K),但对于较新版本的 Mobile Safari,限制变得更大(100K)。因此,在包含数据 URI 时,请务必注意总文件大小。

http://www.yuiblog.com/blog/2010/06/28/mobile-browser-cache-limits/

于 2011-03-25T17:41:16.330 回答
24

如果您只引用该图像一次,我认为将其嵌入到您的 CSS 文件中没有问题。但是,一旦您使用了多个图像或需要在 CSS 中多次引用它,您可能会考虑使用单个图像映射,然后您可以从中裁剪单个图像(请参阅CSS Sprites)。

于 2009-07-14T08:44:16.837 回答
22

我建议的一件事是拥有两个单独的样式表:一个包含常规样式定义,另一个包含 base64 编码的图像。

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

通过这种方式,您将确保您的常规样式表被尽快下载并应用于文档,同时您还可以从减少的 http-requests 和 data-uris 给您的其他好处中获益。

于 2011-07-07T15:36:23.760 回答
21

在 GZipped 之后,Base64 增加了大约 10% 的图像大小,但这超过了移动设备的好处。由于响应式网页设计有整体趋势,因此强烈推荐。

W3C 还推荐这种方法用于移动设备,如果您在 rails 中使用资产管道,这是压缩 css 时的默认功能

http://www.w3.org/TR/mwabp/#bp-conserve-css-images

于 2012-01-16T08:33:44.207 回答
5

我不同意为非编辑图像创建单独的 CSS 文件的建议。

假设图像用于 UI 目的,它是表示层样式,并且如上所述,如果您正在做移动 UI,将所有样式保存在一个文件中绝对是一个好主意,以便可以缓存一次。

于 2011-08-03T22:31:37.833 回答
3

你可以用 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);
?>

资源

于 2014-01-31T21:22:32.107 回答
3

我试图创建一个 CSS/HTML 分析工具的在线概念:

http://www.motobit.com/util/base64/css-images-to-base64.asp

它可以:

  • 下载和解析 HTML/CSS 文件,提取 href/src/url 元素
  • 检测 URL 上的压缩 (gzip) 和大小数据
  • 比较原始数据大小、base64 数据大小和 gzipped base64 数据大小
  • 将 URL(图像、字体、css、...)转换为 base64 数据 URI 方案。
  • 计算数据 URI 可以节省的请求数

欢迎评论/建议。

安东宁

于 2013-06-24T20:17:41.177 回答
3

就我而言,它允许我应用 CSS 样式表而不必担心复制相关图像,因为它们已经嵌入其中。

于 2011-02-11T14:35:13.800 回答
2

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

称为 Image2base64:https ://github.com/tm-minty/sublime-text-2-image2base64

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

于 2013-07-31T18:15:54.033 回答
0

感谢您提供这里的信息。我发现这种嵌入很有用,尤其适用于移动设备,尤其是在缓存嵌入图像的 css 文件的情况下。

为了让生活更轻松,因为我的文件编辑器本身不能处理这个问题,我为笔记本电脑/台式机编辑工作制作了几个简单的脚本,在这里分享,以防它们对其他人有用。我一直坚持使用 php,因为它直接且非常好地处理这些事情。

在 Windows 8.1 下说---

C:\Users\`your user name`\AppData\Roaming\Microsoft\Windows\SendTo

... 作为管理员,您可以在路径中建立批处理文件的快捷方式。该批处理文件将调用 php (cli) 脚本。

然后,您可以右键单击文件资源管理器中的图像,然后发送到批处理文件。

Ok Adminstartor 请求,然后等待黑色命令 shell 窗口关闭。

然后只需将剪贴板中的结果粘贴到您的文本编辑器中...

<img src="|">

或者

 `background-image : url("|")` 

以下应该适用于其他操作系统。

批处理文件...

rem @echo 0ff
rem Puts 64 encoded version of a file on clipboard
php c:\utils\php\make64Encode.php %1

并在您的路径中使用 php.exe,调用 php (cli) 脚本...

<?php 

function putClipboard($text){
 // Windows 8.1 workaround ...

  file_put_contents("output.txt", $text);

  exec("  clip < output.txt");

}


// somewhat based on http://perishablepress.com/php-encode-decode-data-urls/
// convert image to dataURL

$img_source = $argv[1]; // image path/name
$img_binary = fread(fopen($img_source, "r"), filesize($img_source));
$img_string = base64_encode($img_binary);

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$dataType = finfo_file($finfo, $img_source); 


$build = "data:" . $dataType . ";base64," . $img_string; 

putClipboard(trim($build));

?>
于 2014-03-27T02:48:23.623 回答
0

据我研究,

使用: 1. 当您使用 svg sprite 时。2. 当您的图像尺寸较小时(最大 200mb)。

不要使用: 1. 当你是更大的图像。2. svg 的图标。因为它们已经很好并且在压缩后被压缩了。

于 2017-11-09T12:54:24.687 回答