css - svg中的响应式图像
问题描述
TL; DR:是否可以根据通过img
标签包含的 svg 中的媒体查询加载其他图像?
我生成了一堆 svg 文件,其中包含带有文本和图标的表格。PDF 在语义上将是一个更好的容器,但我需要将此类“文档”保留为图像以进行无缝嵌入/预览,它可能无法解决我的问题。所以这个故事是关于图标的。
我编写了内联样式,其中媒体查询选择了与用户屏幕 DPI 相对应的图标。图标已经捆绑到精灵中,所以我使用pattern/image[xlink:href]
+ fill:url(#id)
。当我将 svg 直接嵌入 HTML(DOM 岛)时,一切都按需要工作。img
但是如果我通过标签(即)嵌入 svg <img src="foo.svg">
,它根本不会加载图标,更不用说显示它们了。
我知道,我可以通过数据 URL 嵌入图标,但是为所有支持的屏幕 dpi 嵌入图标似乎太多了。具有讽刺意味的是,图标是光栅图标,很难矢量化像素艺术,所以我不能为所有 DPI 设置一组图标。
有没有办法让媒体查询选择正确的图标而不嵌入它们?
解决方案
您不能从<img>
标签中使用的 SVG 加载外部文件(或在其他“图像”上下文中使用,如 CSS 背景图像)。出于安全和性能原因,用作图像的 SVG 必须像任何其他图像一样运行——单个文件,没有辅助资源,也没有脚本。
如果您不想使用内联 SVG,您可以考虑嵌入带有<object>
标签的 SVG 文件或<iframe>
. 但是,我建议您实际仔细测试以查看浏览器是否正在下载图像文件,即使它们因为 CSS 而没有使用它们。
推荐阅读
- sql-server - 此报告需要获取每个组件的最后 10 条记录,获取这 10 条记录的平均值,然后将其显示为 1 行/记录
- javascript - 在将新数组传递给同一个函数后,我无法弄清楚如何停止迭代函数中的数组
- css - 如何在带有变量的css中计算模板的'main'元素的'min-height'值
- rust - Rust 编译器目标定义中的 `arch` 字段和 `llvm-target` 字段有什么区别?
- eclipse - 如何在 Xtext (2.24) 悬停中添加图像?
- powerbi - 如何使用度量来确定表格视觉对象重复列出的条目的最早日期,同时保持所有视觉过滤器完好无损?
- node.js - ECS 任务错误
- flutter - 如果有底部导航栏,Flutter PageView 不显示内容
- python - 用户是否调整了 tkinter 窗口的大小
- php - Laravel 8 + MSSQL - ODBC 驱动程序使用我的 Eloquent 类名查询无效列