javascript - SVG 过滤器:仅适用于 Chrome,不适用于其他浏览器
问题描述
此处错误的简单演示:https ://codepen.io/mknepprath/pen/mKeObo
在 Chrome 中打开以查看它的外观。
问题:
- 在 Safari 中,过滤器似乎不适用或仅部分适用......它是不同的。
- 在 Firefox 中,什么都没有显示 - 它似乎隐藏了过滤器和过滤器应用到的 div。
我如何让它在浏览器中始终如一地工作?
html:
<svg class='a'>
<defs>
<filter id='hey'>
<feColorMatrix
type='matrix'
result='darken'
x='0'
y='0'
width='200px'
height='100px'
values='.2 .05 .05 0 .35
.05 .2 .05 0 .35
.05 .05 .2 0 .35
0 0 0 1 0'
/>
<feColorMatrix
type='matrix'
result='node'
x='0'
y='0'
width='200px'
height='100px'
values='1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0'
/>
<feMerge>
<feMergeNode in='darken' />
<feMergeNode in='node' />
</feMerge>
</filter>
</defs>
</svg>
<div class='b' style='filter: url(#hey)'></div>
CSS:
.a {
display: none;
}
.b {
width: 200px;
height: 100px;
background: peachpuff;
}
解决方案
Chrome 接受错误的语法并试图充分利用它,而 Firefox 通常不会。
- 使用 display:none 将 SVG 从 DOM 中取出,因此 CSS 无法再找到样式。使 SVG 大小为零,将其放在您的内容下方或使用可见性:隐藏
- 至少在 SVG 1.1 中,您不应该使用“px”、“em”等来确定过滤器元素的尺寸。(并且不需要调整 feColorMatrixes 的大小 - 默认情况下会自动计算大小。)
.a {
width: 0;
height: 0;
}
.b {
width: 200px;
height: 100px;
background: peachpuff;
}
<svg class="a">
<defs>
<filter id="hey">
<feColorMatrix
type="matrix"
result="darken"
values=".2 .05 .05 0 .35
.05 .2 .05 0 .35
.05 .05 .2 0 .35
0 0 0 1 0"
/>
<feColorMatrix
type="matrix"
result="node"
values="1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0"
/>
<feMerge>
<feMergeNode in="darken" />
<feMergeNode in="node" />
</feMerge>
</filter>
</defs>
</svg>
<div class="b" style="filter: url(#hey)"></div>
推荐阅读
- java - Java 8 流 - 将方法传递给过滤器
- docker - 如何在 Docker Toolbox 中访问容器服务器
- python - 我不断收到此错误:第 57 行列表索引超出范围
- php - 在 php 中如何调用或链接另一个 php 页面?
- python - 以相同的方式写入具有多个列表和字典的文件
- c# - 如何获取已存在于 input.txt 文件中的数据并使用字典 C# 找到最高薪水
- tensorflow - 关于 tensorflow 教程“model()”与“model.predict()”的问题
- node.js - 使用 Object.keys 渲染变量,多个 Object.keys 循环 reactjs
- python - 在 for 循环中直接调用 SeqIO.parse() 有效,但事先单独使用它不是吗?为什么?
- arrays - 在 Armv8 Assembly 中访问和修改数组