позиция
Базовая Широко доступная
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с июля 2015 года.
Свойство position CSS задает, как элемент расположен в документе. Свойства top, right, bottom и left определяют окончательное расположение позиционированных элементов.
Попробуйте
Синтаксис
position: static; position: relative; position: absolute; position: fixed; position: sticky; /* Global values */ position: inherit; position: initial; position: revert; position: revert-layer; position: unset;
Значения
static-
Элемент позиционируется в соответствии с нормальным потоком документа. Свойства
top,right,bottom,leftиz-indexне имеют эффекта. Это значение по умолчанию. relative-
Элемент позиционируется в соответствии с нормальным потоком документа, а затем смещается относительно самого себя на основе значений
top,right,bottom, иleft. Смещение не влияет на положение других элементов; таким образом, отводимое для элемента пространство в макете страницы такое же, как если бы значение position былоstatic.Это значение создаёт новый контекст стекирования, когда значение
z-indexне равноauto. Его влияние на элементыtable-*-group,table-row,table-column,table-cell, иtable-captionне определено. absolute-
Элемент удаляется из нормального потока документа, и для него не создаётся место в макете страницы. Элемент позиционируется относительно своего ближайшего позиционированного предка (если таковой имеется) или начального блока-контейнера. Его окончательное положение определяется значениями
top,right,bottom, иleft.Это значение создаёт новый контекст стекирования, когда значение
z-indexне равноauto. Отступы абсолютно позиционированных блоков не сливаются с другими отступами. fixed-
Элемент удаляется из нормального потока документа, и для него не создаётся место в макете страницы. Элемент позиционируется относительно своего начального блока-контейнера, в случае визуальных носителей, это область просмотра. Его окончательное положение определяется значениями
top,right,bottom, иleft.Это значение всегда создаёт новый контекст стекирования. В печатных документах элемент размещается в том же положении на каждой странице.
sticky-
Элемент позиционируется в соответствии с нормальным потоком документа, а затем смещается относительно своего ближайшего прокручиваемого предка и блока-контейнера (ближайший блочный предок), включая элементы, связанные с таблицами, на основе значений
top,right,bottom, иleftСмещение не влияет на положение других элементов.Это значение всегда создаёт новый контекст стекирования. Обратите внимание, что элемент со свойством sticky «прилипает» к ближайшему предку, имеющему «механизм прокрутки» (созданный, когда
overflowравноhidden,scroll,auto, илиoverlay), даже если этот предок не является ближайшим фактически прокручиваемым предком.Примечание: По крайней мере одно свойство inset (
top,inset-block-start,right,inset-inline-endи т.д.) должно быть задано с не-autoзначением для оси, на которой элемент должен стать sticky. Если оба свойстваinsetдля оси установлены вauto, на этой оси значениеstickyбудет вести себя какrelative.
Описание
Типы позиционирования
- Позиционированный элемент — это элемент, значение которого вычисляется как
positionравноrelative,absolute,fixed, илиsticky. (Другими словами, это все, кромеstatic.) - Относительно позиционированный элемент — это элемент, значение которого вычисляется как
positionравноrelative. Свойстваtopиbottomопределяют вертикальное смещение от его нормального положения; свойстваleftиrightопределяют горизонтальное смещение. - Абсолютно позиционированный элемент — это элемент, значение которого вычисляется как
positionравноabsoluteилиfixed. Свойстваtop,right,bottomиleftопределяют смещения от краёв блока-контейнера элемента. (Блок-контейнер — это предок, относительно которого позиционируется элемент.) Если у элемента есть отступы, они добавляются к смещению. Элемент устанавливает новый блок форматирования контекста (BFC) для своего содержимого. - Элемент со свойством sticky — это элемент, значение которого вычисляется как
positionравноsticky. Он обрабатывается как относительно позиционированный, пока его блок-контейнер не пересечёт заданный порог (например, установкаtopна значение отличное от auto) в пределах его корня потока (или контейнера, в котором он прокручивается), в этот момент он обрабатывается как «прикрепленный» до достижения противоположного края его блока-контейнера.
Большинство элементов, позиционированные абсолютно, с установленным значением height и width в auto, подстраиваются под размер своего содержимого. Однако не-замещённые элементы, позиционированные абсолютно, могут заполнять доступное вертикальное пространство, задав значения top и bottom и оставив height без значения (то есть auto). Аналогично, они могут заполнять доступное горизонтальное пространство, задав значения left и right и оставив width равным auto.
За исключением описанного выше случая (элементы, позиционированные абсолютно, заполняющие доступное пространство):
Универсальный дизайн
Убедитесь, что элементы, позиционированные с помощью значения absolute или fixed, не закрывают другое содержимое при увеличении размера текста на странице.
Производительность и доступность
Элементы с прокруткой, содержащие fixed или sticky контент, могут вызывать проблемы с производительностью и доступностью. По мере прокрутки пользователя браузеру необходимо перерисовывать закрепленный или фиксированный контент в новом месте. В зависимости от контента, требующего перерисовки, производительности браузера и скорости обработки устройства, браузер может не справиться с перерисовкой со скоростью 60 кадров в секунду. Такая ситуация может привести к рывкам и, что более важно, проблемам с доступностью для людей с чувствительностью. Одним из решений является добавление will-change: transform к позиционированным элементам для отрисовки элемента в своем слое, улучшения скорости перерисовки, а следовательно, повышения производительности и доступности.
Формальное определение
| Начальное значение | static |
|---|---|
| Применимо к | всем элементам |
| Наследуется | нет |
| Вычисленное значение | как указано |
| Тип анимации | дискретный |
| Создает контекст стекирования | да |
Формальный синтаксис
Примеры
Относительное позиционирование
Элементы с относительным позиционированием смещаются на заданное расстояние от их обычного положения в документе, но без влияния на другие элементы. В примере ниже обратите внимание, как другие элементы размещаются так, как если бы «Два» занимал место своего обычного расположения.
HTML
<div class="box" id="one">One</div> <div class="box" id="two">Two</div> <div class="box" id="three">Three</div> <div class="box" id="four">Four</div>
CSS
* {
box-sizing: border-box;
}
.box {
display: inline-block;
width: 100px;
height: 100px;
background: red;
color: white;
}
#two {
position: relative;
top: 20px;
left: 20px;
background: blue;
}
Абсолютное позиционирование
Элементы с относительным позиционированием остаются в обычном потоке документа. В отличие от этого, элемент с абсолютным позиционированием выводится из потока; таким образом, другие элементы позиционируются так, как если бы его не существовало. Абсолютно позиционированный элемент позиционируется относительно своего ближайшего позиционированного предка (т. е. ближайшего предка, который не является static). Если позиционированный предок отсутствует, он позиционируется относительно ICB (начального содержащего блока — см. также определение W3C), который является содержащим блоком корневого элемента документа.
HTML
<h1>Absolute positioning</h1> <p> I am a basic block level element. My adjacent block level elements sit on new lines below me. </p> <p class="positioned"> By default we span 100% of the width of our parent element, and we are as tall as our child content. Our total width and height is our content + padding + border width/height. </p> <p> We are separated by our margins. Because of margin collapsing, we are separated by the width of one of our margins, not both. </p> <p> inline elements <span>like this one</span> and <span>this one</span> sit on the same line as one another, and adjacent text nodes, if there is space on the same line. Overflowing inline elements <span>wrap onto a new line if possible — like this one containing text</span>, or just go on to a new line if not, much like this image will do: <img src="long.jpg" /> </p>
CSS
* {
box-sizing: border-box;
}
body {
width: 500px;
margin: 0 auto;
}
p {
background: aqua;
border: 3px solid blue;
padding: 10px;
margin: 10px;
}
span {
background: red;
border: 1px solid black;
}
.positioned {
position: absolute;
background: yellow;
top: 30px;
left: 30px;
}
Результат
Фиксированное позиционирование
Фиксированное позиционирование аналогично абсолютному позиционированию, за исключением того, что содержащим блоком элемента является начальный содержащий блок, установленный визуальным пространством, если у какого-либо предка не установлено свойство transform, perspective, или filter отличное от none (см. Спецификацию CSS Transforms), что затем приводит к тому, что этот предок занимает место содержащего блока элемента. Это можно использовать для создания «плавающего» элемента, который остается в том же положении независимо от прокрутки. В примере ниже, блок «Один» закреплен на 80 пикселей от верхней части страницы и на 10 пикселей от левой. Даже после прокрутки он остается на том же месте относительно визуального пространства. Кроме того, когда свойство will-change установлено в значение transform, устанавливается новый содержащий блок.
HTML
<div class="outer">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
ultrices ultrices, tempor et tellus.
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor
eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus
et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi,
laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit.
Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut
arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam
sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem
aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id
maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam
finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id
ultrices ultrices, tempor et tellus.
</p>
<div class="box" id="one">One</div>
</div>
CSS
* {
box-sizing: border-box;
}
.box {
width: 100px;
height: 100px;
background: red;
color: white;
}
#one {
position: fixed;
top: 80px;
left: 10px;
background: blue;
}
.outer {
width: 500px;
height: 300px;
overflow: scroll;
padding-left: 150px;
}
Результат
Прилипающее позиционирование
Следующее правило CSS позиционирует элемент с id one относительно до тех пор, пока визуальное пространство не прокрутится таким образом, чтобы элемент находился на расстоянии 10 пикселей от верха. После того, как этот порог будет превышен, элемент будет закреплен на расстоянии 10 пикселей от верха.
#one {
position: sticky;
top: 10px;
}
Список со закреплёнными заголовками
Распространенное применение прилипающего позиционирования — для заголовков в алфавитном списке. Заголовок «B» будет появляться чуть ниже элементов, начинающихся с «A», пока они не прокрутятся за экран. Вместо того, чтобы сползать со страницы вместе с остальным содержимым, заголовок «B» будет закреплен в верхней части визуального пространства, пока все элементы, начинающиеся с «B», не прокрутятся за экран, после чего он будет закрыт заголовком «C» и так далее.
Для корректной работы прилипающего позиционирования необходимо указать пороговое значение, по меньшей мере, с одним из top, right, bottom, или left. В противном случае оно будет неотличимо от относительного позиционирования.
HTML
<dl>
<div>
<dt>A</dt>
<dd>Andrew W.K.</dd>
<dd>Apparat</dd>
<dd>Arcade Fire</dd>
<dd>At The Drive-In</dd>
<dd>Aziz Ansari</dd>
</div>
<div>
<dt>C</dt>
<dd>Chromeo</dd>
<dd>Common</dd>
<dd>Converge</dd>
<dd>Crystal Castles</dd>
<dd>Cursive</dd>
</div>
<div>
<dt>E</dt>
<dd>Explosions In The Sky</dd>
</div>
<div>
<dt>T</dt>
<dd>Ted Leo & The Pharmacists</dd>
<dd>T-Pain</dd>
<dd>Thrice</dd>
<dd>TV On The Radio</dd>
<dd>Two Gallants</dd>
</div>
</dl>
CSS
* {
box-sizing: border-box;
}
dl > div {
background: #fff;
padding: 24px 0 0 0;
}
dt {
background: #b8c1c8;
border-bottom: 1px solid #989ea4;
border-top: 1px solid #717d85;
color: #fff;
font:
bold 18px/21px Helvetica,
Arial,
sans-serif;
margin: 0;
padding: 2px 0 0 12px;
position: -webkit-sticky;
position: sticky;
top: -1px;
}
dd {
font:
bold 20px/45px Helvetica,
Arial,
sans-serif;
margin: 0;
padding: 0 0 0 12px;
white-space: nowrap;
}
dd + dd {
border-top: 1px solid #ccc;
}
Результат
Прилипающее позиционирование со всеми установленными границами смещения
Следующий пример демонстрирует поведение элемента, когда все границы смещения установлены. Здесь у нас две лампочки emoji в абзаце. Лампочки используют прилипающее позиционирование, а границы смещения заданы как 50 пикселей сверху, 100 пикселей справа, 50 пикселей снизу и 50 пикселей слева. Серый фон в родительском элементе div обозначает область смещения.
HTML
Use scrollbars to put the light bulbs(💡) in the right place in the following
text:
<div>
<p>
The representation of an idea by a light bulb(<span class="bulb">💡</span>)
is a commonly used metaphor that symbolizes the moment of inspiration or the
birth of a new idea. The association between a light bulb and an idea can be
traced back to the invention of the incandescent light bulb(<span
class="bulb"
>💡</span
>) by Thomas Edison in the late 19th century. The light bulb is a powerful
symbol because it represents illumination, clarity, and the sudden
brightening of one's thoughts or understanding. When someone has an idea, it
is often described as a light bulb turning on in their mind, signifying a
moment of insight or creativity. The image of a light bulb also suggests the
idea of energy, power, and the potential for growth and development.
</p>
</div>
CSS
.bulb {
position: sticky;
inset: 50px 100px 50px 100px;
}
div {
/* mark area defined by the inset boundaries using gray color */
background: linear-gradient(#9999, #9999) 100px 50px / 192px 100px no-repeat;
}
Результат
Когда вы разместите обе лампочки в нужное место, вы заметите, что они относительно расположены внутри области смещения. Когда вы перемещаете их за пределы области смещения, они закрепляются (прилипают) к границам смещения в соответствующем направлении.
Спецификации
Совместимость с браузерами
| Рабочий стол | Мобильный телефон | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
position |
1 | 12 | 1 | 4 | 1 | 18 | 4 | 14 | 1 | 1.0 | 4.4 |
absolute |
1 | 12 | 1["Before Firefox 57, absolute positioning did not work correctly when applied to elements inside tables that haveborder-collapse applied to them (bug 1379306).", "Before Firefox 30, absolute positioning of table rows and row groups was not supported (bug 63895)."] |
15 | 1 | 18 | 4["Before Firefox 57, absolute positioning did not work correctly when applied to elements inside tables that haveborder-collapse applied to them (bug 1379306).", "Before Firefox 30, absolute positioning of table rows and row groups was not supported (bug 63895)."] |
14 | 1 | 1.0 | 4.4 |
absolutely_positioned_flex_children |
52 | 12 | 52 | 39 | 11 | 52 | 52 | 41 | 11 | 6.0 | 52 |
fixed |
1 | 12 | 1Before Firefox 44,position: fixed didn't create a stacking context in most cases. Firefox and the specification have been modified to mimic Chrome and Safari's long-time behavior. |
4 | 1 | 18 | 4Before Firefox 44,position: fixed didn't create a stacking context in most cases. Firefox and the specification have been modified to mimic Chrome and Safari's long-time behavior. |
14 | 1 | 1.0 | 4.4 |
position_sticky_table_elements |
56 | 16 | 59Границы не отображаются в заголовках таблиц, еслиborder-collapse установлено в collapse (bug 1727594). |
43 | 8 | 56 | 59Границы не отображаются в заголовках таблиц, еслиborder-collapse установлено в collapse (bug 1727594). |
43 | 8 | 6.0 | 56 |
relative |
1 | 12 | 1 | 15 | 1 | 18 | 4 | 14 | 1 | 1.0 | 4.4 |
static |
1 | 12 | 1 | 15 | 1 | 18 | 4 | 14 | 1 | 1.0 | 4.4 |
sticky |
56 | 16 | 32 | 43 | 137 | 56 | 32 | 43 | 137 | 6.0 | 56 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/position