Страницы

Поиск по вопросам

вторник, 23 октября 2018 г.

Что понимается под пространством имён в спецификации HTML5?

Выдержка из спецификации:
In HTML documents, elements in the HTML namespace may have an xmlns attribute specified, if, and only if, it has the exact value "http://www.w3.org/1999/xhtml". This does not apply to XML documents.
Переводится примерно: "В HTML документах элементы в HTML-пространстве имён могут иметь атрибут xmlns, если он имеет точное значение "http://www.w3.org/1999/xhtml". "
И тут я понял, что вообще ничего не понимаю. Я думал, что для html нет понятия пространство имен.
Ссылка HTML пространство имен в спецификации ведет на список:
Пространство имён HTML это: http://www.w3.org/1999/xhtml Пространство имён MathML это: http://www.w3.org/1998/Math/MathML Пространство имён SVG это: http://www.w3.org/2000/svg Пространство имён XLink это: http://www.w3.org/1999/xlink Пространство имён XML это: http://www.w3.org/XML/1998/namespace Пространство имён XMLNS: http://www.w3.org/2000/xmlns/
И я совсем не могу понять, что такое имеется ввиду под пространством имен в данной спецификации? Пространство имен html ведет вообще на xhtml спецификацию. Причем тут html5 и xhtml? И как это связано с пространством имен?
Что значит фраза "элементы в HTML-пространстве имён могут иметь атрибут xmlns"? В html пространстве имен это где? И как работает этот атрибут в html5?


Ответ

Про атрибут xmlns
По поводу xmlns, в том же тексте, сразу после приведённой в вопросе цитате сказано следующее:
Note: In HTML, the xmlns attribute has absolutely no effect. It is basically a talisman. It is allowed merely to make migration to and from XHTML mildly easier. Заметка: В HTML, xmlns атрибут не имеет никакого эффекта. Это просто талисман. Он лишь позволяет проще выполнить преобразования в и из XHTML документов.
С этим разобрались, xmlns в HTML нам не потребуется. Его конечно можно использовать для HTML-элементов, но это не имеет смысла, так как для всех структур в HTML документе уже есть предустановленные значения "пространства имён", список которых приведён в вопросе, и изменить их на другие значения никто не позволит. Проще говоря, нижепревидённые примеры равнозначны:

А вот так уже не получится, так как xmlns попросту игнорируется, и html всё равно будет располагаться в пространстве имён "http://www.w3.org/1999/xhtml", как было сказано выше.
Про пространство имён
По аналогии с именами классов, пакетов и т.п из языков программирования, пространство имён позволяет отличить один элемент от другого, когда они имеют одинаковое название, но принадлежат разным пространствам имён. Где это может произойти в HTML? Например когда мы используем svg в html:
Ссылка в SVG Ссылка в HTML
И нам потребовалось изменить размер шрифта у ссылки в svg. Просто написать в стилях a { font-size: 1.5em } уже не получится, так как это правило применится и к обычной ссылки тоже. Вот здесь на помощь приходят возможности CSS по работе с пространствами имён. Для этого в CSS выполним такие действия:
1) Используя ключевое слово @namespace указываем наименование "приставки" пространства имён, с каким мы будем иметь дело:
@namespace svg url(http://www.w3.org/2000/svg);
Заметка: адрес пространства имён для SVG взят из спецификации, а вместо svg можно использовать другое наименование.
2) Теперь с помощью приставки svg можно обратиться непосредственно к метке , которая расположена в , с помощью специального синтаксиса CSS:
svg|a { font-size: 1.5em; }
Итог
Атрибут xmlns в HTML не нужен. Спецификация за нас определила названия пространств имён для конкретных структур HTML, XML, SVG и их элементов. Для того чтобы в CSS получить доступ к конкретному элементу с использованием пространства имён необходимо использовать форму namespace|css-selector, предварительно дав наименование для пространства имён с помощью @namespace.

Комментариев нет:

Отправить комментарий