Кратко
Скопированоpresentation
— роль структуры документа из WAI-ARIA, которая удаляет семантику элемента. none
— это другое название для presentation
.
presentation
и none
превращают любой семантический тег в <div>
или <span>
для скринридеров и других вспомогательных технологий.
Пример
Скопировано<h1>Говорящий мангуст Джеф</h1><hr role="presentation"><p> Загадочное существо, обитавшее на ферме Дорлиш Кэшен неподалеку от селения Дэлби на острове Мэн. История о говорящем зверьке в середине 1930-х годов активно обсуждалась на страницах британской прессы.</p>
<h1>Говорящий мангуст Джеф</h1> <hr role="presentation"> <p> Загадочное существо, обитавшее на ферме Дорлиш Кэшен неподалеку от селения Дэлби на острове Мэн. История о говорящем зверьке в середине 1930-х годов активно обсуждалась на страницах британской прессы. </p>
В этом примере тег <hr>
потерял свою семантику и стал просто декоративным разделителем. Из-за этого скринридер не расскажет, что на странице есть элемент с ролью separator
.
Как пишется
СкопированоДобавьте role
или role
к семантическому тегу — HTML-элементу со встроенной ролью. Например, <h1>
, <table>
или <li>
. Исключение — интерактивные элементы, с которыми взаимодействуют пользователи. Это могут быть кнопки <button>
, ссылки <a>
или поля <input>
и <textarea>
.
Хотя современные браузеры больше не удаляют семантику интерактивных тегов из-за presentation
или none
, всё равно лучше не нарушать правила использования ARIA.
Когда сбрасываете семантику у элемента-родителя, в который вложены дочерние, они потеряют семантику всей семьёй.
К элементам с ролями presentation
или none
можно добавлять все ARIA-атрибуты, кроме глобальных:
aria
;- label aria
;- braillelabel aria
;- labelledby aria
;- describedby aria
;- details aria
;- description aria
;- roledescription aria
;- brailleroledescription aria
;- hidden aria
;- flowto aria
;- keyshortcuts aria
;- current aria
;- controls aria
;- owns aria
;- live aria
;- busy aria
;- atomic aria
.- relevant
Если используете атрибуты из списка в теге со сброшенной семантикой, некоторые браузеры и вспомогательные технологии используют встроенную роль элемента и проигнорируют явную presentation
.
Последнее важное правило для presentation
и none
— таким элементам не нужны имена. Это их краткие названия, которые скринридеры читают перед ролью. Не важно, откуда берётся имя у элемента — из текстового содержимого тега или из aria
.
Разберём простой пример со списком. Зададим родительскому <ul>
явную роль presentation
:
<ul role="presentation"> <li>Динозавры.</li> <li>Минералы.</li> <li> Вкусный <a href="#">пирожок</a>. </li></ul>
<ul role="presentation"> <li>Динозавры.</li> <li>Минералы.</li> <li> Вкусный <a href="#">пирожок</a>. </li> </ul>
Для вспомогательных технологий всё превратится в <span>
, кроме ссылки <a>
:
<span> <span>Динозавры.</span> <span>Минералы.</span> <span> Вкусный <a href="#">пирожок</a>. </span></span>
<span> <span>Динозавры.</span> <span>Минералы.</span> <span> Вкусный <a href="#">пирожок</a>. </span> </span>
presentation
и none
пригодятся, когда нужно оставить встроенные стили или логику тега, но не рассказывать вспомогательным технологиям про его семантику. Распространённые ситуации:
- декоративный элемент — картинки для красоты, разделители и похожие элементы;
- таблица для раскладки, как на старых сайтах или в электронных письмах;
- кастомный элемент, внутри которого есть другие с ненужной в этом контексте семантикой. Например, панель вкладок или меню как в редакторе текста.
Декоративная картинка <img>
с ролью presentation
ведёт себя так, как если бы её скрыли от скринридера с помощью aria
или CSS-свойства display
. Такое изображение точно не нужно описывать в alt
.
<img role="presentation" src="img/decorative-pic-1.svg" alt="">
<img role="presentation" src="img/decorative-pic-1.svg" alt="">
Можете встретить вариант декоративной картинки с пропущенным alt
:
<img role="presentation" src="img/decorative-pic-1.svg">
<img role="presentation" src="img/decorative-pic-1.svg">
Хотя этот пример из спецификации, такой код не пройдёт валидацию. Дело в том, что у элементов с атрибутом role
обязательно должны быть имена. В случае тега <img>
имя элемента берётся из alt
. Также вспомогательные технологии пока плохо поддерживают подобные картинки.
На практике presentation
чаще всего встречается в письмах. Тег <table>
в письмах используют не для хранения данных как обычно, а для визуального выравнивания содержимого. При помощи роли presentation
сбросится не только семантика самой таблицы, но и её дочерних элементов — <tr>
, <th>
, <td>
и других.
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="color: green;"> <tbody> <tr> <th> Привет, это рассылка от нас! </th> </tr> </tbody></table>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0" style="color: green;" > <tbody> <tr> <th> Привет, это рассылка от нас! </th> </tr> </tbody> </table>
Если загляните в дерево доступности в инструменте разработчика в Chrome, заметите, что у <th>
внутри <table role
вычисляется роль generic
. Это значит, что для браузеров и других программ это элемент без семантики.
Для сравнения, у <th>
будет роль layout
в таблице с родной семантикой, но без подписи <caption>
.
presentation
также часто используют во вкладках и в других кастомных элементах, для которых пока не хватает возможностей HTML. К примеру, вспомогательные технологии в случае вкладок на <ul>
не расскажут, что пользователь находится на элементе списка.
<ul role="tablist"> <li role="presentation"> <a role="tab" href="#">Тапиры</a> </li> <li role="presentation"> <a role="tab" href="#">Утконосы</a> </li></ul>
<ul role="tablist"> <li role="presentation"> <a role="tab" href="#">Тапиры</a> </li> <li role="presentation"> <a role="tab" href="#">Утконосы</a> </li> </ul>
Подсказки
Скопировано💡 presentation
и none
часто путают с aria
. Их разница в том, что атрибут полностью удаляет элемент из дерева доступности. Из-за этого вспомогательные технологии не знают о его семантике, содержимом, состоянии и свойствах.