position: absolute w jednym przykładzie
Element pozycjonowany absolutnie jest wyjmowany z normalnego przepływu i umieszczany za pomocą top, right, bottom i left. Te przesunięcia są mierzone od najbliższego przodka, którego position jest inne niż static, dlatego rodzic dostaje position: relative:
Usuń position: relative z .card, a plakietka przeskoczy do prawego górnego rogu całej strony, bo nie ma już pozycjonowanego przodka. Ta jedna linijka wyjaśnia większość pytań typu "position absolute nie działa".
Co warto wiedzieć o elementach absolute:
- Nie zajmują miejsca. Nagłówek i akapit są ułożone tak, jakby plakietki nie było.
- Ich szerokość kurczy się do treści, chyba że ustawisz
widthalbo jednocześnieleftiright. - Przesunięcia są mierzone do krawędzi paddingu bloku zawierającego, wewnątrz jego obramowania.
Pięć wartości position
| Wartość | W przepływie? | Przesunięcia mierzone od | Typowe użycie |
|---|---|---|---|
static (domyślna) | Tak | Przesunięcia są ignorowane | Zwykłe elementy |
relative | Tak, jego miejsce zostaje | Jego własnej normalnej pozycji | Punkt odniesienia dla dzieci absolute, drobne przesunięcia |
absolute | Nie | Najbliższego pozycjonowanego przodka (lub strony) | Plakietki, podpowiedzi, nakładki, przyciski zamykania |
fixed | Nie | Viewportu | Nagłówki, przyciski czatu, paski cookies |
sticky | Tak | Swojego kontenera przewijania, gdy osiągnie przesunięcie | Nagłówki tabel, tytuły sekcji, panele boczne |
position: relative
Element pozycjonowany względnie zostaje tam, gdzie był w przepływie. Przesunięcia zmieniają miejsce, w którym jest rysowany, ale jego pierwotna przestrzeń pozostaje zarezerwowana, więc nic wokół się nie przesuwa:
Pudełko 2 jest narysowane 20px niżej i 20px w prawo, zachodząc na pudełko 3, ale pudełko 3 się nie przesunęło: nadal zostawia miejsce na pudełko 2 w jego pierwotnym położeniu. Samo relative rzadko służy do przesuwania elementów; jego główne zadanie to bycie pudełkiem odniesienia dla dzieci absolute.
Przesunięcia i inset
top, right, bottom i left przyjmują długości, procenty (bloku zawierającego) i auto. Skrót inset ustawia wszystkie cztery w tej samej kolejności co margin:
.overlay {
position: absolute;
inset: 0; /* top: 0; right: 0; bottom: 0; left: 0; */
}
.corner {
position: absolute;
inset: auto 16px 16px auto; /* bottom right corner, 16px in */
}
Ustawienie przeciwległych stron rozciąga element: left: 0; right: 0 sprawia, że jest tak szeroki jak blok zawierający. inset: 0 na dziecku absolute to standardowy sposób na przykrycie karty nakładką.
Wyśrodkowanie przez absolute i transform
top: 50%; left: 50% umieszcza lewy górny róg elementu na środku. translate(-50%, -50%) przesuwa go potem z powrotem o połowę jego własnego rozmiaru:
Flexbox i grid wyśrodkowują prościej, gdy element może zostać w przepływie; strona o wyśrodkowaniu diva porównuje wszystkie metody.
position: fixed
Element fixed jest umieszczany względem viewportu i zostaje tam, gdy strona się przewija:
.chat-button {
position: fixed;
bottom: 16px;
right: 16px;
}
Dwie pułapki. Element fixed nie zajmuje miejsca, więc stały nagłówek zasłania górę strony, chyba że dodasz padding-top do body. A jeśli któryś przodek ma transform, filter lub perspective, to ten przodek, a nie viewport, staje się pudełkiem odniesienia, więc element przewija się razem z nim.
position: sticky
Element sticky przewija się normalnie, dopóki nie osiągnie swojego przesunięcia, a potem trzyma się tam, dopóki koniec jego rodzica nie przewinie się dalej. Przewiń pudełko poniżej:
Każda litera przykleja się do góry pudełka przewijania, dopóki jej sekcja jest widoczna, a potem zostaje wypchnięta przez następną, bo element sticky nigdy nie opuszcza swojego rodzica.
Gdy sticky się nie przykleja, sprawdź:
- Brak przesunięcia.
position: stickynic nie robi beztop,bottom,leftlubright. - Przodek z
overflow: hidden,autolubscroll. Staje się kontenerem przewijania, a jeśli w rzeczywistości się nie przewija, nic się nie przykleja. Użyjoverflow: clip, jeśli chcesz tylko ukryć przepełnienie. - Rodzic, który nie jest wyższy od elementu sticky. Nie ma w nim miejsca na przyklejenie.
- Rodzic flex lub grid, który go rozciąga. W wierszu flex dodaj
align-self: flex-startdo przyklejanego panelu bocznego.
Częste błędy
- Zapominanie o
position: relativena rodzicu elementu absolute. - Używanie absolute do układu strony. Elementy absolute ignorują siebie nawzajem i treść, więc na mniejszych ekranach tekst na siebie nachodzi. Do układu używaj flexboxa lub grid, a absolute do drobnych ozdób.
- Przesunięcia na elemencie static.
top: 10pxnic nie robi bezposition. - Walka o to, który element jest na wierzchu. Nachodzące na siebie pozycjonowane elementy są ustawiane według z-index.
- Stały nagłówek zasłaniający treść. Dodaj padding do strony albo
scroll-padding-top, żeby linki do kotwic lądowały pod nim.
Najczęściej zadawane pytania
Co robi position: absolute?
Wyjmuje element z normalnego przepływu (inne elementy zachowują się tak, jakby go nie było) i umieszcza go za pomocą top, right, bottom i left, mierzonych od jego bloku zawierającego: najbliższego przodka, którego position nie jest static.
Jak pozycjonować element absolutnie względem rodzica?
Nadaj rodzicowi position: relative;, a dziecku position: absolute; z przesunięciami, na przykład top: 0; right: 0;. Bez pozycjonowanego rodzica dziecko jest umieszczane względem strony.
Czym różni się position relative od absolute?
relative zostawia element w przepływie i zmienia tylko miejsce, w którym jest rysowany, zachowując jego pierwotną przestrzeń. absolute usuwa go z przepływu i umieszcza względem pozycjonowanego przodka.
Dlaczego position: sticky nie działa?
Zwykle z jednego z trzech powodów: nie ustawiono top (ani innego przesunięcia), jakiś przodek ma overflow: hidden lub auto i staje się kontenerem przewijania, albo rodzic elementu sticky nie jest wyższy od tego elementu, więc nie ma miejsca na przyklejenie.
Czym różni się fixed od sticky?
fixed jest usuwany z przepływu i przypięty do viewportu (chyba że któryś przodek ma transform lub filter). sticky zostaje w przepływie i przewija się normalnie, dopóki nie osiągnie swojego przesunięcia, a potem trzyma się, dopóki jego rodzic jest na ekranie.