CSS 规则不适用于 SVG 元素

Pav*_*l K 9 css svg

从来没有想过我会问一些关于 CSS 的问题,但它就是这样。当您开发一个小部件时,您不能依赖特定网站的样式表,因此您需要如下所示的内容:

.xxx-widget * {
  all:revert;
}
Run Code Online (Sandbox Code Playgroud)

但如果你的小部件有 SVG 图标:

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 19 16"><path fill-rule="evenodd" d="M.009 16l18.658-8L.009 0 0 6.222 13.333 8 0 9.778z"></path></svg>
Run Code Online (Sandbox Code Playgroud)

恢复所有也会删除dsvg 中的属性和图标消失。然后我尝试修改恢复选择器:

.xxx-widget *:not(svg) {
  all:revert;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码片段不起作用,同时浏览器不会将其识别为不正确,并且许多样式都被破坏了。有没有什么方法可以为除 svg 之外的所有内容组成选择器?

myf*_*myf 3

有趣的问题。首先,影响 SVGd属性的 CSS(当前)发生在基于 Chromium 的浏览器中。Firefox 尚未跟进。(但对于大多数其他 SVG 属性,CSS 重置会影响它们。)

我会尝试调用 CSS 的神秘知识@namespace

<style>
/* "page" styles */
p {
 color: orange;
 border: darkorange solid;
}
circle {
 fill: orange;
 stroke: darkorange;
}
</style>

<style>
/* "your" styles not affecting SVG */
@namespace "http://www.w3.org/1999/xhtml";
body * {
 all: revert;
}
</style>

<body>

<p>
 This text should be black (or in default UA colour);<br>
 following circle should be orange:
</p>

<svg width="100" viewBox="-4 -4 8 8"
 xmlns="http://www.w3.org/2000/svg" >
 <circle r="2" stroke-width="1"></circle>
</svg>
Run Code Online (Sandbox Code Playgroud)

由于历史上 HTML 和 SVG 仍然拥有不同的命名空间,因此您仍然可以利用它来发挥自己的优势。

更多示例:

<style>
* { /* implicit namespace is not set, so affects both HTML and SVG */ }
</style>

<style>
@namespace "http://www.w3.org/1999/xhtml";
@namespace only_html "http://www.w3.org/1999/xhtml";
@namespace only_svg "http://www.w3.org/2000/svg";
* {
 /* implicit namespace is set to html, so affects only HTML, not SVG */
}
*|* {
 /* affects elements from any namespace */
}
only_html|* {
 /* affects only HTML elements due explicit namespace */
}
only_svg|* {
 /* affects only SVG elements due explicit namespace */
}
</style>
Run Code Online (Sandbox Code Playgroud)

  • 我们正在 Firefox 97 中发布 SVG 的 CSS d,所以我们已经快实现了。 (2认同)