名稱空間分隔符

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

名稱空間分隔符 (|) 將選擇器與名稱空間分開,用於標識型別選擇器的名稱空間,或指示其不存在。

css
/* Links in the namespace named myNameSpace */
myNameSpace|a {
  font-weight: bold;
}
/* paragraphs in any namespace (including no namespace) */
*|p {
  color: darkblue;
}
/* heading level 2 not in a namespace */
|h2 {
  margin-bottom: 0;
}

型別選擇器通用選擇器允許使用可選的名稱空間元件。當名稱空間已透過@namespace宣告時,可以透過在選擇器前面加上名稱空間名稱,並用名稱空間分隔符 (|) 分隔,來為這些選擇器指定名稱空間。這在處理包含多個名稱空間的文件時非常有用,例如帶有內聯 SVG 或 MathML 的 HTML,或者混合使用多種詞彙表的 XML。

  • ns|h1 - 匹配名稱空間 ns 中的 <h1> 元素
  • *|h1 - 匹配所有 <h1> 元素
  • |h1 - 匹配任何已宣告或隱式名稱空間之外的所有 <h1> 元素

語法

css
namespace|element { style properties }

示例

預設情況下,HTML 或 SVG 元素中的所有元素都具有名稱空間,因為 http://www.w3.org/1999/xhtmlhttp://www.w3.org/2000/svg 名稱空間是隱式的。document.createElementNS 方法(將名稱空間引數設定為空字串)可用於建立沒有名稱空間的元素。

命名名稱空間示例

在此示例中,所有元素都在一個名稱空間中。

HTML

HTML 或 SVG 中未顯式宣告任何名稱空間。

html
<p>This paragraph <a href="#">has a link</a>.</p>

<svg width="400" viewBox="0 0 400 20">
  <a href="#">
    <text x="0" y="15">Link created in SVG</text>
  </a>
</svg>

CSS

CSS 聲明瞭兩個名稱空間,然後為全域性連結 (a)、不在名稱空間中的連結 (|a)、在任何名稱空間或沒有名稱空間中的連結 (*|a),以及兩個不同的命名名稱空間 (svgNamespace|ahtmlNameSpace|a) 分配樣式。

css
@namespace svgNamespace url("http://www.w3.org/2000/svg");
@namespace htmlNameSpace url("http://www.w3.org/1999/xhtml");
/* All `<a>`s in the default namespace, in this case, all `<a>`s */
a {
  font-size: 1.4rem;
}
/* no namespace */
|a {
  text-decoration: wavy overline lime;
  font-weight: bold;
}
/* all namespaces (including no namespace) */
*|a {
  color: red;
  fill: red;
  font-style: italic;
}
/* only the svgNamespace namespace, which is <svg> content */
svgNamespace|a {
  color: green;
  fill: green;
}
/* The htmlNameSpace namespace, which is the HTML document */
htmlNameSpace|a {
  text-decoration-line: line-through;
}

結果

選擇器 |a,即不在名稱空間中的連結,不匹配任何連結。在 HTML 中,http://www.w3.org/1999/xhtml 是隱式的,這意味著所有 HTML 都處於一個名稱空間中,即使沒有明確宣告。在 SVG 中,即使沒有明確設定,http://www.w3.org/2000/svg 名稱空間也是隱式的。這意味著所有內容都至少在一個名稱空間中。

預設名稱空間和無名稱空間

在此示例中,我們使用 JavaScript 建立一個沒有名稱空間的元素並將其附加到文件中。我們透過使用 @namespace 定義未命名的名稱空間,將 SVG 名稱空間設定為預設名稱空間。

注意:如果定義了預設名稱空間或未命名名稱空間,則通用選擇器和型別選擇器僅適用於該名稱空間中的元素。

HTML

HTML 或 SVG 中未顯式宣告任何名稱空間。

html
<p><a href="#">A link</a> in the implied HTML namespace.</p>

<svg width="400" viewBox="0 0 400 20">
  <a href="#">
    <text x="0" y="15">Link created in SVG namespace</text>
  </a>
</svg>

JavaScript

透過 JavaScript,使用 document.createElementNS,我們建立一個沒有名稱空間的錨鏈接,然後附加該連結。

js
// create 'no namespace' anchor
const a = document.createElementNS("", "a");
a.href = "#";
a.appendChild(document.createTextNode("Link created without a namespace"));

document.body.appendChild(a);

CSS

我們使用 @namespace 宣告一個名稱空間。透過省略名稱空間的名稱,@namespace 宣告建立了一個預設名稱空間。

css
/* By omitting a name, this sets SVG as the default namespace */
@namespace url("http://www.w3.org/2000/svg");

/* `<a>` in the default (set to SVG) namespace */
a {
  font-size: 1.4rem;
}

/* `<svg>` and `<p>` in the default (set to SVG) namespace */
svg,
p {
  border: 5px solid gold;
}

/* links outside of any namespace */
|a {
  text-decoration: wavy underline purple;
  font-weight: bold;
}

/* links with any namespace or no namespace */
*|a {
  font-style: italic;
  color: magenta;
  fill: magenta;
}

結果

沒有名稱空間分隔符的選擇器 a,只匹配 SVG <a> 元素,因為 SVG 被設定為預設名稱空間。

沒有名稱空間的選擇器 |a,匹配了透過 JavaScript 定義和附加的 <a>,因為該節點是唯一沒有預設名稱空間的節點。

規範

規範
CSS 名稱空間模組第三級
# 宣告

瀏覽器相容性

另見