Обзор
Стили Sheet определяются семантикой поверхности оверлея и раскладкой содержимого, а не большим набором публичных переменных. Большинство изменений должно сохранять ручку, отделение поверхности и читаемость точек привязки.
Публичные CSS-переменные
| Переменная | Значение | Влияет на |
|---|---|---|
Основная поверхность шторки.SheetContent | В этом состоянии изменений не видно | |
Цвет поверхности шторки; по умолчанию --surface-primary.SheetContent | В этом состоянии изменений не видно | |
Необязательная тень приподнятой поверхности.SheetContent | В этом состоянии изменений не видно | |
Цвет ручки.SheetHandle | В этом состоянии изменений не видно | |
Затемнение подложки.SheetContent::backdrop | В этом состоянии изменений не видно | |
Зазор по бокам и снизу, пока шторка находится ниже верха вьюпорта; 0 оставляет шторку во всю ширину.SheetContent | В этом состоянии изменений не видно |
Переменные частей
SheetContentиспользует токены поверхностей темы и внутренние правила размеров. Это flex-колонка с горизонтальными отступамиclamp(var(--spacing-12), 3vw, var(--spacing-16))и нижним отступомvar(--spacing-12)плюс отступ безопасной зоны, поэтому содержимому не нужна обёртка; прокручиваемая область — элемент сoverflow: auto.SheetHandleопирается на семантику стилей разделителя.- Задайте прокручиваемой области внутри шторки
overscroll-behavior: contain, чтобы её прокрутка не передавалась странице позади. - Поверхность шторки — отдельный слой позади её содержимого. Задавайте её цвет через
--sheet-backgroundнаSheetContent, а не черезbackground.::afterуSheetContent— часть этой поверхности, поэтому для ваших стилей он недоступен. - Задавайте
--sheet-insetи--sheet-backgroundна самомSheetContent: значение от предка до них не доходит. - Подложка — это
::backdropуSheetContent. Она использует--overlay, размытие приblurred, равномtrue, и не имеет фона приoverlay, равномfalse. Стилизуйте её через классSheetContent(.my-sheet::backdrop). - Как шторка в iOS,
SheetContentпарит карточкой со скруглёнными углами на расстоянии--sheet-inset(по умолчаниюvar(--spacing-8)) от боков и низа, пока находится ниже верха вьюпорта, и расширяется до краёв, поднимаясь к верху. Содержимое всё это время сохраняет ширину, поэтому не перестраивается между точками привязки:SheetContentдобавляет--sheet-insetк своим боковым отступам. На нижней точке привязки часть ниже зазора обрезается, поэтому карточка растёт от нижнего края по мере подъёма. Задайте--sheet-inset: 0, чтобы оставить её во всю ширину. Пока карточка обрезана,shadowedне показывает тень. Шторка высотой во весь вьюпорт всегда во всю ширину. SheetContentвыставляет на себе--sheet-expansion, и эта переменная не наследуется:0в самом нижнем положении и1, когда верх шторки достигает верха вьюпорта, следуя за перетаскиванием. Используйте её для собственных стилей, которые меняются по мере подъёма шторки, аdata-draggingчитайте, чтобы пропускать переходы, пока палец движется. Чтобы прочитать её в дочернем элементе или::before, скопируйте её в свою переменную наSheetContent; эта переменная наследуется, поэтому всё внутри пересчитывает стили при каждом движении перетаскивания.
.full-width-sheet {
--sheet-inset: 0;
}
.sheet-with-top-line {
--top-line-opacity: var(--sheet-expansion);
}
.sheet-with-top-line::before {
content: '';
position: absolute;
inset: 0 0 auto;
height: 1px;
background: var(--separator-opaque);
opacity: var(--top-line-opacity);
}Взаимодействие состояний и вариантов
- Точки привязки и возможность закрытия — контракты взаимодействия.
overlay={false}иblurredнаSheetContentменяют подачу подложки, а не модальное поведение.- Стили должны оставлять ручку достаточно заметной, чтобы шторка читалась как перетаскиваемая там, где это поведение есть.
Примеры
.brand-theme {
--surface-primary: oklch(99.2% 0.006 80);
--separator-opaque: oklch(45% 0.02 75 / 0.35);
}Шапка в стиле Apple
Шапка с небольшим заголовком и круглой кнопкой закрытия 24px в углу — обычная композиция: Heading с size={4} и fontWeight={600} и SheetClose asChild вокруг IconButton, абсолютно позиционированного в верхнем конечном углу (position: absolute, insetBlockStart: 16, insetInlineEnd: 'calc(16px + var(--sheet-inset, var(--spacing-8)))', потому что поверхность держит --sheet-inset от боков <dialog>); содержащий блок для неё — открытый модальный <dialog>. У IconButton нет для этого опции размера или формы; круглая кнопка 24px получается из двух CSS-переменных, заданных на ней, — --icon-button-size: 24px и --icon-button-br-ratio: 0.5, — с Icon size='xs' внутри.
Не переопределяйте
- Не делайте ручку настолько незаметной, что пропадает подсказка о перетаскивании.
- Не считайте поведение точек привязки чисто вопросом стилей.
- Не делайте поверхность шторки настолько плоской, что она визуально сливается с содержимым страницы.