Kurs HTML

7.3. Właściwość position: static i relative

Strona główna > Kurs CSS > Rozdział 7: Wyświetlanie i Pozycjonowanie > Właściwość 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) oraz z-index **nie mają żadnego wpływu** na elementy z position: 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.
    Wartości mogą być dodatnie lub ujemne. Jeśli ustawisz jednocześnie top i bottom (lub left i right), przeglądarka zazwyczaj uwzględni top (lub left) 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ą ustawione position: 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 (mieszanka relative i fixed).

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.