КодSEOБлогИное

Как работает position: fixed;

Курсы HTML, CSS, PHP, JavaScript, лектор Трепачёв Д.П.

Элемент с position: fixed; фиксируется в рамках области просмотра страницы, будь то в окне браузера или в iframe, расстояние до края которой указано в свойствах top, right, bottom, left. Передвинуть его относительно своего расположения можно с помощью margin и transform. Размещение элемента над другими элементами правится с помощью свойства z-index.

После того, как свойство position примет значение fixed, размер элемента может измениться, а соседние элементы сдвинутся на освободившееся пространство.

«Приклеить» элемент, чтобы он не менял своего положения при прокрутке страницы

Элемент с position: fixed; не влияет на размер родителя.

<style>
div {
  border: 1px solid red;
}
div:nth-of-type(2) {
  margin-top: 1em;
}
span {
  background: lightpink;
}
div:nth-of-type(2) span {
  position: fixed;
}
</style>

<div>
  <span>static</span>
</div>
<div>
  <span>fixed</span>
</div>

Элемент с position: fixed; не влияет на положение соседей: цифры 20, 21, 22, … смещаются к цифре 19.

<style>
span {
  background: rgba(255, 182, 193, .7);
}
span:nth-of-type(2) {
  position: fixed;
}
</style>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <span>static</span> 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39<br>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <span>fixed</span> 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

В отличии от элемента с position: absolute; без родителя с position не static, элемент с position: fixed; не меняет своего положения при скроллинге.

<style>
body {
  height: 500vh;
  margin: 0;
  padding: 0;
}
span {
  height: 100%;
  border: .5em solid fuchsia;
  box-sizing: border-box;
  background: lightpink;
}
.absolute {
  position: absolute;
}
.fixed {
  position: fixed;
  margin-left: 5em;
}
</style>

<span class="absolute">absolute</span>
<span class="fixed">fixed</span>

При отсутствии свойств top, right, bottom, left элемент фиксируется на том месте окна браузера либо iframe, на котором находился до прокрутки. Его не увидеть, если он был ниже области, видимой без прокрутки.

<style>
body {
  height: 500vh;
  margin: 0;
  padding: 0;
}
div {
  height: 50vh;
}
div:nth-of-type(1) {
  background: dodgerblue;
}
div:nth-of-type(2) {
  margin-left: 4em;
  background: blue;
}
div:nth-of-type(3) {
  margin-left: 8em;
  background: navy;
}
span {
  position: fixed;
  background: lightpink;
}
</style>

<div>
  <span>fixed</span>
</div>
<div>
  <span>fixed</span>
</div>
<div>
  <span class="fixed"><!-- меня не видно!!! -->fixed</span>
</div>

Расположить элемент с position: fixed; относительно области просмотра окна браузера, iframe и т. п.

top
bottom
область просмотра
элемент
position: fixed;
left
right

Свойства top, right, bottom, left могут иметь как положительные, так и отрицательные значения в любых единицах измерения, а также в процентах. По умолчанию у них установлено значение auto.

<style>
body {
  margin: 0;
  padding: 3em;
}
span {
  position: fixed;
  background: lightpink;
}
span:nth-of-type(1) {
  top: 0;
}
span:nth-of-type(2) {
  right: 0;
}
span:nth-of-type(3) {
  bottom: 0;
}
span:nth-of-type(4) {
  left: 0;
}
</style>

<span>top</span>
<span>right</span>
<span>bottom</span>
<span>left</span>
<span>auto</span>

Значения свойств height, top и bottom в процентах рассчитываются от высоты области просмотра. Свойство height в процентах не заменяется на height: auto;, даже когда ближайший родитель имеет height: auto;. Значения свойств width, margin, padding, left и right в процентах рассчитываются от ширины области просмотра.

<style>
span {
  position: fixed;
  top: 50%;
  left: 0;
  height: 50%;
  width: 50%;
  background: lightpink;
}
</style>

<span></span>

Ширина и высота элемента с position: fixed; относительно области просмотра

Ширина элемента с position: fixed; без явно заданного значения устанавливается по содержимому. Элементы с display не block и position: fixed; ведут себя как элементы с display: block; и position: fixed;.

<style>
body {
  height: 500vh;
}
div {
  background: lightcyan;
}
span {
  background: lightpink;
}
</style>

<div>Блочный</div>
<span>Строчный</span>

Без явно заданной ширины и/или высоты размер элемента определяется расстоянием от left не auto до right не auto и/или от top не auto до bottom не auto (для IE8+).

<style>
.fixed {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background: lightpink;
}
</style>

<div class="fixed">Элемент</div>

Стили, чтобы растянуть блок на всю ширину и высоту области просмотра окна браузера, iframe и т. п.:

  left: 0;
  right: 0;
  top: 0;
  bottom: 0;

/* или */ 

  left: 0;
  right: 0;
  width: 100%;
  height: 100%;
  box-sizing: border-box;

С ограниченной шириной и/или высотой расстояние от left не auto до right не auto и/или от top не auto до bottom не auto определяет область, в рамках которой может перемещаться элемент с margin: auto; (для того, чтобы передвинуть элемент в центр верхней правой 1/4 части родителя см., left: 50%; right: 0; top: 0; bottom: 50%;). Если расстояние от left не auto до right не auto меньше width, то свойство right игнорируется (см., left: 50%; right: 50%;).

<style>
.fixed {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;

  width: 30%;
  height: 30%;
  background: lightpink;
}
</style>

<div class="fixed">Элемент</div>

position: fixed; и overflow не visible

Выходящая за границы родителя с overflow отличным от visible часть элемента с position: fixed; не будет скрыта. Даже если она выйдет за рамки области просмотра, горизонтальная или вертикальная полоса прокрутки не появится.

<style>
div {
  overflow: hidden;
  border: 1px solid red;
}
span {
  position: fixed;
  width: 100%;
  border: .5em solid fuchsia;
  background: lightpink;
}
</style>

<div>
  <span>Элемент</span>
</div>

position: fixed; и clip-path или clip

Свойство clip не рекомендуется использовать, так как оно устарело. Ему на смену пришло clip-path. Элемент с position: fixed; не выходит за рамки родителя с одним из них.

<style>
/* серым выделено то, что нужно только для clip, так как он работает лишь совместно с position: absolute; */ 
body {
  height: 500vh;
}
.parent {
  position: relative;
  height: 5em;
}
.absolute {
  position: absolute;
  width: 100%;
  box-sizing: border-box;
  height: 5em;
  border: 1px solid red;
  clip: rect(0, auto, auto, 0);  /* весь периметр родителя */ 
  clip-path: polygon(0 0, 0 100%, 100% 100%, 100% 0);  /* весь периметр родителя */ 
}
.fixed {  /* одинаковое положение для обоих элементов */ 
  position: fixed;
  top: 1em;
  left: 5%;
}
.fixed.red {
  background: red;
}
.fixed.lightpink {
  background: lightpink;
}
</style>

<div class="fixed lightpink">Зафиксированный</div>
<div class="parent">
  <div class="absolute">
    <div class="fixed red">Зафиксированный</div>
  </div>
</div>

position: fixed; не работает, когда у родителя свойства transform, perspective, filter или will-change имеют значение не none

Элемент с position: fixed; ведёт себя как элемент с position: absolute; относительно ближайшего родителя с transform, perspective, filter или will-change не none. Они создают новый контекст наложения. В браузерах разночтение.

<style>
body {
  height: 500vh;
}
div {
  border: 1px solid red;
}
span {
  position: fixed;
  right: 0;
  background: lightpink;
}
<div>
  <span>Элемент</span>
</div>

div по центру экрана

Вариант, который работает почти во всех версиях браузеров.

Нажать
<style>
#fixed {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  z-index: 2;
  text-align: center;
  background: rgba(0,0,0,.7);  /* IE+9 */ 
}
#fixed:before {  /* IE+8 */ 
  content: "";
  display: inline-block;
  height: 100%;
  vertical-align: middle;
}
.fixed {
  display: inline-block;
  vertical-align: middle;
  background: white;
}
</style>

<div id="fixed">
  <div class="fixed">
      содержание
  </div>
</div>
illyuziyaКлассно! А я всё думала, как "прилепляют" кнопочки и т.п. к краям экрана. Спасибо за "Шпаргалку..." — работа проделана колоссальная, а главное нужная!!! АнонимныйКак сделать липкий слой чтобы находился рядом с основным блоком? NMitraПосмотрите, пожалуйста, возможные образцы.
Все комментарии