Кратко
Скопировано@namespace объявляет пространство имён и (опционально) присваивает ему префикс, чтобы использовать в селекторах вида svg|circle или *|a. Это нужно, когда в документе встречаются элементы из разных XML‑пространств имён: SVG, MathML и т. п.
Пример
Скопировано
<div class="block"> <a class="link" href="#">HTML‑ссылка</a> <svg class="icon" viewBox="0 0 64 24" xmlns="http://www.w3.org/2000/svg"> <a href="#"> <text x="0" y="16">SVG‑ссылка</text> </a> <circle cx="52" cy="12" r="10"/> </svg> <p>Текст</p></div>
<div class="block">
<a class="link" href="#">HTML‑ссылка</a>
<svg class="icon" viewBox="0 0 64 24" xmlns="http://www.w3.org/2000/svg">
<a href="#">
<text x="0" y="16">SVG‑ссылка</text>
</a>
<circle cx="52" cy="12" r="10"/>
</svg>
<p>Текст</p>
</div>
/* Объявляем префикс svg для SVG‑пространства имён */@namespace svg url("http://www.w3.org/2000/svg");/* Любая ссылка из любого пространства имён */*|a { text-decoration: underline; }/* Только SVG‑элементы <a> (внутри <svg>) */svg|a { text-decoration: none; }/* Только SVG‑круги */svg|circle { fill: #2E9AFF; }
/* Объявляем префикс svg для SVG‑пространства имён */
@namespace svg url("http://www.w3.org/2000/svg");
/* Любая ссылка из любого пространства имён */
*|a { text-decoration: underline; }
/* Только SVG‑элементы <a> (внутри <svg>) */
svg|a { text-decoration: none; }
/* Только SVG‑круги */
svg|circle { fill: #2E9AFF; }
Как пишется
СкопированоДирективы @namespace записывают только на верхнем уровне стиля (нельзя вкладывать внутрь правил). Принято располагать их в начале файла — до селекторов, которые используют префиксы.
Варианты объявления:
/* Пространство по умолчанию для селекторов без префикса */@namespace url("http://www.w3.org/1999/xhtml");/* Пространство с префиксом */@namespace svg url("http://www.w3.org/2000/svg");/* Несколько пространств с разными префиксами допускаются */@namespace mml url("http://www.w3.org/1998/Math/MathML");
/* Пространство по умолчанию для селекторов без префикса */
@namespace url("http://www.w3.org/1999/xhtml");
/* Пространство с префиксом */
@namespace svg url("http://www.w3.org/2000/svg");
/* Несколько пространств с разными префиксами допускаются */
@namespace mml url("http://www.w3.org/1998/Math/MathML");
Использование в селекторах:
svg|circle— типовой селектор в указанном пространстве (svg).*|a— элементaв любом пространстве имён.|a— элементaбез пространства имён.
Если префикс не объявлен, селекторы с ним считаются невалидными. Если объявлено «пространство по умолчанию», оно применяется к типовым селекторам без префикса.
Как понять
СкопированоВ HTML‑документах вместе с разметкой часто встраивают SVG/MathML. Такие узлы принадлежат другим пространствам имён, и иногда нужно адресоваться к ним отдельно от HTML‑элементов. @namespace даёт безопасный и явный способ разделять выбор элементов в разных пространствах.
Например, *|a применится сразу к HTML‑ссылкам и к SVG‑ссылкам (узлам <a> в SVG), а svg|a — только к ссылкам внутри SVG.
Подсказки
Скопировано💡 Размещайте @namespace в начале файла до всех селекторов с префиксами.
💡 Для SVG почти всегда используйте url; для HTML — url.
💡 В HTML‑страницах объявление @namespace не обязательно, если вы не используете префиксы в селекторах.
💡 Пространства имён чувствительны к регистру URL.
- Chrome 1, поддерживается
- Edge 12, поддерживается
- Firefox 1, поддерживается
- Safari 1, поддерживается