@namespace

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

@namespace 是一种 at-rule,用于定义在 CSS 样式表中使用的 XML 命名空间

试一试

@namespace svg url("http://www.w3.org/2000/svg");

a {
  color: orangered;
  text-decoration: underline dashed;
  font-weight: bold;
}

svg|a {
  fill: blueviolet;
  text-decoration: underline solid;
  text-transform: uppercase;
}
<p>
  <a href="#">This is an ordinary HTML link</a>
</p>

<svg width="250px" viewBox="0 0 250 20" xmlns="http://www.w3.org/2000/svg">
  <a href="#">
    <text x="0" y="15">This is a link created in SVG</text>
  </a>
</svg>

语法

css
/* Default namespace */
@namespace url("XML-namespace-URL");
@namespace "XML-namespace-URL";

/* Prefixed namespace */
@namespace prefix url("XML-namespace-URL");
@namespace prefix "XML-namespace-URL";

描述

定义的命名空间可用于将通用类型属性选择器限制为仅选择该命名空间中的元素。@namespace 规则通常只在处理包含多个命名空间的文档时有用,例如带有内联 SVG 或 MathML 的 HTML,或者混合了多个词汇表的 XML。

任何 @namespace 规则都必须遵循所有 @charset@import 规则,并且在样式表中的所有其他 at-rules 和 样式声明之前。

@namespace 可以用来定义样式表的默认命名空间。当定义了默认命名空间时,所有通用和类型选择器(但不包括属性选择器,详见下文注释)都只适用于该命名空间中的元素。

@namespace 规则还可以用来定义一个命名空间前缀。当通用、类型或属性选择器带有命名空间前缀时,该选择器只在元素或属性的命名空间和名称都匹配时才匹配。

在 HTML 中,已知的外部元素会自动分配命名空间。这意味着 HTML 元素的行为就像它们在 XHTML 命名空间(http://www.w3.org/1999/xhtml)中一样,即使文档中没有任何 xmlns 属性,并且<svg><math> 元素将被分配其正确的命名空间(分别为 http://www.w3.org/2000/svghttp://www.w3.org/1998/Math/MathML)。

注意:在 XML 中,除非直接在属性上定义了前缀(例如,xlink:href),否则该属性没有命名空间。换句话说,属性不继承它们所在元素的命名空间。为了匹配这种行为,CSS 中的默认命名空间不适用于属性选择器。

正式语法

@namespace = 
@namespace <namespace-prefix>? [ <string> | <url> ] ;

<namespace-prefix> =
<ident>

示例

指定默认和带前缀的命名空间

css
@namespace url("http://www.w3.org/1999/xhtml");
@namespace svg url("http://www.w3.org/2000/svg");

/* This matches all XHTML <a> elements, as XHTML is the default unprefixed namespace */
a {
}

/* This matches all SVG <a> elements */
svg|a {
}

/* This matches both XHTML and SVG <a> elements */
*|a {
}

规范

规范
CSS 命名空间模块第三级
# 声明

浏览器兼容性

另见