CSS 规则不适用于 SVG 元素

Posted

技术标签:

【中文标题】CSS 规则不适用于 SVG 元素【英文标题】:CSS rule not for SVG elements 【发布时间】:2022-01-22 04:30:39 【问题描述】:

从没想过我会问一些关于 CSS 的问题,但它就是在这里。当你开发一个小部件时,你不能依赖特定网站的样式表,所以你想要这样的东西:

.xxx-widget * 
  all:revert;

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

<svg xmlns="http://www.w3.org/2000/svg"   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>

恢复所有删除也和 d 属性从 svg 和图标消失。然后我尝试修改还原选择器:

.xxx-widget *:not(svg) 
  all:revert;

上面的 sn-p 不起作用,同时浏览器不认为它是不正确的,并且很多样式都被破坏了。除了 svg 之外,还有什么方法可以为所有内容编写选择器吗?

【问题讨论】:

当然.xxx-widget *:not(svg) 不起作用:svg 中的d 元素是您的小部件的后代,并且它没有标签名称@ 987654329@ - 所以这个选择器适用于它。 另见***.com/questions/69696234/… 【参考方案1】:

有趣的问题。首先,影响 SVG d 属性的 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  viewBox="-4 -4 8 8"
 xmlns="http://www.w3.org/2000/svg" >
 <circle r="2" stroke-></circle>
</svg>

因为历史上 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>

【讨论】:

我们正在为 Firefox 97 中的 SVG 提供 CSS d,所以我们快到了。 @RobertLongson “几乎”就像“接近”或“几乎” :) 很高兴知道!这里:english.stackexchange.com/questions/388998/… Firefox 97 计划于 2022 年 2 月 8 日发布 [1],它确实应该提供 d 属性并将 SVG 路径 d 属性作为表示属性 [2]。 [1]wiki.mozilla.org/Release_Management/Calendar/fx-trains.herokuapp.com/release/?version=97[2]bugzilla.mozilla.org/show_bug.cgi?id=1744599 @myf 也许为not 添加一个示例,这很容易从您的答案&lt;style&gt; @namespace only_svg "http://www.w3.org/2000/svg"; *:not(only_svg|* ) all: revert !important; &lt;/style&gt; 得到【参考方案2】:

<head>
<style>
/* "page" styles */
p  color: red; border: solid; 
svg circle  fill: orange; 
</style>

<style>
 @namespace only_svg "http://www.w3.org/2000/svg";
*:not(only_svg|* )  
 all: revert !important;

</style>
</head>
<body>
<p>
 This text should be black (or in default UA colour),
circle should be orange.
</p>
<svg  viewBox="-4 -4 8 8"
 xmlns="http://www.w3.org/2000/svg" >
 <circle r="4"></circle>
</svg>
</body>

【讨论】:

注意:这是来自***.com/a/70424117/125981 的派生示例,我从中借用了信息,因此我赞成 好吧,虽然这可能更具可读性/可理解性,但我喜欢将隐式命名空间设置为 HTML,然后更好地使用纯 *,因为我认为它更接近 OP 的意图。从技术上讲是的,:not(svg_namespace|*) 正是这样做的,所以它实际上甚至可以匹配来自 MathML 的元素,这肯定是一个超级小众的东西,但我觉得它会以类似的方式影响 SVG 与未命名空间的 * 是为了操作。

以上是关于CSS 规则不适用于 SVG 元素的主要内容,如果未能解决你的问题,请参考以下文章

css 过渡动画不适用于 svg 路径的“d”属性更改

使用 css 定位 svg x/y 坐标不适用于 iOS 设备?

fxFlex 规则不适用于 mat-sidenav

文本对齐:中心不适用于 div 元素

SVG + css3 动画不适用于链接标记

Firefox 开发者工具不适用于 Webpack CSS 源映射