Skip to content

Commit

Permalink
Добавляет демку в доку про роль alert (#4777)
Browse files Browse the repository at this point in the history
* Немного двигает текст местами

* Добавляет демку

* Добавляет демку в текст

* Удаляет лишний класс

* Добавляет ссылку

* Переписывает Как понять

* Добавляет другую иконку
  • Loading branch information
TatianaFokina authored Oct 16, 2023
1 parent 516af46 commit fa1d70a
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 18 deletions.
4 changes: 4 additions & 0 deletions a11y/role-alert/demos/alert-message/images/error.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
118 changes: 118 additions & 0 deletions a11y/role-alert/demos/alert-message/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Срочное сообщение с alert — alert — Дока</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400&display=swap">
<style>
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}

html {
color-scheme: dark;
font-size: 18px;
}

body {
min-height: 100vh;
padding: 50px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: #18191C;
color: #FFFFFF;
font-family: "Roboto", sans-serif;
}

.button {
display: block;
max-width: 210px;
margin-bottom: 25px;
border: 2px solid transparent;
border-radius: 6px;
padding: 9px 15px;
color: #000000;
font-size: 18px;
font-weight: 300;
font-family: inherit;
transition: background-color 0.2s linear;
}

.button-aqua {
background-color: #10F3AF;
}

.button:hover {
background-color: #FFFFFF;
cursor: pointer;
transition: background-color 0.2s linear;
}

.button:focus-visible {
border: 2px solid #FFFFFF;
outline: none;
}

.button:focus {
border: 2px solid #FFFFFF;
outline: none;
}

.message {
height: 44px;
padding: 10px 15px;
display: flex;
align-items: center;
gap: 15px;
}

.message-showed {
height: auto;
border: 1px solid #F498AD;
border-radius: 3px;
}

.message-showed:before {
content: url('images/error.svg');
width: 24px;
height: 24px;
}

p {
font-size: 1rem;
line-height: 1.4;
font-size: 0.9rem;
}

@media (max-width: 768px) {
body {
padding: 30px;
}
}
</style>
</head>
<body>
<button class="button button-aqua">Подключиться</button>
<div role="alert" class="message" id="message">
<p id="message-text"></p>
</div>

<script>
const button = document.querySelector('.button')
const message = document.getElementById('message')
const messageText = document.getElementById('message-text')

button.addEventListener('click', () => {
message.classList.add('message-showed')
messageText.textContent = 'Сервер сейчас перегружен. Попробуйте подключиться через час.'
})
</script>
</body>
</html>
45 changes: 27 additions & 18 deletions a11y/role-alert/index.md
Original file line number Diff line number Diff line change
@@ -1,47 +1,55 @@
---
title: "`alert`"
description: "Роль для важной информации, о которой скринридер расскажет пользователю сразу же."
description: "Роль для важной информации, о которой скринридер расскажет пользователю здесь и сейчас."
authors:
- aleksanderlamkov
contributors:
- tatianafokina
keywords:
- a11y
- live region
- alert message
- alert notification
- интерактивная область
related:
- a11y/aria-intro
- a11y/aria-roles
- a11y/aria-alertdialog
- a11y/role-status
- a11y/aria-live
tags:
- doka
---

## Кратко

Относится к категории [ролей изменяющихся областей](/a11y/aria-roles/#roli-izmenyayushchihsya-oblastey). Делает часть страницы live region или «живой» областью. Предназначена для важной и, как правило, срочной информации, появляющейся в определённой момент времени.
Относится к категории [ролей изменяющихся областей](/a11y/aria-roles/#roli-izmenyayushchihsya-oblastey). Делает часть страницы изменяющейся или «живой» областью. Предназначена для важной и, как правило, срочной информации, появляющейся в определённой момент времени.

## Пример

```html
<div role="alert">
Сервер сейчас недоступен. Повторите попытку позже.
Время сеанса скоро истечёт.
</div>
```

```html
<div role="alert">
Время сеанса скоро истечёт.
Соединение с сервером было потеряно, поэтому локальные изменения не будут сохранены.
</div>
```

```html
<div role="alert">
Соединение с сервером было потеряно, поэтому локальные изменения не будут сохранены.
<p>Сервер сейчас перегружен. Попробуйте подключиться через час.</p>
</div>
```

<iframe title="Срочное сообщение с alert" src="demos/alert-message/" height="370"></iframe>

## Как пишется

Добавьте к тегу атрибут `role="alert"`. Роль можно использовать для всех тегов.

Роль `alert` используют для уведомления пользователя о важной информации, обычно чувствительной ко времени. При появлении элемента с этой ролью на странице или при её добавлении к существующему элементу, браузер сгенерирует соответствующее событие для вспомогательных технологий, например, для [скринридера](/a11y/screenreaders/). Они получат содержимое уведомления и сообщат о нём пользователю.
Роль `alert` используют для уведомления пользователя о важной информации, обычно чувствительной ко времени. При появлении элемента с этой ролью на странице или при её добавлении к существующему элементу, браузер сгенерирует соответствующее событие для вспомогательных технологий. Например, для [скринридеров](/a11y/screenreaders/). Они получат содержимое уведомления и сообщат о нём пользователю. Они мгновенно прерывают предыдущие оповещения, когда появляется уведомление из элемента с `alert`.

### Особенности

Expand All @@ -50,18 +58,19 @@ tags:
### Рекомендации по использованию

- Роль нужна только для динамического содержимого, а не когда оно появляется при загрузке страницы.
- Используйте только для той информации, о которой нужно срочно сообщить. Например, что введённые в форму данные не будут сохранены из-за потери соединения с сервером.
- Используйте только для той информации, о которой нужно срочно сообщить. Например, что введённые в форму данные не сохранены из-за потери соединения с сервером.
- Добавляйте к элементу с предупреждением, а не к элементу, который его вызывает.
- Используйте только для текстового содержимого, а не для интерактивных элементов, к примеру [`<button>`](/html/button/) или [`<a>`](/html/a/).
- Убедитесь, что при загрузке страницы в разметке есть элемент с ролью `alert`, что он не содержит текст или скрыт по умолчанию через `display: none`. Иначе вспомогательные технологии прочитают содержимое элемента при загрузке страницы как другой текст. Как и в других [«живых» областях](/a11y/aria-roles/#roli-izmenyayushchihsya-oblastey), оповещения объявляются только при изменении содержимого элемента с ролью `alert`.
- На `alert` нельзя устанавливать фокус. Пользователям не нужно взаимодействовать с таким элементом, а вспомогательные технологии объявят о содержимом автоматически. Это не зависит от того, где находится фокус клавиатуры при добавлении роли `alert` или при изменении содержимого элемента с этой ролью.
- У менее срочных динамических изменений должны быть другие методы объявления, например, [`aria-live="polite"`](/a11y/aria-live/) или роль [`status`](/a11y/role-status/).
- Если пользователь может закрыть оповещение, используйте вместо `alert` роль [`alertdialog`](/a11y/role-alertdialog/).
- Старайтесь не использовать больше одного уведомления одновременно. Это ухудшает пользовательский опыт, поскольку alert-уведомления — самый навязчивый метод донесения информации.
- Если запускаете одно и то же оповещение несколько раз, например, когда добавляете одно и то же содержимое в элемент через JavaScript, браузер не считает это изменением. Так что это не приведёт к объявлению. В таких ситуациях «очистите» содержимое элемента перед тем, как повторно рендерить предупреждение.
- Скринридеры мгновенно прерывают предыдущие оповещения, когда появляется уведомление из элемента с `alert`.
- Можно визуально скрыть элемент с ролью `alert`, но оставить его видимым для вспомогательных технологий с помощью CSS и утилитарного класса, например, [`visually-hidden`](/a11y/content-hidden/#klassy-.visually-hidden-.sr-only-.off-screen). Только не используйте для этого `display: none`!
- Не устанавливайте на `alert` фокус. Пользователям не нужно взаимодействовать с таким элементом, а вспомогательные технологии объявят о содержимом автоматически. Это не зависит от того, где находится фокус клавиатуры при добавлении роли `alert` или при изменении содержимого элемента с этой ролью.
- Старайтесь не использовать больше одного уведомления одновременно. Это ухудшает пользовательский опыт, поскольку срочные уведомления — самый навязчивый метод донесения информации.
- Очистите содержимое элемента перед тем, как повторно рендерить предупреждение, когда запускаете одно и то же оповещение несколько раз. Например, если добавляете одинаковый текст в элемент через JavaScript. В этом случае браузер не считает это изменением.

Также убедитесь, что при загрузке страницы в разметке есть элемент с ролью `alert`, что он не содержит текст или скрыт по умолчанию через [`display: none`](/css/display/). Иначе вспомогательные технологии прочитают содержимое элемента при загрузке страницы как другой текст. Как и [в других «живых» областях](/a11y/aria-roles/#roli-izmenyayushchihsya-oblastey), оповещения объявляются только при изменении содержимого элемента с ролью `alert`.

Можно визуально скрыть элемент `alert`, но оставить его видимым для вспомогательных технологий с помощью CSS и утилитарного класса [`.visually-hidden`](/a11y/content-hidden/#klassy-.visually-hidden-.sr-only-.off-screen).

У менее срочных динамических изменений должны быть другие методы объявления, например, [`aria-live="polite"`](/a11y/aria-live/) или роль [`status`](/a11y/role-status/). Если пользователь может закрыть оповещение, используйте вместо `alert` роль [`alertdialog`](/a11y/role-alertdialog/).

## Как понять

«Живая» область — это область страницы, в которой что-то постоянно обновляется из-за внешних событий. Например, появляется уведомление или ошибка, когда пользователь сделал что-то неправильно. Так пользователи скринридеров могут узнать об изменениях автоматически, без перехода к этой части страницы.
_Изменяющаяся область_ — это область страницы, в которой содержимое обновляется из-за внешних событий или действий пользователей. Благодаря изменяющимся областям вспомогательные технологии узнают об обновлениях на странице и автоматически рассказывают о них пользователям.

0 comments on commit fa1d70a

Please sign in to comment.