За обновлениями можно следить в telegram-канале https://t.me/quasiart

inert — это глобальный HTML-атрибут, который делает элемент и всех его потомков неинтерактивными.

Когда элемент содержит inert, то:

  • на него нельзя кликнуть

  • его элементы нельзя сфокусировать

  • они исключаются из tab-навигации

  • screen reader игнорирует их

Пример:

<div inert>
  <button>Button</button>
  <a href="#">Link</a>
</div>

Все элементы внутри блока становятся неактивными.

Проблема, которую решает inert

Частая задача интерфейса — временно отключить часть страницы.

Например:

  • открыт модальный диалог

  • показывается loader

  • открыто боковое меню

  • выполняется отправка формы

Без inert это обычно делают через комбинацию:

  • pointer-events: none

  • tabindex="-1"

  • aria-hidden

  • JS-обработчики

Это сложно и легко сломать.

inert решает все эти проблемы одной строкой.

Пример 1. Блокировка фона при открытии модального окна

Один из самых частых сценариев.

<main id="content">
  <button>Button</button>
  <a href="#">Link</a>
</main>

<dialog id="modal">
  <button id="close">Close</button>
</dialog>

Когда открывается модалка, фон можно сделать inert.

const content = document.getElementById("content")
const modal = document.getElementById("modal")

function openModal() {
  content.inert = true
  modal.showModal()
}

function closeModal() {
  content.inert = false
  modal.close()
}

Теперь:

  • элементы фона не кликаются
  • tab-навигация не попадает туда
  • screen reader игнорирует фон

Пример 2. Блокировка формы во время запроса

Когда форма отправляется на сервер, нужно временно отключить её элементы.

<form id="form">
  <input>
  <button>Send</button>
</form>
const form = document.getElementById("form")

async function submitForm() {
  form.inert = true

  await fetch("/api")

  form.inert = false
}

Это предотвращает:

  • повторные клики

  • tab-навигацию

  • случайное изменение данных

Пример 3. Loading overlay

Иногда нужно заблокировать часть страницы, пока грузятся данные.

<div id="panel">
  <button>Refresh</button>
</div>
panel.inert = true

Элементы остаются видимыми, но становятся неинтерактивными.

Важная особенность: inert не меняет внешний вид

inert влияет только на поведение, но не на стиль.

Поэтому часто добавляют CSS:

[inert] {
  opacity: 0.6;
  pointer-events: none;
}

Это делает состояние интерфейса понятным пользователю.

Чем inert отличается от других решений

решение проблема
pointer-events: none элементы всё ещё доступны через tab
tabindex=-1 нужно добавлять на каждый элемент
aria-hidden влияет только на screen reader
disabled работает только на формах

inert:

  • отключает все события

  • убирает tab-навигацию

  • убирает из accessibility tree

Наследование inert

Атрибут действует на весь subtree.

<div inert>
  <section>
    <button>Button</button>
  </section>
</div>

Кнопка автоматически становится неактивной.

Ограничение: нельзя переопределить inert у потомков

Если родитель inert, то потомок не может быть активным.

child.inert = false

Это не сработает.

Особенность dialog

Элемент <dialog> может выйти из inert-контекста, когда открывается через showModal().

Это позволяет делать модальные окна поверх inert-контента.

Когда inert использовать не стоит

inert полезен для блокировки целых частей интерфейса.

Но он избыточен, если нужно:

Отключить одну кнопку:

<button disabled>

Перехватить события:

pointer-events: none;

Итог

inert — простой способ сделать часть интерфейса неинтерактивной.

Он особенно полезен для:

  • модальных окон

  • loading состояний

  • блокировки формы

  • отключения фонового контента

Атрибут позволяет заменить сложные комбинации tabindex, aria-hidden и pointer-events одним свойством.

«Интерактивный» пример

Данная ссылка никак не отреагируют на нажатие или фокус, так как весь абзац имеет атрибут inert.

Поддержка

Chrome Edge Firefox Opera Safari
102 102 112 88 15.5