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.
topibottom(lubleftiright), 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 (mieszankarelativeifixed).
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.