CSS-директива `@position-try`
Baseline Ограниченная доступность
Эта функция не входит в Baseline, поскольку не работает в некоторых наиболее популярных браузерах.
@position-try — это CSS-директива, используемая для определения пользовательского варианта резервного позиционирования, который позволяет задавать позиционирование и выравнивание для элементов с позиционированием относительно якоря. К привязанному элементу можно применить один или несколько наборов вариантов резервного позиционирования с помощью свойства position-try-fallbacks или сокращённого свойства position-try. Когда позиционируемый элемент перемещается в положение, в котором он начинает выходить за пределы содержащего блока или области просмотра, браузер выбирает первый найденный вариант резервного позиционирования, который полностью возвращает позиционируемый элемент на экран.
Каждому варианту позиционирования присваивается имя в виде <dashed-ident>. Он содержит список дескрипторов с объявлениями, задающими такие параметры, как положение отступа, поля, размеры и собственное выравнивание. <dashed-ident> используется для ссылки на пользовательский вариант позиционирования в свойстве position-try-fallbacks и сокращённом свойстве position-try.
Подробную информацию о функциях якорного позиционирования и использовании вариантов резервного позиционирования см. в модуле якорного позиционирования CSS и руководстве «Варианты резервного позиционирования и условное скрытие при переполнении».
Синтаксис
@position-try --try-option-name {
descriptor-list
}
Примечание: --try-option-name — это <dashed-ident>, задающий идентифицирующее имя для пользовательского варианта позиционирования. Это имя можно использовать, чтобы добавить данный вариант в список свойства position-try-fallbacks.
Дескрипторы
Дескрипторы задают значения свойств, определяющие поведение пользовательского варианта позиционирования, то есть положение, в котором будет размещён позиционируемый элемент.
-
position-anchor - Задаёт значение свойства
position-anchor, определяющее якорный элемент, к которому привязан позиционируемый элемент. Для этого указывается значение<dashed-ident>, совпадающее со значением свойстваanchor-nameякорного элемента. -
position-area - Задаёт значение свойства
position-area, определяющее положение элемента с якорным позиционированием относительно якоря. - Дескрипторы свойств отступа
- Задают значения функции
anchor(), определяющие положение краёв элемента с якорным позиционированием относительно края якорного элемента. Можно задать дескрипторы свойств отступа, соответствующие следующим свойствам: - Дескрипторы свойств полей
- Задают поля элемента с якорным позиционированием. Можно задать дескрипторы свойств полей, соответствующие следующим свойствам:
- Дескрипторы свойств размеров
- Задают значения функции
anchor-size(), определяющие размер элемента с якорным позиционированием относительно размера якорного элемента. Можно задать дескрипторы свойств размеров, соответствующие следующим свойствам: - Дескрипторы свойств собственного выравнивания
- Задают значение
anchor-centerдля выравнивания элемента с якорным позиционированием относительно центра якорного элемента по блочному или строчному направлению. Дескрипторы свойствalign-selfиjustify-selfмогут принимать значениеanchor-center.
Примечание: Когда к элементу применяется пользовательский вариант позиционирования, значения свойств, заданные дескриптором директивы @position-try, имеют приоритет над значениями, установленными для элемента с помощью стандартных свойств CSS.
Формальный синтаксис
Примеры
Использование пользовательского варианта позиционирования
В этом примере мы зададим якорный элемент и элемент с якорным позиционированием, а затем создадим четыре именованных пользовательских варианта резервного позиционирования. Эти варианты применяются к позиционируемому элементу, чтобы его содержимое всегда оставалось видимым, независимо от положения якорного элемента в области просмотра.
HTML
Мы добавим два элемента <div>, которые станут якорем и элементом с якорным позиционированием:
<div class="anchor">⚓︎</div> <div class="infobox"> <p>This is an information box.</p> </div>
CSS
Сначала зададим элементу <body> очень большой размер, чтобы можно было прокручивать якорь и позиционируемый элемент по области просмотра как по горизонтали, так и по вертикали:
body {
width: 1500px;
height: 500px;
}
.anchor {
font-size: 1.8rem;
color: white;
text-shadow: 1px 1px 1px black;
background-color: hsl(240 100% 75%);
width: fit-content;
border-radius: 10px;
border: 1px solid black;
padding: 3px;
}
Якорю задаётся свойство anchor-name и значение absolute свойства position. Затем мы размещаем его ближе к центру начальной отрисовки <body> с помощью значений свойств top и left:
.anchor {
anchor-name: --my-anchor;
position: absolute;
top: 100px;
left: 350px;
}
.infobox {
color: darkblue;
background-color: azure;
border: 1px solid #dddddd;
padding: 10px;
border-radius: 10px;
font-size: 1rem;
}
Затем с помощью директивы @position-try мы задаём четыре пользовательских варианта позиционирования, используя описательные имена <dashed-ident> для их идентификации и указания назначения. Каждый вариант размещает позиционируемый элемент в определённом положении относительно якорного элемента и задаёт подходящее значение 10px для поля между позиционируемым элементом и якорем. Позиционирование реализовано несколькими способами, чтобы продемонстрировать доступные методы:
- В первом и последнем вариантах позиционирования используется
position-area. - Во втором варианте позиционирования используется свойство
topсо значениемanchor()и свойствоjustify-self: anchor-center, чтобы выровнять позиционируемый элемент по центру якоря в строчном направлении. - В третьем варианте позиционирования используется свойство
leftсо значениемanchor(), вложенным в функциюcalc(), которая добавляет10pxотступа (вместо создания отступа с помощью свойстваmargin, как в других вариантах). Затем используется свойствоalign-self: anchor-center, чтобы выровнять позиционируемый элемент по центру якоря в блочном направлении.
Наконец, для вариантов позиционирования слева и справа задаётся меньшая ширина width
@position-try --custom-left {
position-area: left;
width: 100px;
margin-right: 10px;
}
@position-try --custom-bottom {
top: anchor(bottom);
justify-self: anchor-center;
margin-top: 10px;
position-area: none;
}
@position-try --custom-right {
left: calc(anchor(right) + 10px);
align-self: anchor-center;
width: 100px;
position-area: none;
}
@position-try --custom-bottom-right {
position-area: bottom right;
margin: 10px 0 0 10px;
}
Для информационного блока задаётся фиксированное позиционирование, свойство position-anchor, которое ссылается на anchor-name якоря и связывает их, а также привязка к верхнему краю якоря с помощью position-area. Кроме того, задаются фиксированная width и нижнее margin. Затем пользовательские варианты позиционирования указываются в свойстве position-try-fallbacks, чтобы предотвратить выход позиционируемого элемента за пределы области просмотра или его прокрутку за её пределы, когда якорь приближается к краю области просмотра.
.infobox {
position: fixed;
position-anchor: --my-anchor;
position-area: top;
width: 200px;
margin-bottom: 10px;
position-try-fallbacks:
--custom-left, --custom-bottom, --custom-right, --custom-bottom-right;
}
Результат
Прокрутите страницу и обратите внимание, как меняется положение позиционируемого элемента при приближении якоря к разным краям области просмотра. Это происходит из-за применения различных вариантов резервного позиционирования.
Рассмотрим, как работают эти варианты позиционирования:
- Прежде всего, обратите внимание, что положение по умолчанию задаётся с помощью
position-area: top. Когда информационный блок не выходит за пределы страницы ни в одном направлении, он располагается над якорем, а варианты резервного позиционирования, заданные в свойствеposition-try-fallbacks, игнорируются. Также обратите внимание, что для информационного блока заданы фиксированная ширина и нижнее поле. Эти значения будут меняться при применении разных вариантов резервного позиционирования. - Если информационный блок начинает выходить за пределы страницы, браузер сначала пробует вариант
--custom-left. Он перемещает информационный блок влево от якоря с помощьюposition-area: left, соответствующим образом изменяет поле и задаёт блоку другую ширину. - Затем браузер пробует вариант
--custom-bottom. Он перемещает информационный блок вниз от якоря с помощьюtopиjustify-selfвместоposition-areaи задаёт подходящее поле. В нём нет дескриптораwidth, поэтому для информационного блока восстанавливается ширина по умолчанию200px, заданная свойствомwidth. - Затем браузер пробует вариант
--custom-right. Он работает почти так же, как вариант--custom-left, и для него применяется то же значение дескриптораwidth. Однако для размещения позиционируемого элемента используютсяleftиalign-selfвместоposition-area. Кроме того, значениеleftзаключено в функциюcalc(), в которой мы добавляем10pxдля создания отступа, а не используемmargin. - Если ни один из остальных вариантов резервного позиционирования не предотвращает выход позиционируемого элемента за пределы области просмотра, браузер в качестве последнего средства пробует вариант
--custom-bottom-right. Он размещает позиционируемый элемент внизу справа от якоря с помощьюposition-area: bottom right.
При применении варианта позиционирования его значения переопределяют исходные значения, заданные для позиционируемого элемента. Например, изначально для позиционируемого элемента задана width со значением 200px, но при применении варианта позиционирования --custom-right ширина элемента устанавливается равной 100px.
В некоторых случаях в пользовательских вариантах позиционирования нужно задать значения, чтобы отключить исходные значения. В вариантах --custom-bottom и --custom-right для размещения позиционируемого элемента используются свойства отступа и значения *-self: anchor-center, поэтому в обоих случаях мы сбрасываем ранее заданное значение position-area, устанавливая position-area: none. Если этого не сделать, исходное значение position-area: top продолжит действовать и будет мешать остальным параметрам позиционирования.
Спецификации
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome для Android | Firefox для Android | Opera для Android | Safari для iOS | Samsung Internet | WebView для Android | WebView для iOS | |
position-try |
125 |
125 |
147 |
111 |
26 |
125 |
147 |
83 |
26 |
27.0 |
125 |
26 |
См. также
position-areaposition-anchorposition-try-fallbacksposition-try- Функция
anchor() - Функция
anchor-size() - Модуль якорного позиционирования CSS
- Руководство «Использование якорного позиционирования CSS»
- Руководство «Варианты резервного позиционирования и условное скрытие при переполнении»
CSSPositionTryRule
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@position-try