このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

名前空間区切り文字

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2015年7月⁩.

名前空間区切り文字 (|) は、セレクターと名前空間を区切り、要素型セレクターの名前空間を識別したり、存在しないこと識別したりします。

css
/* myNameSpace という名前空間内のリンク */
myNameSpace|a {
  font-weight: bold;
}
/* 任意の名前空間の段落(名前空間なしも含む) */
*|p {
  color: darkblue;
}
/* 名前空間のないレベル 2 の見出し */
|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/xhtml および http://www.w3.org/2000/svg 名前空間が暗黙的に指定されているため、名前空間を持っています。 document.createElementNS メソッドを呼び出すとき、名前空間の引数に空文字列を指定すると、名前空間のない要素を作成することができます。

名前付きの名前空間の例

この例では、すべての要素は名前空間内にあります。

HTML

HTML および SVG では、名前空間は明示的に宣言されていません。

html
<p>この段落には<a href="#">リンクがあります</a>。</p>

<svg width="400" viewBox="0 0 400 20">
  <a href="#">
    <text x="0" y="15">SVG で作成されたリンク</text>
  </a>
</svg>

CSS

CSS は 2 つの名前空間を宣言し、リンク全体 (a)、名前空間のないリンク (|a)、名前空間のあるリンクまたは名前空間のないリンク (*|a)、そして 2 つの異なる名前付き名前空間(svgNamespace|a および htmlNameSpace|a)にスタイルを割り当てます。

css
@namespace svgNamespace url("http://www.w3.org/2000/svg");
@namespace htmlNameSpace url("http://www.w3.org/1999/xhtml");
/* 既定の名前空間に存在するすべての `<a>`、この場合はすべての `<a>` */
a {
  font-size: 1.4rem;
}
/* 名前空間なし */
|a {
  text-decoration: wavy overline lime;
  font-weight: bold;
}
/* すべての名前空間(名前空間を含まないものも含む) */
*|a {
  color: red;
  fill: red;
  font-style: italic;
}
/* svgNamespace 名前空間のみ、これは <svg> コンテンツです */
svgNamespace|a {
  color: green;
  fill: green;
}
/* HTML 文書である htmlNameSpace 名前空間 */
htmlNameSpace|a {
  text-decoration-line: line-through;
}

結果

セレクター |a は、名前空間に含まれていないリンクであり、どのリンクとも一致しません。 HTML では、 http://www.w3.org/1999/xhtml が暗黙的に指定されており、明示的に宣言されていなくても、すべての HTML が名前空間に含まれます。 SVG では、明示的に設定されていなくても、 http://www.w3.org/2000/svg 名前空間も暗黙的に指定されます。これは、すべてのコンテンツが少なくとも 1 つの名前空間内にあることを意味しています。

既定の名前空間および名前空間なし

この例では、 JavaScript を使用して、名前空間のない要素を作成し、それを文書に追加しています。 @namespace を使用して、名前なしの名前空間を既定の名前空間として定義しています。

メモ: 既定の、または名前が指定されていない名前空間が定義されている場合、全称セレクターおよび要素型セレクターはその名前空間内の要素にのみ適用されます。

HTML

HTML および SVG では、名前空間は明示的に宣言されていません。

html
<p>暗黙的に HTML 名前空間に所属する<a href="#">リンク</a></p>

<svg width="400" viewBox="0 0 400 20">
  <a href="#">
    <text x="0" y="15">SVG 名前空間で作成されたリンク</text>
  </a>
</svg>

JavaScript

JavaScript では、 document.createElementNS を使用して、名前空間のないアンカーリンクを作成し、そのリンクを追加します。

js
// 「名前なし」のアンカーを作成
const a = document.createElementNS("", "a");
a.href = "#";
a.appendChild(document.createTextNode("名前空間なしで作られたリンク"));

document.body.appendChild(a);

CSS

@namespace を使用して名前空間を宣言します。名前空間の名前を省略すると、 @namespace 宣言によって既定の名前空間が作成されます。

css
/* 名前を省略すると、SVG を既定の名前空間として設定 */
@namespace url("http://www.w3.org/2000/svg");

/* `<a>` を既定の名前空間(SVG に設定)で */
a {
  font-size: 1.4rem;
}

/* `<svg>` および `<p>` を既定の名前空間(SVG に設定)で */
svg,
p {
  border: 5px solid gold;
}

/* あらゆる名前空間の外のリンク */
|a {
  text-decoration: wavy underline purple;
  font-weight: bold;
}

/* いずれかの名前空間か名前空間なしのリンク */
*|a {
  font-style: italic;
  color: magenta;
  fill: magenta;
}

結果

名前空間区切り文字のないセレクター a は、 SVG が既定の名前空間として設定されているため、 SVG の <a> 要素のみに一致します。

名前空間のないセレクター |a は、 JavaScript で定義されて追加された <a> と一致しました。これは、そのノードが既定の名前空間を持たない唯一のノードであるためです。

仕様書

Specification
CSS Namespaces Module Level 3
# declaration

ブラウザーの互換性

関連情報