Есть ли тег shadow в HTML: устаревший тег Shadow DOM и тень в CSS

Устаревший тег <shadow> был точкой подстановки в Shadow DOM первой версии. Он нужен был, когда у одного компонента создавали несколько shadow root: тег показывал внутри нового дерева содержимое старого. Браузеры его убрали, и теперь для них это неизвестный тег. Тег парный: закрывающий </shadow> нужен.

Под фразой «тег shadow» часто имеют в виду тень в CSS: box-shadow, text-shadow или drop-shadow(). Все они собраны в таблице ниже. А вместо устаревшего тега используют slot и вложенные компоненты.

HTML
<shadow></shadow>

Тег shadow в HTML: что это за устаревший тег

Shadow DOM прячет часть разметки компонента от остальной страницы. Эту скрытую часть называют shadow root. В первой версии у одного компонента могло быть несколько таких скрытых деревьев, одно над другим. Тег shadow, записанный в новом дереве, показывал на своём месте содержимое старого: так компонент мог дополнить предыдущий, а не заменить его.

У тега нет собственных атрибутов, кроме глобальных. Во второй версии Shadow DOM у компонента остался один shadow root, а передачей содержимого занимается slot. Для вложенных компонентов используют обычную вложенность: внутренний компонент находится в shadow root внешнего.

HTML
<shadow></shadow>

Какие ещё бывают shadow: тень в CSS и Shadow DOM

Слово shadow встречается в нескольких местах HTML и CSS, и ни одно из них не является тегом shadow. Эти значения собраны в таблице ниже. Отдельно есть атрибут shadowrootmode у template: он создаёт shadow root прямо в разметке.

Где встречаетсяЧто этоПример
box-shadowсвойство CSS: тень вокруг блокаbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
text-shadowсвойство CSS: тень от текстаtext-shadow: 1px 1px 2px gray;
filter: drop-shadow()функция CSS: тень по контуру картинки, учитывает прозрачностьfilter: drop-shadow(2px 2px 4px black);
shadow rootскрытая часть компонента в Shadow DOM, а не тегel.attachShadow({ mode: "open" })
template shadowrootmodeатрибут, который по стандарту создаёт shadow root прямо из разметки<template shadowrootmode="open">...</template>

Как браузер читает shadow в разметке

Для браузера shadow неизвестный тег. Его класс HTMLUnknownElement, а display по умолчанию inline. Текст внутри остаётся обычным текстом страницы. Класса HTMLShadowElement и метода createShadowRoot в браузере больше нет, остался только attachShadow.

JavaScript
const s = document.querySelector("shadow");
console.log(s.constructor.name, typeof HTMLShadowElement);

Пример: как браузер читает shadow

Результат

Кнопки меняют запись. Под ней показаны класс тега, размер и наличие старых классов браузера.

Работает ли shadow внутри shadow root

Нет. Если записать shadow в современный shadow root, содержимое компонента не покажется: сам компонент имеет высоту 0. Содержимое выводит только slot. Чтобы собрать компонент из нескольких слоёв, внешний slot передают внутрь вложенного компонента.

Пример: shadow и slot внутри shadow root

Результат

Кнопки меняют запись в shadow root. Высоты и назначенные слоты измерены в рамке.

Какие браузеры понимали shadow

Версии такие же, как у тега content. В Safari тега не было.

Пример: таблица версий

БраузерС какой версииУбран в версии
Chrome3589
Edge7989
Firefox33, только с включённым флагом59
Opera2675
Safariне былонет

Чем заменить shadow: slot и вложенные компоненты

Вместо подстановки старого дерева используют slot, о котором подробнее рассказано на странице про content. Если нужно собрать компонент из нескольких слоёв, внешний компонент помещает внутрь себя внутренний, а slot внешнего компонента записан внутри внутреннего, и у внутреннего в shadow root есть свой slot, который его принимает.

JavaScript
const outer = host.attachShadow({ mode: "open" });
outer.innerHTML = '<div id="inner"><slot></slot></div>';

const inner = outer.getElementById("inner").attachShadow({ mode: "open" });
inner.innerHTML = "<slot></slot>";

Такую сборку показывает последняя кнопка демо: содержимое компонента проходит через оба слота и показывается.

Частые ошибки с тегом shadow

ОшибкаЧто получитсяКак исправить
<shadow></shadow> внутри Shadow DOMСодержимое компонента не показывается, его высота равна 0Записать <slot></slot>
Свойство shadow: 0 2px 4px gray в CSSТакого свойства нет, браузер запись игнорирует, тени нетПисать box-shadow для блока или text-shadow для текста
createShadowRoot() вместо attachShadow()Ошибка TypeError: такого метода в браузере больше нетПисать attachShadow({ mode: "open" })
Категория
Поделиться в социальных сетях
Основные HTML-теги
Семантические теги HTML
Заголовки и абзацы
Теги для форматирования текста
Тег гиперссылки HTML
HTML-теги таблицы
Списки в HTML
Теги для форм
Мультимедиа и изображения
Интерактивные и служебные теги
Устаревшие HTML-теги

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

0 Комментарии

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

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×