是否有可能为svg元素设置投影使用css3之类的东西
box-shadow: -5px -5px 5px #888;
-webkit-box-shadow: -5px -5px 5px #888;
我看到一些关于使用滤镜效果创建阴影的说明。有单独使用css的例子吗?下面是正确应用cusor样式的工作代码,但没有阴影效果。请帮助我用最少的代码得到阴影效果。
SVG .shadow {
光标:十字丝;
-moz-box-shadow: -5px
-webkit-box-shadow: 5px #888;
盒子阴影:5px #888;
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" viewBox="0 0 120 70">
<矩形类=“影子”x = " 10 " y = " 10 "宽度= " 100 "高度=“50”填补= " # c66 " / >
< / svg >
可能是一种进化,看起来内联css过滤器在元素上工作得很好,在某种程度上。
如前所述,在svg元素中,在类中或内联中声明投影css过滤器是无效的。
但是,至少在Firefox中,使用以下魔法:
在DOM加载后,用javascript内联添加过滤器声明。
// Does not works, with regular dynamic css styling:
shadow0.oninput = () => {
rect1.style.filter = "filter:drop-shadow(0 0 " + shadow0.value + "rem black);"
}
// Okay! Inline styling, appending.
shadow1.oninput = () => {
rect1.style += " ;filter:drop-shadow(0 0 " + shadow1.value + "rem black);"
rect2.style += " ;filter:drop-shadow(0 0 " + shadow1.value + "rem black);"
}
<h2>Firefox only</h2>
<h4>
Does not works!
<input id="shadow0" type="number" min="0" max="100" step="0.1">
| Okay!
<input id="shadow1" type="number" min="0" max="100" step="0.1">
<svg viewBox="0 0 120 70">
<rect id="rect1" x="10" y="10" width="100" height="50" fill="#c66" />
<!-- Inline style declaration does NOT works at svg level, no shadow at loading: -->
<rect id="rect2" x="40" y="30" width="10" height="10" fill="#aaa" style="filter:drop-shadow(0 0 20rem black)" />
</svg>
使用新的CSS过滤器属性。
webkit浏览器、Firefox 34+、Edge支持。
您可以使用这种聚合物,将支持FF < 34, IE6+。
你可以这样使用它:
/* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */
.shadow {
-webkit-filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7));
filter: drop-shadow( 3px 3px 2px rgba(0, 0, 0, .7));
/* Similar syntax to box-shadow */
}
<img src="https://upload.wikimedia.org/wikipedia/commons/c/ce/Star_wars2.svg" alt="" class="shadow" width="200">
<!-- Or -->
<svg class="shadow" ...>
<rect x="10" y="10" width="200" height="100" fill="#bada55" />
</svg>
<!-- Or -->
<svg>
<g fill="none" stroke="#decade" stroke-width="2" transform="scale(2)">
<circle class="shadow" cx="20" cy="20" r="19"/>
<path class="shadow" d="M 20,1 V 39"/>
<path class="shadow" d="M 20,1 V 20" transform="rotate(135, 20, 20)"/>
<path class="shadow" d="M 20,1 V 20" transform="rotate(225, 20, 20)"/>
</g>
</svg>
这种方法与css的box-shadow效果不同,因为它考虑了不透明度,并且没有将阴影效果应用到框上,而是应用到svg元素本身的轮廓上。
注意:这种方法过去只在类单独放在<svg>元素上时有效。您现在可以在内联svg元素上使用它,例如<rect>。
在html5rocks上阅读更多关于css过滤器的内容。
您可以使用drop-shadow() CSS函数和rgba颜色值轻松地为svg元素添加投影效果。通过使用rgba颜色值,你可以改变你的阴影的不透明度。
img.light-shadow {
滤镜:投影(0px 3px 3px rgba(0,0,0,0.4));
}
img.dark-shadow {
滤镜:投影(0px 3px 3px rgba(0,0,0,1));
}
<img class="light-shadow" src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg" />
<img class="dark-shadow" src="https://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-logo.svg" />