Библиотека Radix UI предоставляет мощные и гибкие компоненты для создания интерфейсов с высокой степенью доступности и контролируемого поведения. Два ключевых элемента для управления отображением и структурой контента — это Portal и Content. Их понимание позволяет строить модальные окна, всплывающие панели и другие элементы интерфейса с полной изоляцией от остальной DOM-структуры.
Компонент Portal используется для рендеринга
дочерних элементов вне текущего DOM-контекста. Это
особенно важно для всплывающих элементов, которые не должны наследовать
CSS-стили или контекст родительских элементов, например,
overflow: hidden или z-index.
Пример использования:
import * as Portal from '@radix-ui/react-portal';
<Portal.Root>
<div className="tooltip-content">
Текст подсказки
</div>
</Portal.Root>
Ключевые особенности Portal:
body, что упрощает
контроль z-index.Важно учитывать, что Portal не создаёт видимый элемент сам по себе, он лишь переносит контент в другое место DOM. Все интерактивные элементы внутри Portal остаются полностью функциональными.
Content в Radix UI используется для отображения основного содержимого интерактивных компонентов — модальных окон, тултипов, дропдаунов. Обычно компонент Content рендерится внутри Portal, чтобы гарантировать корректное позиционирование и визуальное перекрытие других элементов.
Пример реализации модального окна:
import * as Dialog from '@radix-ui/react-dialog';
<Dialog.Root>
<Dialog.Trigger>Открыть окно</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Overlay className="dialog-overlay" />
<Dialog.Content className="dialog-content">
<h2>Заголовок модального окна</h2>
<p>Содержимое окна с важной информацией.</p>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
Особенности Content:
Часто Content используется вместе с Portal, чтобы обеспечить корректное отображение поверх других элементов интерфейса. Portal гарантирует, что Content рендерится вне ограничений родителя, а Content отвечает за визуальное оформление и структуру.
Пример комбинированного подхода:
<Portal.Root>
<Content className="popover-content">
Выбранная опция
</Content>
</Portal.Root>
Такое разделение ответственности упрощает поддержку и масштабирование интерфейсов: Portal отвечает за контекст отображения, Content — за структуру и стилизацию.
Portal и Content формируют фундамент для построения интерактивных интерфейсов в Radix UI. Их грамотное сочетание позволяет создавать визуально сложные и доступные компоненты без нарушения структурной целостности страницы.