Другой способ центрировать (абсолютный) элемент. CSS-трюки

Другой способ центрировать (абсолютный) элемент. CSS-трюки


т л;доктор: Мы можем центрировать абсолютно позиционированные элементы в трёх строках CSS. И это работает во всех браузерах!

.element {
  position: absolute;
  place-self: center; 
  inset: 0;
}

Почему? Ну, это требует длинного ответа.

За последние годы в CSS появилось множество новых функций, которые не обязательно позволяют нам делать новые вещи, но определенно делают их проще и проще. Например, нам больше не нужно жестко запрограммировать индекс:

इसके बजाय, यह सब इसमें संघनित है सहोदर-सूचकांक() И sibling-count() Работа. Таких недавних примеров немало.

Тем не менее, есть одна маленькая вещь, которая выглядит так, как будто мы делали это десятилетиями: Центрирование абсолютно позиционированного элементаЧего мы обычно добиваемся следующим образом:

.element {
  position: absolute;
  top: 50%;
  left: 50%;
  
  translate: -50% -50%;
}

Мы перемещаем верхний левый угол элемента в центр, затем перемещаем его обратно на 50 %, чтобы он оказался по центру.

В этом подходе нет ничего плохого – мы применяем его десятилетиями. но все равно такое ощущение старый способ. это единственный способ? Ну и есть еще один неизвестный кроссбраузерный способ, который не только центрирует, но и удобно размещает любой абсолютно позиционированный элемент. И самое приятное то, что он повторно использует знакомые align-self И justify-self Свойство.

Выявлено, что эти свойства (вместе с их place-self Сокращение) теперь работают с абсолютно позиционированными элементами. Однако если мы попытаемся использовать их как есть, то увидим, что наш элемент вообще не перемещается.

/* Doesn't work!! */
.element {
  position: absolute;
  place-self: center; 
}

итак, как align-self И justify-self Работать для абсолютных элементов? Может показаться очевидным, что они должны выровнять элемент, и это правда, но конкретно они выравнивают его внутри этого содержащий модифицированный вставкой блок (ИМКБ). Хорошо... но что такое IMCB?

Представьте, что мы установили наш абсолютный элемент width И height К 100%. Хотя положение элемента абсолютно, оно, конечно, не растет бесконечно, а скорее ограничено тем, что известно как блок, содержащий.

Содержащий блок является ближайшим предком с новым контекстом стека. По умолчанию это html Элемент.

Мы можем изменить это, используя содержащий блок inset качества (особенно) top, right, bottomИ left). Я так и думал inset Свойства исправили углы элемента (я даже сказал это несколько секунд назад), но на самом деле мы исправляем IMCB. границы.

Другой способ центрировать (абсолютный) элемент. CSS-трюки

По умолчанию IMCB имеет тот же размер, что и размеры элемента. Итак, во-первых, align-self И justify-self Они пытались сконцентрировать элемент внутри себя, но ничего не вышло. Затем наш последний шаг — установить IMCB так, чтобы он был идентичен содержащему блоку.

.element {
  position: absolute;
  place-self: center; 
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

Или, используя их inset Сокращение:

.element {
  position: absolute;
  place-self: center; 
  inset: 0;
}

Всего три строчки! Победа для энтузиастов CSS. Конечно, я могу схитрить, потому что по старинке мы могли бы также использовать inset свойство и сократим его до трех строк, но... давайте пока проигнорируем этот факт.

Мы не ограничиваемся центрированием всех остальных элементов. align-self И justify-self Посты работают отлично. Это обеспечивает более идиоматический способ установки абсолютных элементов.

Совет для профессионалов: Если мы хотим оставить пространство между абсолютно позиционированным элементом и содержащим его блоком, мы можем либо добавить margin набор или контейнер для элемента inset На желаемую вакансию.

Самое приятное то, что я проверил Caniuse, и хотя Safari изначально не поддерживал его, после тестирования выяснилось, что он работает во всех браузерах!

Leave a Reply

Your email address will not be published. Required fields are marked *