Кратко
СкопированоТег <template> – (от английского template – шаблон) используется как контейнер для хранения HTML-кода для дальнейшего использования в JavaScript.
Пример
Скопировано
<template> <div class="card"> <h2 class="card__title"></h2> <div class="card__content"></div> </div></template>
<template>
<div class="card">
<h2 class="card__title"></h2>
<div class="card__content"></div>
</div>
</template>
Как понять
СкопированоВ <template> может храниться любая корректная HTML-разметка, в том числе стили и скрипты. Браузер будет проверять HTML-синтаксис, но содержимое тега <template> не будет отображаться на странице.
Если в шаблоне содержатся скрипты, они не выполнятся, а стили не применятся, пока содержимое шаблона не поместить на страницу.
Для того чтобы использовать содержимое шаблона в документе нужен JavaScript.
Атрибуты
СкопированоЭлемент <template> поддерживает глобальные атрибуты, а также ряд специальных атрибутов, связанных с декларативным созданием Shadow DOM:
shadowrootmode
СкопированоДобавляет родительскому элементу декларативный ShadowRoot. Это стандартный способ создать Shadow DOM прямо в HTML, аналог метода attach. Принимает значения:
open— внутренний Shadow DOM будет доступен из JavaScript через свойствоelement(рекомендуется для большинства случаев).. shadow Root closed— внутренний Shadow DOM будет скрыт от JavaScript, свойствоelementвернёт. shadow Root null.
shadowrootclonable
СкопированоЕсли установлен, свойство clonable у созданного ShadowRoot будет равно true. Это значит, что при клонировании хоста (Node или Document) в копии сохранится и ShadowRoot.
shadowrootdelegatesfocus
СкопированоЕсли установлен, свойство delegates у созданного ShadowRoot будет равно true. В этом случае, если фокус попадает на не-фокусируемый элемент внутри Shadow DOM, он автоматически перейдёт к первому фокусируемому элементу внутри дерева. По умолчанию — false.
shadowrootserializable
СкопированоЕсли установлен, свойство serializable у созданного ShadowRoot будет равно true. Это позволяет сериализовать содержимое ShadowRoot с помощью методов или с опцией serializable. По умолчанию — false.
Как использовать
СкопированоТег <template> имеет свойство content, которое доступно только для чтения. По нему можно получить доступ к содержимому шаблона.
if (document.createElement('template').content) { /* Код выполнится, если браузер поддерживает <template> */} else { /* Нужно придумать что-то другое */}
if (document.createElement('template').content) {
/* Код выполнится, если браузер поддерживает <template> */
} else {
/* Нужно придумать что-то другое */
}
Наглядный пример
СкопированоИмеем HTML-разметку с контейнером для списка покупок и шаблон элемента списка, завёрнутого в <template>:
<div> <h2>Список покупок</h2> <ul class="list"> </ul> <template id="template"> <li></li> </template></div>
<div>
<h2>Список покупок</h2>
<ul class="list">
</ul>
<template id="template">
<li></li>
</template>
</div>
Использование шаблона с помощью JavaScript:
const list = document.querySelector('.list')const template = document.querySelector('#template')// Клонируем содержимое тега <template>const item = template.content.cloneNode(true)// Находим тег <li> и помещаем текст внутрьitem.querySelector('li').textContent = 'Молоко'// Вставляем склонированный контент на страницуlist.append(item)
const list = document.querySelector('.list')
const template = document.querySelector('#template')
// Клонируем содержимое тега <template>
const item = template.content.cloneNode(true)
// Находим тег <li> и помещаем текст внутрь
item.querySelector('li').textContent = 'Молоко'
// Вставляем склонированный контент на страницу
list.append(item)
Подсказки
Скопировано💡 В <template> могут находиться даже те теги, которые в обычной жизни не используются без родительского контейнера, такие как <li> или <tr>.
<template> <li></li></template><template> <tr> <td></td> </tr></template>
<template>
<li></li>
</template>
<template>
<tr>
<td></td>
</tr>
</template>
- Chrome 111, поддерживается
- Edge 111, поддерживается
- Firefox 123, поддерживается
- Safari 16.4, поддерживается