Кратко
СкопированоСвойство position
задаёт способ позиционирования элемента в документе. Совместно со свойствами left
, right
, top
, bottom
или inset
элементу задаётся его местоположение на странице.
Пример
Скопировано.box { position: absolute; left: 0; top: 20px;}
.box { position: absolute; left: 0; top: 20px; }
Как понять
СкопированоИногда в процессе вёрстки требуется реализовать разные сложные идеи дизайнера про расположение элементов друг относительно друга. Например, расположить один элемент поверх другого или немного сместить отображение элемента относительно своего начального положения. Бывают и более сложные случаи, когда требуется зафиксировать элемент относительно окна браузера, а не относительно страницы. Базовым свойством, которое изменяет способ позиционирования, является свойство position
.
Как пишется
Скопированоstatic
СкопированоЗначение по умолчанию. Статичное позиционирование. Любой элемент, добавленный на страницу, будет иметь это значение и будет расположен в нормальном потоке документа согласно контексту форматирования родительского элемента. Свойства left
, right
, top
, bottom
и z
игнорируются.
relative
СкопированоЭлемент позиционируется так же, как и статичный, но его отображение может быть смещено относительно своего начального положения при помощи свойств left
, right
, top
, bottom
или inset
. Это смещение чисто визуальное и не затрагивает положение соседних элементов, кроме случая, когда элемент выходит за границы родителя, имеющего возможность прокрутки.
На странице элемент будет занимать столько же места, как если бы он имел статичное позиционирование.
absolute
СкопированоСпособ позиционирования, кажущийся наиболее понятным. Мы просто задаём абсолютное позиционирование и при помощи свойств left
, right
, top
, bottom
или inset
регулируем положение элемента. Есть ряд особенностей такого позиционирования:
- Элемент убирается из основного потока документа. То есть перестаёт влиять на положение окружающих элементов и на размер родителя. Можно представить себе, что элемент уходит на слой выше и перестаёт взаимодействовать со всеми элементами, кроме своих потомков.
- Элемент позиционируется относительно ближайшего позиционированного предка. То есть браузер идёт вверх по дереву элементов и ищет ближайшего опорного родителя. И затем располагает наш элемент относительно этого родителя.
- Если элемент был частью строчного контекста форматирования, он приобретает блочный контекст форматирования. К нему становится применима блочная модель.
- Если элемент был блочным и занимал всю ширину своего родителя, то теперь его ширина будет определяться шириной контента.
- Отступы элемента с
position
не схлопываются с отступами соседних элементов.: absolute
fixed
СкопированоИногда требуется позиционировать элемент не относительно родителя, а относительно окна браузера вне зависимости от вложенности. Для решения подобной задачи подходит position
. Свойство так же, как и предыдущее, работает с указанием смещения left
, right
, top
, bottom
или inset
. У такого способа позиционирования есть ряд особенностей:
- Элемент убирается из основного потока документа. То есть перестаёт влиять на положение окружающих элементов и на размер родителя. Можно представить себе, что элемент уходит на слой выше и перестаёт взаимодействовать со всеми элементами, кроме своих потомков.
- Элемент позиционируется относительно окна браузера, за исключением случаев, если один из родителей имеет значения свойств
transform
,perspective
илиfilter
, отличные отnone
. В этом случае блок становится опорным, и позиционирование будет производиться уже относительно него, а не окна браузера.
sticky
СкопированоЭлемент позиционируется в нормальном потоке так же, как и статичный, а затем смещается при помощи свойств left
, right
, top
, bottom
или inset
относительно ближайшего родителя, имеющего прокрутку. Это свойство применяется, когда нам нужно зафиксировать какой-либо элемент не сразу, а при прокрутке родителя до какого-то известного положения.
Например, в следующем примере элемент будет вести себя как обычно, до тех пор, пока родитель не будет прокручен таким образом, что расстояние от верха родителя до верхней границы элемента не станет меньше 10 пикселей. Как только прокрутка достигнет такого значения, элемент зафиксируется в положении 10 пикселей от верха границы родителя:
.block { position: sticky; top: 10px;}
.block { position: sticky; top: 10px; }
У такого позиционирования есть ряд особенностей:
- Элемент ведёт себя как элемент с относительным (
relative
) позиционированием до тех пор, пока его родитель не будет прокручен до определённой границы. Как правило, эта точка совпадает с положением верхней границы нашего элемента, но может быть изменена с использованием свойстваtop
. - Элемент остаётся «приклеенным» во время прокрутки родителя до тех пор, пока не «встретит» противоположную границу своего родителя.
Подсказки
Скопировано💡 Как правило, если элементу с position
или position
не заданы ширина и высота, то значение этих величин высчитывается по количеству контента. Однако можно неявно заставить блок тянуться на всю ширину или высоту родителя, задав одновременно противоположные свойства (left
и right
, или top
и bottom
). Это будет работать, только если width
и height
будут иметь значение auto
. Аналогичного эффекта можно добиться, использовав логическое свойство inset
со значением 0
.
💡 Если ширина задана явно (не auto
), а также заданы left
и right
, то для direction
ltr
приоритет отдаётся свойству left
. Для rtl
— свойству right
.
💡 Если высота задана явно (не auto
), а также заданы top
и bottom
, то приоритет отдаётся свойству top
.
💡 Если для абсолютно позиционированного элемента (absolute
или fixed
) задано смещение только по одной из осей (например, только top
или только left
), то смещение по второй из осей высчитывается, исходя из расположения элемента, если бы он был позиционирован статично. В примере ниже блоку не задано положение по вертикали, поэтому его верхний край помещается в ту же точку, где находился бы при статичном позиционировании:
💡 Вы можете поэкспериментировать с разными стилями позиционирования и значениями свойств в демке-песочнице ниже:
На практике
Скопированосоветует Скопировано
Очень часто можно встретить анимацию за счёт изменения свойств left
/ right
/ top
/ bottom
у элементов с position
Однако такие анимации достаточно «дорогие» с точки зрения производительности браузера. Изменение position
или связанных с ним свойств заставляет браузер полностью пересчитать, а затем перерисовать макет страницы.
Лучше использовать transform
для таких случаев, оно таких спецэффектов не вызывает. Браузер выполнит меньше расчётов и перфоманс страницы не пострадает.
Подробнее про порядок отрисовки страницы и её оптимизацию можно почитать в этой статье «Как браузер рисует страницы».
Алексей Руденко — наставник на курсе «Мидл фронтенд-разработчик» в Яндекс Практикуме.