7.3. Właściwość position
: static
i relative
position
: static
i relative
Wprowadzenie: Kontrola pozycji elementu
Właściwość position
w CSS pozwala na zmianę domyślnego sposobu pozycjonowania elementu w przepływie dokumentu. Domyślnie elementy są pozycjonowane statycznie (position: static;
), co oznacza, że układają się jeden po drugim zgodnie z kolejnością w kodzie HTML.
Zmieniając wartość position
, zyskujemy możliwość precyzyjnego umieszczania elementów na stronie, niezależnie od ich naturalnego miejsca w przepływie. W połączeniu z właściwościami przesunięcia (top
, right
, bottom
, left
), position
otwiera drzwi do tworzenia bardziej złożonych layoutów.
W tej lekcji omówimy dwie podstawowe wartości: static
i relative
.
position: static;
(Pozycjonowanie statyczne)
Jest to **wartość domyślna** dla wszystkich elementów HTML. Elementy z position: static;
są pozycjonowane zgodnie z **normalnym przepływem dokumentu (normal flow)**.
- Elementy blokowe zajmują dostępną szerokość i układają się jeden pod drugim.
- Elementy inline i inline-block układają się w linii, zawijając się w razie potrzeby.
- Właściwości przesunięcia (
top
,right
,bottom
,left
) orazz-index
**nie mają żadnego wpływu** na elementy zposition: static;
.
W praktyce rzadko jawnie ustawiamy position: static;
, ponieważ jest to zachowanie domyślne.
.element {
position: static; /* Domyślne zachowanie */
top: 50px; /* Ignorowane */
left: 100px; /* Ignorowane */
}
position: relative;
(Pozycjonowanie relatywne)
Ustawienie position: relative;
na elemencie sprawia, że jest on pozycjonowany **względnie do swojej normalnej pozycji** w przepływie dokumentu.
- Pozostaje w przepływie: Element nadal zajmuje swoje pierwotne miejsce w layoucie, tak jakby miał
position: static;
. Pozostałe elementy nie przesuwają się, aby wypełnić jego pierwotne miejsce. - Możliwość przesunięcia: Element można wizualnie przesunąć względem jego normalnej pozycji za pomocą właściwości
top
,right
,bottom
,left
.top: 10px;
przesuwa element o 10px w dół od jego górnej krawędzi.left: 20px;
przesuwa element o 20px w prawo od jego lewej krawędzi.bottom: 5px;
przesuwa element o 5px w górę od jego dolnej krawędzi.right: 15px;
przesuwa element o 15px w lewo od jego prawej krawędzi.
top
ibottom
(lubleft
iright
), przeglądarka zazwyczaj uwzględnitop
(lubleft
) w trybie zapisu od lewej do prawej. - Tworzy nowy kontekst pozycjonowania: Element z
position: relative;
staje się **blokiem zawierającym (containing block)** dla swoich potomków, którzy mają ustawioneposition: absolute;
. Jest to kluczowa cecha, którą wykorzystamy w następnych lekcjach. - Respektuje
z-index
: Można kontrolować kolejność nakładania się elementów (stacking order) za pomocąz-index
.
position: relative;
jest często używane do niewielkich przesunięć wizualnych bez zaburzania głównego layoutu lub jako "kotwica" dla absolutnie pozycjonowanych elementów potomnych.
<div class="box static-box">Static</div>
<div class="box relative-box">Relative</div>
<div class="box static-box">Static</div>
.box {
width: 100px;
height: 100px;
margin: 10px;
display: inline-block; /* Dla ułożenia obok siebie */
border: 1px solid black;
}
.static-box {
background-color: lightgray;
}
.relative-box {
position: relative;
background-color: lightcoral;
top: 20px; /* Przesunięcie o 20px w dół */
left: 30px; /* Przesunięcie o 30px w prawo */
/* Pierwotne miejsce nadal jest zajęte! */
}
W powyższym przykładzie, pudełko "Relative" zostanie wizualnie przesunięte w dół i w prawo, ale puste miejsce, które normalnie by zajmowało między dwoma pudełkami "Static", pozostanie.
Właściwości przesunięcia: top
, right
, bottom
, left
Te właściwości działają tylko dla elementów, których position
jest inne niż static
(czyli relative
, absolute
, fixed
lub sticky
).
- Określają one odległość między daną krawędzią elementu a jego **pozycją odniesienia**.
- Dla
position: relative;
, pozycją odniesienia jest normalna pozycja elementu w przepływie. - Dla
position: absolute;
, pozycją odniesienia jest krawędź najbliższego pozycjonowanego przodka (innego niżstatic
). - Dla
position: fixed;
, pozycją odniesienia jest krawędź viewportu (okna przeglądarki). - Dla
position: sticky;
, zachowanie jest bardziej złożone (mieszankarelative
ifixed
).
Wartościami mogą być jednostki długości (px
, em
, %
) lub auto
(domyślne).
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz paragraf tekstu. Wewnątrz niego umieść element <sup>
(indeks górny) z liczbą. Nadaj elementowi <sup>
position: relative;
i przesuń go lekko w górę za pomocą właściwości bottom
, aby poprawić jego wizualne umiejscowienie.
Rozwiązanie:
HTML:
<p>To jest przykład<sup class="footnote-ref">1</sup> z indeksem górnym.</p>
CSS:
.footnote-ref {
position: relative;
bottom: 0.3em; /* Przesunięcie w górę o 0.3 wysokości linii */
font-size: 0.8em; /* Zmniejszenie czcionki dla lepszego wyglądu */
}
Efekt: Liczba w indeksie górnym zostanie lekko podniesiona względem swojej standardowej pozycji, co często wygląda lepiej typograficznie.
Zadanie 2 (do samodzielnego wykonania)
Stwórz trzy elementy div
jeden pod drugim. Środkowemu elementowi nadaj position: relative;
, top: -10px;
i left: 20px;
. Zaobserwuj, jak nachodzi on na element powyżej i jak wpływa (lub nie wpływa) na pozycję elementu poniżej.
Zadanie 3 (do samodzielnego wykonania)
Stwórz element div
z position: static;
(lub bez jawnego ustawienia position
). Spróbuj nadać mu top: 50px;
i left: 50px;
. Czy element się przesunął?
FAQ - Najczęściej zadawane pytania
Czy position: relative;
usuwa element z przepływu dokumentu?
Nie. Element z position: relative;
nadal zajmuje swoje pierwotne miejsce w przepływie dokumentu. Przesunięcie za pomocą top/right/bottom/left
jest tylko wizualne; przestrzeń, którą element normalnie by zajmował, pozostaje zarezerwowana.
Do czego najczęściej używa się position: relative;
?
Głównie do dwóch celów: 1) Dokonywania niewielkich wizualnych korekt pozycji elementu bez zaburzania reszty layoutu. 2) Tworzenia **kontekstu pozycjonowania** dla elementów potomnych z position: absolute;
. Nadanie rodzicowi position: relative;
(nawet bez żadnych przesunięć) sprawia, że staje się on punktem odniesienia dla absolutnie pozycjonowanych dzieci.
Czy mogę użyć procentów dla top/right/bottom/left
przy position: relative;
?
Tak, ale wartości procentowe będą obliczane względem **wysokości** (dla top/bottom
) lub **szerokości** (dla left/right
) **bloku zawierającego (containing block)**, a nie względem rozmiaru samego elementu. Może to prowadzić do nieoczekiwanych rezultatów, jeśli blok zawierający ma zmienne wymiary.
Co się stanie, jeśli ustawię position: relative;
bez żadnych właściwości przesunięcia?
Element pozostanie wizualnie w swoim normalnym miejscu, ale stanie się **pozycjonowanym elementem**. Oznacza to, że będzie tworzył kontekst pozycjonowania dla swoich absolutnie pozycjonowanych potomków i będzie respektował właściwość z-index
.