HTML-элемент <details>
создаёт спойлер со скрытым изначально содержимым. Его можно переключить в «открытое» состояние путём:
- нажатия пользователем на метку с треугольником ▶,
- добавления атрибута
open
.
Простой спойлер: тег <details>
скрытое/показанное содержимое
<details>скрытое/показанное содержимое</details>
Раскрыть спойлер: атрибут open
скрытое/показанное содержимое
<details open>скрытое/показанное содержимое</details>
Изменить текст метки: тег <summary>
Цвет корпуса
Тип управления
Тип очистки
<style> .filter details + details { margin-top: 1em; } .filter summary { font-weight: 700; /* жирный шрифт метки */ cursor: pointer; /* курсор на метке имеет вид руки */ } .filter ul { list-style: none; margin: 1em; padding: 0; } .filter summary:hover { color:#ff3200; /* изменение цвета метки при наведении */ } </style> <!-- фильтр товаров на HTML --> <div class="filter"> <details> <summary>Группа свойств 1</summary> <ul> <li><label><input type="checkbox"/> свойство 1.1</label> <li><label><input type="checkbox"/> свойство 1.2</label> </ul> </details> <details> <summary>Группа свойств 2</summary> <ul> <li><label><input type="checkbox"/> свойство 2.1</label> <li><label><input type="checkbox"/> свойство 2.2</label> </ul> </details> </div>
Второй тег <summary>
не работает
Нажать
скрытое/показанное содержимоеНажать
<details> <summary>Нажать</summary> скрытое/показанное содержимое <summary>Нажать</summary> </details>
Убрать стрелочку-треугольник у <details>
и рамку у <summary>
Посмотреть на карте
скрытое/показанное содержимое<style> details summary { display: block; /* у summary по умолчанию свойство display в значении list-item, потому поддерживается свойство list-style */ width: 10em; width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; /* блок раскрывается при щелчке по кнопке, а не по всей строке */ border-bottom: 1px dotted; /* подводка точками или тире часто используется для элементов, с которыми пользователю предлагается взаимодействовать, можно заменить на text-decoration */ outline-style: none; /* удалить обводку при фокусе */ cursor: pointer; } details summary::-webkit-details-marker { /* нестандартный псевдоэлемент Google Chrome */ display: none; } </style> <details> <summary>Посмотреть на карте</summary> скрытое/показанное содержимое </details>
Скрыть часть текста под кнопкой «Ещё»
– Потому, – ответил иностранец и прищуренными глазами поглядел в небо, где, предчувствуя вечернюю прохладу, бесшумно чертиличерные птицы, – что Аннушка уже купила подсолнечное масло, и не только купила, но даже разлила.
<style> details { display: inline; /* текст на текущей строке */ } details[open] { display: contents; /* спрятанный текст на текущей строке (в Google Chrome отсутствует реализация на момент написания статьи) */ } details summary { list-style-type: "[...]"; /* такие слова, как «Ещё», «Читать дальше», «Нажать» лучше вносить в list-style-type, чтобы они не были видны в браузерах, не поддерживающих тег details (в Google Chrome отсутствует реализация на момент написания статьи) */ color: blue; cursor: pointer; } details[open] summary { display: none; } </style> Текст <details><summary></summary>скрытое/показанное содержимое</details>
В ряде браузеров <summary>
нельзя сделать inline-элементом
Текст до тега <details>.
Метка
Длинное спрятанное содержимое переносится всей строкой отдельно от предыдущего и последующего текста. В браузерах разночтение.<style> details, details * { all: initial; } </style> Текст <details open> <summary>Метка</summary> скрытое/показанное содержимое </details> Текст
Вложенный в <summary>
тег
Нажать [Закрыть]
скрытое/показанное содержимое<style> details:not([open]) summary small { display: none; } details[open] summary small { color: gray; } </style> <details> <summary> Нажать <small>[Закрыть]</small> </summary> скрытое/показанное содержимое </details>
Ссылка внутри <summary>
Позиционирование CSS ⎘
<style> details { display: block; /* так как в браузерах, не поддерживающих <details>, этот тег строчный */ overflow: hidden; border: 1px solid #f1f1f1; box-shadow: 2px 3px 3px rgba(0, 0, 0, .2); } details summary { padding: .3em; background: #f1f1f1; } details summary a { font-size: 1.5em; vertical-align: middle; text-decoration: none; } </style> <details> <summary>Позиционирование CSS <a href="/2012/04/pozitsionirovaniye-css.html" target="_blank">⎘</a></summary> <ul> <li><a href="/2017/04/position-static.html"><code>position static;</code></a> <li><a href="/2017/04/position-relative.html"><code>position: relative;</code></a> <li><a href="/2017/05/position-absolute.html"><code>position: absolute;</code></a> <li><a href="/2012/04/position-fixed-html.html"><code>position: fixed;</code></a> <li><a href="/2017/04/position-sticky.html"><code>position: sticky;</code></a> </ul> </details>
Сделать плавное открытие и скрытие блока <div>
при нажатии
Не получается анимировать блок, когда тот сворачивается. В Mozilla Firefox при
display: contents;
элемент <details>
раскрывается и его состояние тогда можно менять стилями.<style> details[open] div { animation: spoiler 1s; } @keyframes spoiler { 0% {opacity: 0;} 100% {opacity: 1;} } </style> <details> <div>скрытое/показанное содержимое</div> </details>
Первая цитата
— Это водка? — слабо спросила Маргарита.
Кот подпрыгнул на стуле от обиды.
— Помилуйте, королева, — прохрипел он, — разве я позволил бы себе налить даме водки? Это чистый спирт!
Кот подпрыгнул на стуле от обиды.
— Помилуйте, королева, — прохрипел он, — разве я позволил бы себе налить даме водки? Это чистый спирт!
Вторая цитата
Свежесть бывает только одна — первая, она же и последняя. А если осетрина второй свежести, то это означает, что она тухлая!
Третья цитата
— Вы не Достоевский, — сказала гражданка, сбиваемая с толку
Коровьевым.
— Ну, почем знать, почем знать, — ответил тот.
— Достоевский умер, — сказала гражданка, но как-то не очень уверенно.
— Протестую, — горячо воскликнул Бегемот. — Достоевский бессмертен!
— Ну, почем знать, почем знать, — ответил тот.
— Достоевский умер, — сказала гражданка, но как-то не очень уверенно.
— Протестую, — горячо воскликнул Бегемот. — Достоевский бессмертен!
<style> .spoiler { border: 1px solid #e0e0e0; padding: 0 1em; } .spoiler details { padding: 1em 0; } .spoiler details + details { border-top: 1px solid #e0e0e0; } .spoiler summary { color: #4d5895; } .spoiler details div { overflow: hidden; padding: 1em 1em 0; } .spoiler details[open] div { animation: spoiler 1s; } @keyframes spoiler { 0% {max-height: 0;} 100% {max-height: 10em;} } </style> <div class="spoiler"> <details> <summary>Заголовок 1</summary> <div>Содержимое 1</div> </details> <details> <summary>Заголовок 2</summary> <div>Содержимое 2</div> </details> </div>
Блок раскрывается при щелчке по кнопке, а не по всей строке
Нажать
скрытое/показанное содержимое<style> details summary { width: -webkit-fit-content; width: -moz-fit-content; width: fit-content; transition: color .3s; /* плавная смена цвета */ cursor: pointer; /* изменение курсора при наведении */ } details summary:hover, details[open] summary { color: FireBrick; } </style> <details> <summary>Нажать</summary> скрытое/показанное содержимое </details>
Текст "открыть/закрыть" при развёртывании и свёртывании содержимого
скрытое/показанное содержимое
<style> details summary::after { content: "Открыть"; } details[open] summary::after { content: "Закрыть"; } </style> <details> <summary></summary> скрытое/показанное содержимое </details>
Поменять стрелочку на знаки плюс и минус
Нажать
Первый способ<style> details summary { display: block; } details summary::-webkit-details-marker { display: none; } details summary::before { content: "+ "; } details[open] summary::before { content: "- "; } </style> <details> <summary>Нажать</summary> скрытое/показанное содержимое </details>
Нажать
Второй способ<style> details summary { list-style-type: "+ "; } details[open] summary { list-style-type: "- "; } </style> <details> <summary>Нажать</summary> скрытое/показанное содержимое </details>
Код закрывающейся метки внизу блока
– Потому, – ответил иностранец и прищуренными глазами поглядел в небо, где, предчувствуя вечернюю прохладу, бесшумно
чертили черные птицы, – что Аннушка уже купила подсолнечное масло, и не только купила, но даже разлила.
<style> div { position: relative; } details, summary { display: inline; } details[open] { display: contents; } details[open]::after { /* пространство для записи "СВЕРНУТЬ" */ display: block; content: "\00a0"; } summary { color: gray; cursor: pointer; } details[open] summary { position: absolute; /* переместить запись "СВЕРНУТЬ" вниз <div> */ bottom: 0; left: 0; } summary::before { content: "ЕЩЁ"; } details[open] summary::before { content: "СВЕРНУТЬ"; } summary::-webkit-details-marker { display: none; } </style> <div> Текст <details> <summary></summary> скрытое/показанное содержимое </details> </div>
Сделать вложенный спойлер
Cпрятать спойлер и текст под спойлер
ТекстСпрятать текст под спойлер
Текст<style> details { display: block; border: 1px solid silver; border-radius: 4px; padding: .5em; } details summary { display: list-item; margin: -.5em; padding: .5em; } details[open] > summary { margin-bottom: .5em; border-bottom: 1px solid silver; } </style> <details class="raz9"> <summary>Cпрятать спойлер и текст под спойлер</summary> Текст <details class="raz9"> <summary>Спрятать текст под спойлер</summary> Текст </details> </details>