html - 是否可以将所有 SVG 图标合并到一个文件中以实现 HTML 性能?
问题描述
我的公共文件夹中有一堆不同的 SVG 文件。这些 svg 使用image-mask: url(/icon.svg)
属性显示。
如果我只有一个 svg 但我有 20 个不同的图标,这很好。有没有办法将它组合成普通 JPG 图像的精灵之类的东西?
谢谢!
解决方案
您可以查看的一种性能方法是将SVG作为Data URI添加到 CSS 样式表中。
这有一个缺点:
- 它增加了 CSS 样式表的大小
但有以下两个优点:
- 您无需进行服务器往返来收集 SVG
- 当浏览器缓存您的样式表时,所有内联的 Data URI SVG 将与样式表同时被缓存
这几乎肯定会给您带来显着的性能提升。
让我们看看这可能是如何工作的。
这是一个五角星的SVG :
<svg xmlns="http://www.w3.org/2000/svg" width="260" height="245">
<path transform="scale(0.75)" d="m55, 237 74-228 74, 228L9, 96h240" />
</svg>
这是与Data URI相同的SVG:
data:image/svg+xml,%3Csvg%20xmlns="http://www.w3.org/2000/svg"%20width="260"%20height="245"%3E%3Cpath%20transform="scale(0.75)"%20d="m55,237%2074-228%2074,228L9,96h240"%20/%3E%3C/svg%3E
可以看到,在data:image/svg+xml,
前缀之后,Data URI SVG几乎一模一样,除了:
- 尖括号
<
&>
已被替换为%3C
&%3E
百分比代码
最后,这是在下面的 CSS 中运行的Data URI SVG ...
工作示例:
.image-without-mask,
.image-with-mask {
float: left;
width: 200px;
height: 180px;
margin-right: 12px;
}
.image-with-mask {
/* N.B. -webkit- prefix required for Chrome, Edge, Safari and Opera (but not Firefox) */
-webkit-mask-image: url('data:image/svg+xml,%3Csvg%20xmlns="http://www.w3.org/2000/svg"%20width="260"%20height="245"%3E%3Cpath%20transform="scale(0.75)"%20d="m55,237%2074-228%2074,228L9,96h240"%20/%3E%3C/svg%3E');
mask-image: url('data:image/svg+xml,%3Csvg%20xmlns="http://www.w3.org/2000/svg"%20width="260"%20height="245"%3E%3Cpath%20transform="scale(0.75)"%20d="m55,237%2074-228%2074,228L9,96h240"%20/%3E%3C/svg%3E');
}
<img class="image-without-mask" src="https://via.placeholder.com/200x180/0000FF/FFFFFF" />
<img class="image-with-mask" src="https://via.placeholder.com/200x180/0000FF/FFFFFF" />
推荐阅读
- javascript - webpack 3:如何配置 webpack 以防止在由另一个 Web 应用程序加载时与其他包发生冲突?
- android - 在库模块中禁用 Firebase 数据收集?
- machine-learning - 逻辑回归机器学习?
- node.js - promis.all 中每个函数需要多少时间?
- javascript - 如何从多个下拉列表中显示已选择的数据库值的值
- c# - 使用 microsoft DI 创建工厂
- r - R 限制采样
- javascript - React.js 阻塞标头
- git - 从git中的现有分支创建新分支时如何不触发管道?
- node.js - 如何在不刷新应用程序的情况下返回 PUT 请求的结果?