Кратко

  • В проекте HTML 5.1 W3C от мая 2013 года описаны dialog, showModal(), стек окон, верхний слой, блокировка документа, начальный фокус и возврат значения. Соседний раздел об управлении делает элементы вне модального окна неактивными.
  • Проект рекомендации HTML5 2014 года и рекомендация HTML 5.2 2017 года продолжили этот порядок. Действующий стандарт HTML подробнее расписывает фокус и способы закрытия.

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

Проект HTML 5.1 от 28 мая 2013 года называл dialog частью приложения, где человек выполняет задачу. Метод show() открывал обычное окно. showModal() ставил его в стек диалогов документа, поднимал на верхний слой и блокировал остальную страницу. Это уже работа швейцара: знать, какая комната сейчас занята и кому следует подождать. Сам вопрос при этом пишет сайт.

Раздел о взаимодействии того же проекта объяснял последствия блокировки. Узлы вне модального диалога становились инертными. Затемнённый фон переставал быть театральной декорацией и получал соответствующее поведение. Раньше авторы могли вручную ловить клавиши и прятать элементы; у каждого получался свой замок. Спецификация предложила общую дверь, за которой следит браузер.

Швейцару нужно уметь не только впускать. Текст 2013 года учитывал autofocus, запрос отмены к верхнему диалогу, close() и returnValue. Если читатель решил не удалять подборку, браузер закрывает окно и передаёт ответ приложению. Дальше сайт обязан понять этот ответ верно. Ошибка, при которой выход из диалога запускает удаление, уже не вопрос толщины тени вокруг рамки.

Проект рекомендации HTML5 от февраля 2014 года сохранил стек, верхний слой и процедуры отмены. Рекомендация HTML 5.2 от декабря 2017 года описала шаги передачи фокуса. Эти даты относятся к документам стандартизации; они не утверждают, что все браузеры синхронно освоили функцию. В документах видно другое: границу модального разговора перестали оставлять исключительно на совести каждой страницы.

Разница между show() и showModal() проверяет здравый смысл автора. Небольшая панель с пояснениями может висеть рядом со статьёй, пока её читают. Подтверждение необратимого действия требует короткой остановки. Внешне оба окна похожи. Только второе просит браузер поставить весь зал на паузу. Такую просьбу стоит делать редко: посетитель пришёл читать, а не участвовать в бесконечной церемонии открытия дверей.

Нынешний стандарт HTML подробнее говорит о начальном фокусе, запросах закрытия и возвращаемом значении; там появились более поздние requestClose() и closedby. Приписывать их проекту 2013 года было бы плохой историей. Хорошая история держится за вопрос, который пережил все редакции: кто отвечает за очередь внимания и как вернуть человека к прерванному делу?

Браузер может проводить читателя через правильную дверь. Сайт должен позаботиться о том, чтобы за дверью был действительно нужный разговор.