position
Властивість CSS position
(положення) вказує на те, як елемент розміщується в документі. Властивості top
, right
, bottom
та left
визначають остаточне місцеположення розміщених елементів.
Спробуйте його в дії
Синтаксис
position: static;
position: relative;
position: absolute;
position: fixed;
position: sticky;
/* Глобальні значення */
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
(фіксоване)Елемент зникає зі звичайного плину документа, і для нього не виділяється жодного простору у макеті сторінки. Він позиціонується відносно до початкового контейнерного блока, встановленого областю перегляду, крім випадків, коли один з предків елемента має властивість
transform
,perspective
абоfilter
, значення котрої відмінне відnone
(дивіться також Специфікацію трансформацій CSS (англ.)), або коли властивістьwill-change
має значенняtransform
, – у таких випадках предок з однією з вищезгаданих властивостей поводиться як контейнерний блок. (Зверніть увагу: існує неузгодженість браузерів щодо впливу властивостейperspective
таfilter
на формування контейнерного блоку.) Остаточна позиція елемента визначена значеннями властивостейtop
,right
,bottom
таleft
.Це значення завжди створює новий контекст нагромадження. При друкові документа такий елемент друкується на одній позиції на кожній сторінці.
sticky
(липкий)Елемент позиціонується згідно зі звичайним плином документа, а далі зміщується відносно до свого найближчого предка з прокручуванням та контейнерного блока (найближчого предка блокового рівня), включно з елементами таблиць, на основі значень властивостей
top
,right
,bottom
таleft
. Відступ не впливає на позицію інших елементів.Це значення завжди створює новий контекст нагромадження. Зверніть увагу, що липкий елемент "прилипає" до свого найближчого предка, який має "механізм прокручування" (утворений встановленням властивості
overflow
у значенняhidden
,scroll
,auto
чиoverlay
), навіть коли такий предок не є найближчим справді прокручуваним предком.
Опис
Типи позиціонування
- Позиціонований елемент – елемент, в котрого обчислене значення
position
– одне з наступних:relative
,absolute
,fixed
,sticky
. (Інакше кажучи, що завгодно, окрімstatic
.) - Відносно позиціонований елемент – елемент, в котрого обчислене значення
position
–relative
. Властивостіtop
таbottom
вказують вертикальний відступ від його звичайної позиції; властивостіleft
таright
вказують горизонтальний відступ. - Абсолютно позиціонований елемент – елемент, в котрого обчислене значення
position
–absolute
абоfixed
. Властивостіtop
,right
,bottom
таleft
вказують відступи від країв контейнерного блока елемента. (Контейнерний блок – то предок, відносно якого позиціонується елемент.) Якщо елемент має зовнішні поля, то вони додаються до відступів. Елемент утворює новий блоковий контекст форматування (БКФ) для свого вмісту. - Липко позиціонований елемент – елемент, в котрого обчислене значення
position
–sticky
. Він розглядається як відносно позиціонований, поки його контейнерний блок не перетне встановлений поріг (встановлений, наприклад, значенням властивостіtop
, відмінним відauto
) всередині свого кореня плину (чи контейнера, всередині якого він прокручується), після чого буде вважатись "застряглим", поки не зустріне протилежний край свого контейнерного блоку.
Переважну більшість часу абсолютно позиціоновані елементи, що мають height
та width
зі значенням auto
, мають розмір, відповідний їх вмістові. Втім, не заміщені, абсолютно позиціоновані елементи можуть бути змушені заповнювати увесь доступний простір по вертикалі шляхом вказання top
та bottom
і залишення height
невказаною (тобто auto
). Вони можуть аналогічно бути змушені заповнювати ввесь доступний простір по горизонталі шляхом встановлення left
та right
і залишення width
– auto
.
Окрім вищеописаного випадку (абсолютно позиціонованих елементів, що заповнюють доступний простір):
- Якщо як
top
, такbottom
– вказані (або, точніше кажучи, їх значення відмінне відauto
),top
перемагає. - Якщо як
left
, такright
– вказані, тоleft
перемагає, колиdirection
–ltr
(англійська, горизонтальна японська тощо), аright
перемагає, колиdirection
–rtl
(перська, арабська, іврит тощо).
Занепокоєння щодо доступності
Пересвідчіться, що елементи, позиціоновані як absolute
чи fixed
, не затуляють решту змісту, коли збільшується зображення сторінки чи розмір тексту.
- MDN – Розуміння WCAG, пояснення Директиви 1.4
- Візуальна презентація: розуміння SC 1.4.8 | Розуміння WCAG 2.0 (англ.)
Швидкодія та доступність
Прокручування елементів, що мають вміст, позиційований як fixed
чи sticky
, може призводити до проблем зі швидкодією та доступністю. Поки користувач прокручує, браузер мусить перемальовувати липкий чи фіксований вміст у новому місці. Залежно від вмісту, що треба перемальовувати, швидкодії браузера та швидкості роботи пристрою браузер може не мати змоги підтримувати рівень перемальовування 60 кадрів на секунду, що веде до занепокоєння відносно людей з особливими потребами та провисань для геть усіх. Одне з рішень – додати will-change: transform
до позиціонованих елементів, аби відмальовувати елемент у власному шарі, підвищивши швидкість перемальовування та, таким чином, покращити швидкодію та доступність.
Формальне визначення
Початкове значення | static |
---|---|
Успадковується | ні |
Обчислене значення | as specified |
Створює контекст нагромадження | так |
Формальний синтаксис
static | relative | absolute | sticky | fixed
Приклади
Відносне позиціонування
Відносно позиціоновані елементи мають заданий відступ від звичайної позиції в документі, але, втім, їх відступ не впливає на інші елементи. У прикладі нижче зверніть увагу: інші елементи розміщені так, неначе блок "Два" займає місце у своєму звичайному положенні.
HTML
<div class="box" id="one">Один</div>
<div class="box" id="two">Два</div>
<div class="box" id="three">Три</div>
<div class="box" id="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
). Якщо позиціонований предок не існує, елемент позиціонується відносно ПКБ (початкового контейнерного блока – дивіться також визначення W3C (англ.)), котрий є контейнерним блоком кореневого елемента документа.
HTML
<h1>Абсолютне позиціонування</h1>
<p>
Я є базовим елементом блокового рівня. Сусідні до мене елементи блокового
рівня сидять на нових рядках нижче від мене.
</p>
<p class="positioned">
Усталено ми займаємо 100% ширини свого батьківського елемента, і є настільки
високими, наскільки високим є наш дочірній вміст. Наші підсумкові ширина та
висота – це сума наших вмісту, внутрішніх відступів та ширини чи висоти меж.
</p>
<p>
Ми розділені своїми зовнішніми полями. Завдяки перекриттю зовнішніх полів ми
розділені шириною одного зовнішнього поля, а не двох.
</p>
<p>
рядкові елементи, <span>як-от цей</span> та <span>цей</span>, сидять на одному
й тому ж рядку, вкупі із суміжними текстовими вузлами, якщо на тому самому
рядку є місце. Рядкові елементи з переповненням
<span>завертають на новий рядок, якщо це можливо, як-от цей, із текстом</span
>, або просто переходять на новий рядок, якщо це неможливо, як-ось це
зображення: <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 перетворень (англ.)), що змусило б такого предка замінити елементові його контейнерний блок. Це може бути використано для створення "плавучого" елемента, котрий залишається на одній позиції незалежно від прокручування. У прикладі нижче елемент "Один" зафіксований на відстані 80 пікселів від верху сторінки, і 10 пікселів від лівого краю. Навіть після прокручування він залишається на тому самому місці відносно області перегляду. Крім того, коли властивість will-change
має значення transform
, то встановлюється новий контейнерний блок.
HTML
<div class="outer">
<p>
Але щоб ви зрозуміли, звідки виникає це хибне уявлення людей, цуратись
насолоди і вихваляти страждання, я розкрию перед вами всю картину і
роз’ясню, що саме говорив цей чоловік, який відкрив істину, якого я б назвав
зодчим щасливого життя. Дійсно, ніхто не відкидає, не зневажає, не уникає
насолод тільки через те, що це насолоди, але лише через те, що тих, хто не
вміє розумно вдаватися насолоді, осягають великі страждання. Так само як
немає нікого, хто полюбивши, вважав за краще і зажадав би саме страждання
тільки за те, що це страждання, а не тому, що інший раз виникають такі
обставини, коли страждання і біль приносять якесь і чималу насолоду. Якщо
скористатися найпростішим прикладом, то хто з нас став би займатися якими б
то не було тяжкими фізичними вправами, якщо б це не приносило з собою якоїсь
користі? І хто міг би по справедливості дорікнути прагнення до насолоди, яке
не несло б з собою ніяких неприємностей, або того, хто уникав би такого
страждання, яке не приносило б з собою ніякої насолоди?
</p>
<p>
Але ми цураємось і вважаємо, що заслуговують справедливого обурення ті, хто,
піддався звабі і розбещеним спокусам, які дають їм насолоду, і без тями від
пристрасті не передбачили, яких страждань і які нещастя на них чекають. Вони
винні так само, як і ті, хто через душевну слабкість, тобто через бажання
уникнути страждань і болю відмовляється від виконання свого обов’язку. Втім,
тут дуже легко і просто провести відмінності, тому що, коли ми вільні і нам
надана повна можливість вибору бажаного, коли ніщо не заважає нам робити те,
що нам більше подобається, будь яку насолоду слід визнати бажаним, а
будь-яке страждання огидним. Але при деяких обставинах – або на вимогу
боргу, або в силу якоїсь необхідності часто доводиться забувати про насолоди
і не втікати від тягарів. Тому мудрець дотримується в цьому випадку
наступного принципу вибору – або, відмовляючись від задоволення, він отримує
якісь інші і навіть великі насолоди, або, зазнаючи страждання, він
позбавляється від більш жорстоких.
</p>
<div class="box" id="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;
}
Результат
Липке позиціонування
Липке позиціонування можна уявляти як гібрид відносного та фіксованого позиціонування, коли найближчим прокрутним предком є область перегляду. Липко позиціонований елемент обробляється як відносно позиціонований, поки не перетне визначений поріг, після чого обробляється як фіксований, поки не досягне межі свого предка. Наприклад:
#one {
position: sticky;
top: 10px;
}
Правило CSS вище позиціонувало б елемент з атрибутом id="one"
відносно, поки область перегляду прокручувалась би, а елемент був би менш ніж за 10 пікселів од верху. Пройшовши цей поріг, елемент був би зафіксований за 10 пікселів од верху.
Загальноприйняте використання липкого позиціонування – заголовки списку, відсортованого за алфавітом. Заголовок "Б" з'явиться зразу після пунктів, що починаються з "А", поки вони прокручуються поза екраном. Замість вислизання за межі екрана разом з рештою вмісту, заголовок "Б" залишиться зафіксованим згори області перегляду, поки всі пункти "Б" не будуть прокручені поза екран, після чого буде перекритим заголовком "В", і так далі.
Обов'язково слід вказувати поріг в одній з властивостей: top
, right
, bottom
чи left
, щоб липке позиціонування поводилось як очікується.
HTML
<dl>
<div>
<dt>А</dt>
<dd>Абу-Касимові Капці</dd>
<dd>Аква-Віта</dd>
<dd>Андерсон</dd>
<dd>Астарта</dd>
<dd>АтмАсфера</dd>
</div>
<div>
<dt>В</dt>
<dd>Вагоновожатые</dd>
<dd>Вежа хмар</dd>
<dd>Вій</dd>
<dd>Воплі Відоплясова</dd>
<dd>Вхід у змінному взутті</dd>
</div>
<div>
<dt>Ґ</dt>
<dd>Ґринджоли</dd>
</div>
<div>
<dt>П</dt>
<dd>Перкалаба</dd>
<dd>Пирятин</dd>
<dd>Піккардійська терція</dd>
<dd>Пісні наших днів</dd>
<dd>Плач Єремії</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;
}
Результат
Специфікації
Специфікація | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Unknown specification
Сумісність із браузерами
Дивіться також |