文章目录▼CloseOpen
- Base64到底怎么帮你解决小图片的麻烦?先把原理讲明白
- 从转换到引用:Base64在CSS里的实操技巧,我踩过的坑你别再踩
- 第一步:选对工具,别再用那种转出来字符串巨长的在线工具
- 第二步:引用Base64的格式,错一个字符都不行
- 第三步:这3个细节,直接决定Base64能不能用对
- 第四步:不是所有小图片都适合用Base64,这3个场景千万别碰
- 新手最容易踩的3个坑,我帮你把坑填上
- 坑1:转出来的字符串太大,CSS文件变胖
- 坑2:IE浏览器不显示Base64图片
- 坑3:没考虑缓存,Base64图片不能单独缓存
- 转Base64用什么工具比较靠谱?
- CSS里引用Base64时格式老错,有什么要注意的?
- 是不是所有小图片都能转Base64?哪些场景不能用?
- 转出来的Base64字符串太大,导致CSS变胖怎么办?
- IE浏览器里Base64图片不显示,可能是哪里错了?
- 有的工具转出来的字符串里全是换行符,结果在IE里直接解析失败;
- 有的工具没做“URL安全编码”,转出来的字符串里有
+
、/
这些符号,放到CSS里会被当成特殊字符处理; - 还有的工具转出来的字符串比别的工具长20%,纯粹是浪费空间。
- Sublime Text插件“Base64 Encoder”:直接在编辑器里选图片文件就能转,还能自动去掉换行符,生成“URL安全”的字符串;
- 在线工具“Base64图片转换器”(https://www.base64-image.de/ ,加nofollow):它能帮你先压缩图片再转Base64,比如我上次转一个10KB的png图标,压缩后变成5KB,转成Base64就是6.5KB——比直接转小了一半。
- 别加换行符:有的工具转出来的字符串会自动加换行符,比如:
- 兼容IE的话,别用WebP格式:WebP格式的图片虽然体积小,但IE11及以下不支持WebP的Base64字符串。如果你的项目要兼容IE,老老实实用PNG或JPEG格式。
- 字符串 的=
别漏掉
:Base64的字符串长度必须是4的倍数,不够的话会用=补足。比如转出来的字符串长度是100,不是4的倍数,就要加两个
=——要是漏掉了,浏览器会解析失败。
- 图片大于10KB:转成的字符串会让CSS变胖,拖累加载速度;
- 图片被多个页面引用:比如网站的logo,要是每个页面的CSS都包含这串Base64字符串,会增加重复加载的体积——不如用外部图片加CDN缓存,一次加载,全网站能用;
- 图片经常更新:比如活动海报,每次更新都要改CSS,用户还要重新下载整个CSS文件——不如用外部图片,文件名加个时间戳(比如poster_20240520.png
),浏览器会自动缓存新图片。
- 用TinyPNG(https://tinypng.com/ ,加nofollow)压缩图片——它是“有损压缩”,但对小图标来说,压缩后的质量几乎看不出来差别;
- 把压缩后的图片转成Base64。
这篇文章就来详解CSS里玩转Base64的正确姿势:不仅教你用什么工具快速转换、怎么在CSS中正确引用,更有适配不同场景的技巧——比如小图标该怎么优化编码体积,大图片要不要用Base64;还会扒开新手常踩的坑:比如Base64的体积损耗怎么计算、IE低版本的兼容要点、如何平衡请求数和文件大小。不管你是想优化页面性能,还是解决小图片加载的麻烦,读完这篇就能避开误区,把Base64用对、用好,让CSS图片处理更高效。
做前端这么多年,我最烦的就是处理那些小图标、小背景图——明明就几KB的东西,却要单独发一个HTTP请求,有时候网络慢的时候,页面都加载完了,图标还在那转圈。后来我发现用Base64把图片嵌到CSS里,能解决这个问题,但刚开始用的时候踩了一堆坑:比如转出来的字符串太大,CSS文件直接膨胀了一倍;还有次给客户做的页面,在IE11里背景图居然不显示,查了半天才知道是Base64的编码格式有问题。今天就把我踩过的坑、 的技巧都告诉你,没学过复杂原理也能跟着用,亲测能把小图片的处理效率提上去。
Base64到底怎么帮你解决小图片的麻烦?先把原理讲明白
其实Base64没你想的那么复杂,就是把图片的二进制数据(比如png文件里的那些0和1)转换成一串由字母、数字和符号组成的字符串。这样一来,你不用再把图片当成单独的文件存着,直接把这串字符串写到CSS的background-image
或者content
属性里就行。比如原来你要写background-image: url('icon.png')
,现在改成background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...')
,浏览器看到这串字符,就会自动把它转成原来的图片显示出来。
我最开始用Base64的原因,就是想减少HTTP请求。你知道吗?每个HTTP请求都要和服务器建立连接、发送请求、等待响应,就算是1KB的图片,这个过程也要花个几十毫秒。如果页面上有10个小图标,那就是10次这样的过程,加起来就是几百毫秒——这对手机端用户来说,体验差别特别明显,有时候就因为这几百毫秒,用户可能就关掉页面走了。
但Base64不是万能的,我得先给你打个预防针:它只适合小于10KB的小图片。因为Base64的字符串会比原文件大30%左右(比如10KB的图片转成Base64大概是13KB),如果图片太大,转成的字符串会让CSS文件变得很臃肿,反而拖累页面加载速度。比如我之前把一个20KB的背景图转成Base64,结果CSS文件从50KB变成了70KB,页面加载时间反而变长了,后来赶紧改回了外部图片——这亏我只吃了一次,再也不敢了。
从转换到引用:Base64在CSS里的实操技巧,我踩过的坑你别再踩
第一步:选对工具,别再用那种转出来字符串巨长的在线工具
转Base64的工具很多,但不是所有工具都好用。我之前踩过的坑你可别再踩:
现在我固定用两个工具,亲测好用:
第二步:引用Base64的格式,错一个字符都不行
引用Base64的格式就像是“密码”,错一个字符浏览器都不认。我把常用的图片格式对应的“密码”整理成了表格,你直接照着用就行:
图片格式 | Base64完整前缀 | 适用场景 |
---|---|---|
PNG(透明) | data:image/png;base64, | 图标、按钮背景 |
JPEG(不透明) | data:image/jpeg;base64, | 背景图、照片 |
SVG(矢量) | data:image/svg+xml;base64, | 可缩放图标、图形 |
我之前犯过一个低级错误:把JPEG的前缀写成了data:image/jpg;base64,
(注意是jpeg不是jpg),结果在Chrome里没问题,IE11里直接不显示——查了MSDN的文档才知道,IE浏览器只认jpeg
这个后缀,不认jpg
。你说坑不坑?
第三步:这3个细节,直接决定Base64能不能用对
css
background-image: url(‘data:image/png;base64,
iVBORw0KGgoAAAANSUhEUgAA…’);
结果在IE里直接“罢工”——IE浏览器不支持带换行符的Base64字符串。转的时候一定要选“不换行”的选项,或者手动删掉换行符。
第四步:不是所有小图片都适合用Base64,这3个场景千万别碰
我得再给你敲敲警钟:Base64不是“银弹”,这3个场景用了反而麻烦:
比如我朋友的美食博客,里面的“推荐”图标是固定的(5KB),我就把它转成Base64嵌到CSS里——每个页面的HTTP请求数减少了1个,加载速度快了一点;但他的“每日特价”海报是每天更新的,我就没敢用Base64,还是用了外部图片——这样每天更新只要换图片文件就行,不用改CSS,用户也不用重新下载CSS。
新手最容易踩的3个坑,我帮你把坑填上
坑1:转出来的字符串太大,CSS文件变胖
解决方法超简单:先压缩图片再转Base64。我现在处理小图片的流程是:
比如原来10KB的png图标,压缩后变成5KB,转成Base64就是6.5KB——比直接转小了一半。我用这个方法处理了上百个小图标,从来没遇到过用户说“图标模糊”的情况。
坑2:IE浏览器不显示Base64图片
除了前面说的换行符、格式问题,还有个隐藏的坑:Base64字符串的长度不能太长。IE11对CSS里的url()属性有长度限制——超过32768个字符就会解析失败。比如一个20KB的图片转成Base64大概是26KB,也就是26000多个字符,刚好在限制内;但要是30KB的图片,转成的字符串就会超过限制,IE直接不显示。
坑3:没考虑缓存,Base64图片不能单独缓存
原来的外部图片可以被浏览器缓存,下次访问的时候不用再下载;但Base64嵌在CSS里,只要CSS文件没变,浏览器就会重新加载整个CSS——包括里面的Base64字符串。
比如你有个图标是固定的,不会经常变,用Base64没问题;但要是图标经常更新,比如每周换一次,用Base64就会很麻烦——每次更新都要改CSS,用户还要重新下载整个CSS文件。这时候不如用外部图片,浏览器能缓存旧图片,更新的时候换个文件名就行。
我想对你说:Base64是个解决小图片问题的好工具,但一定要“对症下药”——用对场景、用对方法。我 你先从小图标开始试,比如把页面上的“返回顶部”图标、“收藏”图标转成Base64,看看加载速度有没有提升。
要是你按这些方法试了,欢迎回来告诉我效果!比如页面的HTTP请求数减少了多少,加载时间快了多少——我等着你的好消息~要是遇到什么问题,比如转出来的字符串不对,或者浏览器不显示,也可以留言问我,我帮你看看。
转Base64用什么工具比较靠谱?
我之前踩过不少工具的坑,有的转出来的字符串带换行符,结果IE直接解析失败;有的没做URL安全编码,转出来的+、/符号在CSS里会出问题;还有的转出来的字符串比别人长20%。现在固定用两个:一个是Sublime Text的“Base64 Encoder”插件,直接在编辑器里选图片就能转,自动去换行符还能生成安全字符串;另一个是在线工具“Base64图片转换器”(加nofollow),它能先压缩图片再转,比如10KB的png压到5KB,转出来的字符串小很多,亲测好用。
CSS里引用Base64时格式老错,有什么要注意的?
首先得记对前缀,比如PNG是“data:image/png;base64,”,JPEG得写“jpeg”不能写“jpg”(IE只认jpeg);然后字符串里别加换行符,IE不支持带换行的Base64;最后 的“=”别漏掉,Base64长度得是4的倍数,不够就得用=补足,漏了浏览器会解析失败。我之前就因为把jpeg写成jpg,结果IE11里背景图不显示,查了半天才找到问题。
是不是所有小图片都能转Base64?哪些场景不能用?
真不是,这三个场景用了反而麻烦:第一是图片大于10KB,转出来的字符串比原文件大30%,会让CSS变胖拖累加载速度;第二是图片被多个页面引用,比如网站logo,每个页面CSS都带一遍Base64,重复占体积,不如用外部图片加CDN缓存;第三是图片经常更新,比如每日特价海报,改Base64得频繁改CSS,用户还要重新下载整个CSS,不如用外部图片加时间戳(比如poster_20240520.png),浏览器自动缓存新图。
转出来的Base64字符串太大,导致CSS变胖怎么办?
解决方法超简单:先压缩图片再转!我现在处理小图片的流程是先用TinyPNG(加nofollow)压缩——它是有损压缩,但小图标压缩后质量几乎看不出来,比如10KB的png压到5KB,再转Base64就只有6.5KB,比直接转小一半。我用这个方法处理了上百个图标,从来没用户说“图标模糊”,还能省不少CSS空间。
IE浏览器里Base64图片不显示,可能是哪里错了?
我之前遇到过好几次,主要是这三个原因:一是字符串里有换行符,IE不支持带换行的Base64,得手动删掉;二是JPEG格式的前缀写成了“jpg”,IE只认“jpeg”;三是字符串太长,IE11对CSS里的Base64长度限制是32768个字符,超过就解析失败——比如30KB的图片转出来的字符串就会超,这时候得换成外部图片。你可以先检查这三点,基本能解决问题。