Клавиша / esc

anchor-scope

Ограничиваем видимость якорных имён.

Время чтения: меньше 5 мин

Кратко

Скопировано

Свойство anchor-scope ограничивает область применения указанных якорных имён в поддереве текущего элемента.

Пример

Скопировано
        
          
          .container {  anchor-scope: all;}
          .container {
  anchor-scope: all;
}

        
        
          
        
      

Как понять

Скопировано

Представим, что нам нужно сверстать список, в каждом элементе которого есть якорный и таргет элементы (второй привязан к первому). Выглядеть это должно примерно, как на картинке ниже.

Список с якорем и таргетом в каждом элементе

Попробуем это реализовать.

Добавляем HTML-разметку.

        
          
          <ul>  <li>    <div class="anchor">Anchor 1</div>    <div class="target">Target 1</div>  </li>  <li>    <div class="anchor">Anchor 2</div>    <div class="target">Target 2</div>  </li>  <li>    <div class="anchor">Anchor 3</div>    <div class="target">Target 3</div>  </li></ul>
          <ul>
  <li>
    <div class="anchor">Anchor 1</div>
    <div class="target">Target 1</div>
  </li>
  <li>
    <div class="anchor">Anchor 2</div>
    <div class="target">Target 2</div>
  </li>
  <li>
    <div class="anchor">Anchor 3</div>
    <div class="target">Target 3</div>
  </li>
</ul>

        
        
          
        
      

Затем связываем таргет элементы с якорем.

        
          
          .anchor {  anchor-name: --anchor;}.target {  position: absolute;  position-anchor: --anchor;  position-area: top;}
          .anchor {
  anchor-name: --anchor;
}

.target {
  position: absolute;
  position-anchor: --anchor;
  position-area: top;
}

        
        
          
        
      

Запускаем код в браузере и видим, что на экране отображен только третий таргет элемент. Куда же подевались ещё два?

Открыть демо в новой вкладке

Если добавим отступов для дебага, то увидим, что, на самом деле все, три таргет элемента присутствуют на экране, просто они почему-то прикрепились к последнему якорю. Почему так происходит?

Открыть демо в новой вкладке

В данном примере мы использовали одно и то же якорное имя для нескольких элементов.

Объяснение поведения таргет элементов без использования anchor-scope, часть 1

Чтобы привязать таргет элемент к якорю, браузер ищет последний элемент в DOM с указанным якорным именем и прикрепляет элемент к нему.

Объяснение поведения таргет элементов без использования anchor-scope, часть 2

Как починить? Можно использовать уникальные имена для каждого якоря.

Схема с уникальными якорными именами

Но это может быть не всегда удобно, так как нужно либо заранее придумать и прописать в коде уникальные имена, либо описывать эту логику на JavaScript (чего хотелось бы избежать).

Чтобы решить подобную проблему было придумано свойство anchor-scope, которое позволяет ограничить видимость якорного имени поддеревом конкретного элемента.

Как пишется

Скопировано

Свойство anchor-scope принимает в себя три типа значений:

  • none — ни одно якорное имя не будет ограничено поддеревом текущего элемента. Значение по умолчанию; Схема, объясняющая работу anchor-scope: none
  • <anchor-name> — список якорных имен через запятую, видимость которых должна быть ограничена поддеревом текущего элемента. Например, --a, --b; Схема, объясняющая работу anchor-scope: --a, --b
  • all — все якорные имена в поддереве текущего элемента должны быть доступны только в рамках этого элемента. Схема, объясняющая работу anchor-scope: all

Теперь, когда мы знаем, как работает свойство anchor-scope, починить нашу демку будет проще простого.

        
          
          .anchor {  anchor-name: --anchor;}.target {  position: absolute;  position-anchor: --anchor;  position-area: top;}/*  Ограничиваем область видимости якоря элементом списка.*/ul li {  anchor-scope: --anchor;}
          .anchor {
  anchor-name: --anchor;
}

.target {
  position: absolute;
  position-anchor: --anchor;
  position-area: top;
}

/*
  Ограничиваем область видимости якоря элементом списка.
*/
ul li {
  anchor-scope: --anchor;
}

        
        
          
        
      
Открыть демо в новой вкладке
Поддержка в браузерах:
  • Chrome 125, поддерживается
  • Edge 125, поддерживается
  • Firefox, не поддерживается
  • Safari, не поддерживается
О Baseline