Компонент Close из библиотеки Radix UI служит для закрытия различных интерактивных элементов интерфейса, таких как модальные окна, уведомления, аккордеоны и другие компоненты, которые поддерживают управление состоянием отображения. Он реализован с соблюдением стандартов доступности (a11y), обеспечивая правильное поведение для клавиатуры и экранных ридеров.
Для начала необходимо импортировать компонент из пакета
@radix-ui/react-dialog или
@radix-ui/react-alert-dialog, в зависимости от
контекста:
import * as Dialog from '@radix-ui/react-dialog';
Компонент Close используется как дочерний элемент внутри контейнера, поддерживающего закрытие:
<Dialog.Root>
<Dialog.Trigger>Открыть окно</Dialog.Trigger>
<Dialog.Content>
<Dialog.Title>Заголовок модального окна</Dialog.Title>
<Dialog.Description>Описание содержимого окна</Dialog.Description>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Root>
В этом примере Dialog.Close автоматически вызывает закрытие модального окна при нажатии. Не требуется дополнительная логика для управления состоянием, что упрощает интеграцию.
Компонент Close является функционально нейтральным по стилю, что позволяет полностью контролировать его внешний вид через CSS или CSS-in-JS. Например:
<Dialog.Close className="close-button">
×
</Dialog.Close>
<style>
.close-button {
background: transparent;
border: none;
font-size: 1.5rem;
cursor: pointer;
position: absolute;
top: 10px;
right: 10px;
}
.close-button:hover {
color: red;
}
</style>
Ключевые моменты при стилизации:
tabindex=0 управляется Radix автоматически).Можно использовать собственные компоненты или элементы в качестве Close:
<Dialog.Close asChild>
<button className="custom-close">
<svg width="16" height="16" viewBox="0 0 24 24">
<path d="M6 6L18 18M6 18L18 6" stroke="currentColor" strokeWidth="2"/>
</svg>
</button>
</Dialog.Close>
Использование свойства asChild позволяет:
<button>.Radix UI автоматически обрабатывает:
Escape.Пример с модальным окном:
<Dialog.Content>
<Dialog.Close aria-label="Закрыть окно" />
</Dialog.Content>
Рекомендации по доступности:
aria-label для кнопки, если визуальный
текст отсутствует.Close можно комбинировать с анимациями появления/исчезновения контента:
<Dialog.Content className="content">
<Dialog.Close className="close-button" />
</Dialog.Content>
<style>
.content {
animation: fadeIn 0.2s ease-out;
}
.close-button {
transition: transform 0.2s ease;
}
.close-button:hover {
transform: scale(1.1);
}
</style>
Radix не ограничивает использование CSS-анимаций или библиотек типа Framer Motion, что позволяет создавать плавные интерактивные интерфейсы.
Close применяется не только для модальных окон:
AlertDialog для закрытия предупреждающих
диалогов.Toast для закрытия уведомлений.Collapsible или Accordion для закрытия
панели.Пример с уведомлением:
<Toast.Root>
<Toast.Title>Сообщение отправлено</Toast.Title>
<Toast.Close>×</Toast.Close>
</Toast.Root>
asChild.Хотите, могу сделать отдельный раздел с продвинутыми трюками, включая комбинацию Close с контекстным состоянием и динамическими списками?