Введение
В этой статье я постарался собрать из крупиц наиболее полный набор информации и объяснить его чуточку проще в сравнении с другими статьями.
Ссылка на мой блог в телеграм с новыми фичами и лайфхаками во фронтенд.
Ссылка на другие мои статьи.
Приятного прочтения!
Полезные ссылки
В качестве закрепления рекомендую пройти данную игру.
Также, чтобы было легче разобраться с множеством значений свойства position-area, рекомендую данный инструмент от Chrome.
Предназначение
Данный API был разработан для того, чтобы упростить работу над tooltip'ами, dropdown меню, контекстными меню и прочими элементами UI, которые должны быть привязаны к какому-то определённому объекту, например к кнопке или полю для ввода даты.
Принцип работы
Для базового позиционирования при помощи Anchor Positioning API нам нужно всего лишь 2 элемента: статический (относительно которого происходит размещение) и динамический (тот, который размещают относительно статического).
Для простоты понимания далее статический элемент будем называть якорем, а динамический - позиционируемым элементом.
Взглянем на следующую схему ниже. Она поделена на 9 разных позиций, в которых может находиться позиционируемый элемент относительно якоря, а также конкретные значения, которые управляют этим поведением. Это значения свойства position-area, детальнее мы его разберём ниже.

Звучит просто, да? Тогда идём дальше, к вариантам связки одного элемента с другим.
Связка якоря и позиционируемого элемента
Как и в большинстве API во Frontend, данный механизм реализуется при помощи уникального идентификатора.
Всего существует 2 варианта связки:
При помощи CSS свойств
При помощи HTML атрибутов
Рассмотрим оба:
-
При помощи CSS свойств
<div class="anchor">Якорь</div> <div class="tooltip">Тултип</div>
.anchor { anchor-name: --myAnchor; }
.tooltip { position: absolute; position-anchor: --myAnchor; position-area: top left; }
Якорю необходимо указать свойство anchor-name, а позиционируемому элементу position-anchor с общим, так называемым, dashed ident значением. То есть, со значением с префиксом ввиде двух дефисов, также как и у CSS переменных. Также важно учесть, что у позиционируемого элемента обязательно должно присутствовать свойство position: absolute или position: fixed. Для других типов позиционирования такая привязка работать не будет. И, последнее, что необходимо сделать, это указать позицию, где будет размещён элемент относительно якоря при помощи position-area. В данном примере мы используем значение top left, это как раз одно из тех значений, что мы рассматривали на схеме ранее.
-
При помощи HTML атрибутов
<div class="anchor" id="myAnchor">Якорь</div> <div class="tooltip" anchor="myAnchor">Тултип</div>
.tooltip { position: absolute; position-area: top left; }
В этом случае, вместо свойств anchor-name и position-anchor, мы передаём общий идентификатор атрибутам id и anchor для якоря и позиционируемого элемента соответственно. Остальные обязательные CSS свойства из предыдущего примера остаются неизменными.
Стоит заметить, что на момент написания статьи, этот вариант находится в экспериментальном режиме в Chrome и доступен только при ручном включении соответствующего флага.
Прочие условия позиционирования
Помимо обычных элементов можно также использовать псевдоэлементы и элементы пользовательского интерфейса, такие как ползунок в <input type="range" >.
Позиционирование работает только с видимыми в DOM элементами. Иначе говоря, элементы с display: none, visibility: hidden или content-visibility: hidden работать не будут.
Способы размещения позиционируемого элемента
Всего существует 3 разных способа разместить один элемент относительно другого:
При помощи свойства position-area
При помощи функции anchor()
При помощи значения anchor-center
Примеры:
-
Свойство position-area
.tooltip { position-area: top left; }
-
Функция anchor()
.tooltip { left: anchor(right); bottom: anchor(bottom); }
В данном примере позиционируемый элемент выравнивает свой левый край с правой стороной якоря, а нижний край с нижним. Более подробно функцию anchor() рассмотрим ниже.
-
Значение anchor-center
.tooltip { align-self: anchor-center; justify-self: anchor-center; }
В данном примере позиционируемый элемент выравнивается по вертикальному центру якоря при помощи свойства align-self, а по горизонтальному при помощи justify-self.
Значение anchor-center может быть использовано со свойствами justify-self, align-self, justify-items, align-items, а также с их сокращёнными вариантами place-items и place-self.
Копаем глубже, детали отдельных свойств
anchor-name
Указывает имя якоря, к которому в дальнейшем можно будет прикрепить позиционируемый элемент. Через запятую можно указывать несколько имён.
Значения:
none (значение по-умолчанию) - отменяет привязку якоря и позиционируемого элемента
-
имя якоря - одно или несколько имён, перечисленных через запятую, начинающихся с двойного дефиса.
.anchor { anchor-name: --myAnchor, --buttonAnchor; }
position-anchor
Связывает позиционируемый элемент с якорем по определённому в anchor-name имени.
Значения:
auto (значение по-умолчанию) – связывает элемент с другим только в том случае, если привязка была сделана неявно. Например, при помощи html атрибутов anchor и id.
имя якоря - имя, с которым необходимо связать позиционируемый элемент, начинающееся с двойного дефиса.
Пример:
.tooltip {
position-anchor: --myAnchor;
}
position-area
Указывает расположение позиционируемого элемента относительно якоря.
Значения:
none (значение по-умолчанию) - отменяет позиционирование элемента
-
top или bottom или center + left или right или center через пробел - дают возможность занять одну из 9 областей позиционирования
.tooltip { position-area: right center; }
-
top или bottom или left или right - дают возможность занять целую строку или колонку
.tooltip { position-area: top; }
-
top или bottom или left или right или center + span-top или span-bottom или span-left или span-right через пробел - дают возможность занять сразу 2 ячейки.
.tooltip { position-area: top span-right; }
-
top или bottom или left или right или center + span-all через пробел - дают возможность занять целую строку или колонку. По сути аналог простых top, left, right, bottom.
.tooltip { position-area: right span-all; }
Также у данного свойства есть огромное количество различных логических значений, которые могут быть полезны в случае, если ваш сайт поддерживает мультиязычность. По своей сути они являются аналогами перечисленных выше значений, но дополнительно опираются на направление языка. К примеру, в русском слова пишутся слева направо, а в арабском, наоборот, справа налево.
position-visibility
Указывает при каких условиях позиционируемый элемент будет виден, а при каких он будет скрыт. При скрытии возникает такой же эффект как и при visibility: hidden.
Значения:
always (значение по‑умолчанию) — позиционируемый элемент виден всегда.
anchors‑visible — позиционируемый элемент виден до тех пор, пока хотя бы частично виден якорь.
no‑overflow — позиционируемый элемент виден до тех пор, пока он сам хотя бы немного не выходит за край экрана.
Пример:
.tooltip {
position-visibility: no-overflow;
}
position-try-fallbacks
Указывает запасные варианты перемещения позиционируемого элемента в случае, если он не умещается на экране. Значения можно указывать как в единственном экземпляре, так и в нескольких, перечисляя их через запятую. В случае нескольких вариантов, они будут перебираться поочерёдно до тех пор, пока не будет найден вариант, при котором позиционируемый элемент целиком уместится на экране.
Значения:
none (значение по‑умолчанию) — отменяет запасные позиции.
flip‑block — при нехватке места элемент переместится на обратную сторону блочной оси. Если не используются свойства writing‑mode, direction и другие, меняющие направление текста, то по‑умолчанию это значение означает вертикальное позиционирование.
flip‑inline — при нехватке места элемент переместится на обратную сторону строчной оси. Если не используются свойства writing‑mode, direction и другие, меняющие направление текста, то по‑умолчанию это значение означает горизонтальное позиционирование.
flip‑start — при нехватке места элемент переместится в противоположную сторону по диагонали. Местоположение диагонали зависит от значений, определённых в свойствах direction, writing‑mode и других, меняющих направление текста.
position‑area значения — все значения свойства position‑area.
-
имя position‑try директивы — имя, начинающееся с двойного дефиса.
.tooltip { position-try-fallbacks: --customLeft, --customRight, center, flip-block; } @position-try --customLeft { position-area: left; width: 100px; margin: 10px; } @position-try --customRight { position-area: right; margin-top: 10px; }
position-try по сути является аналогом обычного значения, но позволяет указать больше свойств, которые будут применены в случае, если будет выбран тот или иной вариант. Детальнее разберём данную директиву ниже.
значения разделённые пробелом — все представленные выше значения можно указывать через пробел. В таком случае позиции будут суммироваться. К примеру возьмём position‑try‑fallbacks со значением flip‑inline flip‑block. В данной ситуации, при нехватке места, позиционируемый элемент будет перемещаться не сразу по блочной и строчной оси, а по строчной плюс блочной. То есть, если элемент находится в левом нижнем углу, то сначала он будет перемещён в правый нижний (flip‑inline), а уже затем из этой позиции будет переброшен в правый верхний (flip‑block). Эту схему я описал для простоты понимания, по итогу мы просто увидим переход по диагонали, нескольких перескоков не будет.
position-try-order
Указывает стратегию, по которой будет подбираться позиция позиционируемого элемента в случае, если он не умещается на странице. Работает только в связке с position-try-fallbacks.
Значения:
normal (значение по-умолчанию) — используется стандартный порядок, определённый в position‑try‑fallbacks.
most‑width — приоритет отдаётся позициям с наибольшей шириной.
most‑height — приоритет отдаётся позициям с наибольшей высотой.
логические значения — значения, аналогичные представленным выше, но опирающиеся на направление текста.
position-try
Сокращение для свойств position-try-order и position-try-fallbacks.
Синтаксис:
position-try = position-try-order? position-try-fallbacks
Значения обоих свойств разделяются пробелом, position-try-order является необязательным.
@position-try
Директива, которая задаёт расположение позиционируемого элемента. Её имя используется как одно из возможных значений в position-try-fallbacks.
Пример:
@position-try --customLeft {
position-area: left;
width: 100px;
margin: 10px;
}
Внутри директивы может быть использован строго определённый набор свойств:
position-anchor
position-area
inset свойства: top, left, bottom, right, inset-block-start, inset-block-end, inset-inline-start, inset-inline-end, inset-block, inset-inline, inset.
margin свойства: margin-top, margin-left, margin-bottom, margin-right, margin-block-start, margin-block-end, margin-inline-start, margin-inline-end, margin, margin-block, margin-inline.
свойства размера: width, height, min-width, min-height, max-width, max-height, block-size, inline-size, min-block-size, min-inline-size, max-block-size, max-inline-size.
свойства выравнивания: align-self, justify-self, place-self.
Функция anchor()
Возвращает численное значение, необходимое для выравнивания позиционируемого элемента относительно якоря.
Пример:
.tooltip {
position: absolute;
position-anchor: --myAnchor;
top: anchor(bottom);
}
В данном примере верх позиционируемого элемента выравнивается по нижнему краю якоря. В top будет подставлено численное значение так, чтобы выполнилось данное условие.
Синтаксис:
anchor() = anchor(anchor-name? anchor-side, length-percentage?)
anchor-name (необязательный параметр) — значение свойства anchor‑name, которое указывает относительно какого якоря будет позиционироваться элемент.
-
anchor‑side — указывает относительно какой стороны выровнять позиционируемый элемент
top — относительно верхнего края якоря
right — относительно правого края якоря
left — относительно левого края якоря
center — относительно центра якоря. Ось центрирования соответствует используемому свойству. К примеру, для left это будет горизонтальная ось, а для top вертикальная.
inside — относительно той же стороны, что и у используемого свойства. К примеру, left: anchor(inside) будет аналогичен left: anchor(left).
outside — относительно противоположной стороны используемого свойства. К примеру, left: anchor(inside) будет аналогичен left: anchor(right).
проценты — относительно оси используемого свойства. К примеру, left: anchor(75%) выровняет левый край позиционируемого элемента от левого края якоря на 75% ширины якоря.
логические свойства — свойства, аналогичные представленным выше, но опирающиеся на направление текста
length‑percentage (необязательный параметр) — указывает резервное значение на случай, если якорная связка с позиционируемым элементом будет отсутствовать.
Свойства, которым доступна функция: top, left, bottom, right, inset, inset-block-start, inset-block-end, inset-block, inset-inline-start, inset-inline-end, inset-inline.
Значение anchor-side должно обязательно соответствовать оси свойства, которой оно задаётся. То есть left: anchor(right) будет работать, а вот left: anchor(top) уже нет. Ниже представлена полная таблица совместимости значений функции со свойствами.
Свойство |
anchor-side значение |
---|---|
Все |
|
Все |
проценты |
|
|
|
|
|
|
|
|
Функция anchor-size()
Возвращает размер якоря (ширину или высоту).
Например:
.tooltip {
width: anchor-size(height);
}
Если не передать ни одного параметра, то значение будет соответствовать оси свойства, для которой оно задано. Например:
width: anchor-size()
аналогиченwidth: anchor-size(width)
.top: anchor-size()
аналогиченtop: anchor-size(height)
.
Синтаксис:
anchor-size() = anchor-size(anchor-name? anchor-size? , length-percentage?)
anchor-name (необязательныйпараметр) — значение свойства anchor‑name, которое указывает, относительно какого якоря будет позиционироваться элемент.
-
anchor‑size (необязательный параметр) — указывает относительно какой из сторон будет вычисляться размер.
width — ширина якоря.
height — высота якоря.
логические свойства — свойства, аналогичные представленным выше, но опирающиеся на направление текста
length‑percentage (необязательный параметр) — указывает резервное значение на случай, если якорная связка с позиционируемым элементом будет отсутствовать.
Свойства, которым доступна функция:
inset свойства: top, left, bottom, right, inset-block-start, inset-block-end, inset-inline-start, inset-inline-end, inset-block, inset-inline, inset.
margin свойства: margin-top, margin-left, margin-bottom, margin-right, margin-block-start, margin-block-end, margin-inline-start, margin-inline-end, margin, margin-block, margin-inline.
свойства размера: width, height, min-width, min-height, max-width, max-height, block-size, inline-size, min-block-size, min-inline-size, max-block-size, max-inline-size.
Заключение
Собственно, это и весь API. Надеюсь, статья была вам полезна. Если возникли вопросы, то пишите комментарии, постараюсь своевременно ответить на все.
strokoff
Интересный новый инструмент, спасибо. Стоит отметить, что FF вообще пока не внедрил поддержку anchor, а у safari только 26+ в technical preview данная фича есть. И сама фича еще в состоянии working draft. Так что с нетерпением ждем) хотелось бы уже избавиться от трюков с position:relative+absolute