Czym jest margin
Margin to przestrzeń na zewnątrz obramowania elementu. Jest zawsze przezroczysta, a jej zadaniem jest odpychanie innych elementów. W przykładzie szary kontener prześwituje przez margines wokół niebieskiego pudełka:
Szary pas nie jest częścią pudełka: tło pudełka kończy się na jego obramowaniu. Dla przestrzeni, która ma tło elementu, użyj padding.
Skrócony zapis margin
margin przyjmuje od jednej do czterech wartości, w tej samej kolejności zgodnej z ruchem wskazówek zegara co padding:
| Deklaracja | Góra | Prawo | Dół | Lewo |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
Każda strona ma też własną właściwość (margin-top, margin-right, margin-bottom, margin-left) oraz wersje logiczne, które podążają za kierunkiem tekstu (margin-inline-start, margin-inline-end, margin-block, margin-inline).
W przeciwieństwie do padding margin przyjmuje auto i wartości ujemne:
| Wartość | Przykład | Uwagi |
|---|---|---|
| Długość | 16px, 1.5rem | Najczęstsza |
| Procent | 5% | Szerokości bloku zawierającego, dla wszystkich czterech stron |
auto | margin: 0 auto | Przeglądarka wypełnia pozostałą przestrzeń |
| Ujemna | margin-top: -10px | Przyciąga element lub jego sąsiada bliżej, może powodować nachodzenie |
Wyśrodkowanie przez margin: 0 auto
margin: 0 auto to klasyczny sposób na wyśrodkowanie bloku w poziomie. auto po obu stronach mówi przeglądarce, żeby podzieliła pozostałą przestrzeń po równo. Potrzebna jest szerokość mniejsza niż kontener, inaczej nie zostaje nic do podzielenia:
Marginesy auto nie wyśrodkowują w pionie w zwykłym przepływie (pionowe marginesy auto stają się 0) i nic nie robią na elementach liniowych. Pełny przegląd sposobów wyśrodkowania znajdziesz na stronie jak wyśrodkować diva.
Zapadanie się marginesów
Gdy stykają się dwa pionowe marginesy, nie sumują się. Przeglądarka zachowuje tylko większy. Tutaj pierwsze pudełko ma margin-bottom: 30px, a drugie margin-top: 20px, a odstęp między nimi wynosi 30px, a nie 50px:
Zapadanie się jest celowe: pozwala akapitom i nagłówkom mieć własne odstępy bez podwajania ich tam, gdzie się spotykają. Zaskakuje jednak w drugim przypadku, gdy górny margines dziecka wydostaje się z rodzica:
W pierwszym rodzicu margines 30px dziecka zapadł się przez górną krawędź rodzica, więc spycha w dół całego rodzica zamiast tworzyć szarą przestrzeń w jego wnętrzu. Zatrzyma to każde z tych rozwiązań:
display: flow-rootna rodzicu (w przeciwieństwie dooverflow: hiddenniczego nie przycina).- Padding albo obramowanie przy górnej krawędzi rodzica.
- Rodzic flex lub grid: marginesy elementów flex i grid nigdy się nie zapadają.
Poziome marginesy nigdy się nie zapadają, podobnie jak marginesy elementów z float lub pozycjonowanych absolutnie.
Ujemne marginesy
Ujemny margines ciągnie w przeciwnym kierunku. Po stronie górnej lub początkowej przesuwa sam element; po stronie dolnej lub końcowej przyciąga bliżej następny element. Pudełka mogą na siebie nachodzić:
margin auto we flexboxie
Wewnątrz kontenera flex margines auto zabiera całą wolną przestrzeń po swojej stronie. To najprostszy sposób, żeby zepchnąć jeden element na sam koniec wiersza, a we flexboxie auto działa też w pionie:
margin-inline-start: auto umieszcza wolną przestrzeń przed "Log in", na końcu wiersza zarówno na stronach pisanych od lewej do prawej, jak i od prawej do lewej.
Częste błędy
margin: 0 autona elemencie bez szerokości. Blok już wypełnia swój kontener; ustawwidthalbomax-width.margin: autona elemencie liniowym. Marginesy auto naspan,alubimgpozostawionym jako liniowy wynoszą 0. Nadaj mudisplay: block.- Dodawanie dwóch pionowych marginesów i oczekiwanie sumy. Zapadają się do większego; użyj
gapwe flex lub grid albo konsekwentnie jednego kierunku marginesu. - Margines dziecka spychający rodzica. To zapadanie się między rodzicem a dzieckiem; dodaj rodzicowi
display: flow-root. - Używanie margin dla przestrzeni, która ma mieć tło. Margin jest przezroczysty; użyj padding.
Najczęściej zadawane pytania
Czym jest margin w CSS?
Margin to przestrzeń na zewnątrz obramowania elementu. Jest przezroczysta i odpycha sąsiednie elementy. Ustawia się ją przez margin albo właściwości dla pojedynczych stron margin-top, margin-right, margin-bottom i margin-left.
Co robi margin: 0 auto?
Ustawia górny i dolny margines na 0, a pozostałą przestrzeń poziomą dzieli po równo między lewy i prawy margines, co wyśrodkowuje element blokowy w poziomie. Element potrzebuje szerokości mniejszej niż jego kontener, na przykład max-width: 600px.
Dlaczego margin auto nie wyśrodkowuje mojego elementu?
Zwykle dlatego, że element nie ma szerokości (blok wypełnia swój kontener, więc nie ma czego dzielić), albo dlatego, że jest liniowy (span, a, img domyślnie), a wtedy marginesy auto wynoszą 0. Nadaj mu szerokość i display: block albo wyśrodkuj go z poziomu rodzica flexboxem lub grid.
Czym jest zapadanie się marginesów?
Gdy stykają się dwa pionowe marginesy, na przykład dolny margines jednego akapitu i górny margines następnego, przeglądarka używa tylko większego z nich zamiast je sumować. Dzieje się to tylko z pionowymi marginesami bloków w zwykłym przepływie, nie w układach flex ani grid.
Czy margin może być ujemny?
Tak. Ujemny margines przyciąga element w stronę tej krawędzi albo przyciąga następny element nad niego, więc pudełka mogą na siebie nachodzić. Przydaje się do drobnych poprawek wyrównania i do wypuszczenia elementu poza padding kontenera.