6.5. Margines (margin
)
Wprowadzenie: Zewnętrzny odstęp wokół elementu
Właściwość margin
w CSS służy do tworzenia **zewnętrznego odstępu** wokół elementu, czyli przestrzeni między jego obramowaniem (border) a sąsiednimi elementami. Marginesy są kluczowe do kontrolowania rozmieszczenia elementów na stronie i tworzenia między nimi "oddechu".
Margines jest zawsze **przezroczysty** i nie przyjmuje koloru tła elementu.
Jedną z najważniejszych i czasem mylących cech marginesów pionowych jest ich **nakładanie się (margin collapsing)**, które omówimy szczegółowo w następnej lekcji.
Indywidualne właściwości margin-*
Podobnie jak padding, można ustawić margines dla każdej strony elementu niezależnie:
margin-top
: Margines górny.margin-right
: Margines prawy.margin-bottom
: Margines dolny.margin-left
: Margines lewy.
Wartościami tych właściwości mogą być:
<długość>
: Stała wartość w jednostkach długości (np.px
,em
,rem
). W przeciwieństwie do paddingu, marginesy **mogą przyjmować wartości ujemne**.<procent>
: Wartość procentowa obliczana względem **szerokości (width)** kontenera nadrzędnego (containing block) - dotyczy to **wszystkich czterech** właściwości marginesu.auto
: Specjalna wartość, która instruuje przeglądarkę, aby automatycznie obliczyła margines. Jest szczególnie ważna przy centrowaniu elementów blokowych.
.element {
margin-top: 20px;
margin-right: 10px;
margin-bottom: 25px;
margin-left: 5%; /* 5% szerokości rodzica */
}
.ujemny-margines {
margin-top: -10px; /* Element przesunie się o 10px w górę */
}
Właściwość zbiorcza margin
Podobnie jak padding
, właściwość zbiorcza margin
pozwala ustawić marginesy dla wszystkich czterech stron jednocześnie, używając jednej, dwóch, trzech lub czterech wartości:
- Jedna wartość:
margin: 20px;
(wszystkie strony) - Dwie wartości:
margin: 10px 20px;
(góra/dół, prawo/lewo) - Trzy wartości:
margin: 10px 20px 15px;
(góra, prawo/lewo, dół) - Cztery wartości:
margin: 10px 20px 15px 5px;
(góra, prawo, dół, lewo)
Właściwość zbiorcza margin
może również przyjmować wartość auto
.
.przyklad-1 { margin: 15px; }
.przyklad-2 { margin: 10px 30px; }
.przyklad-3 { margin: 5px 10px 15px; }
.przyklad-4 { margin: 5px 10px 15px 20px; }
Centrowanie elementów blokowych za pomocą margin: auto;
Jednym z najczęstszych zastosowań wartości auto
dla marginesów jest **poziome centrowanie elementu blokowego** o określonej szerokości wewnątrz jego kontenera nadrzędnego.
Aby to osiągnąć, należy:
- Nadać elementowi blokowemu **określoną szerokość** (
width
), mniejszą niż szerokość rodzica. - Ustawić jego lewy i prawy margines na
auto
. Najprościej zrobić to za pomocą skrótu:margin: 0 auto;
(ustawia 0 marginesu góra/dół i automatyczny margines lewo/prawo) lubmargin-left: auto; margin-right: auto;
.
Przeglądarka automatycznie rozdzieli dostępną przestrzeń poziomą równo między lewy i prawy margines, efektywnie centrując element.
.kontener {
width: 500px; /* Określona szerokość */
margin: 20px auto; /* 20px marginesu góra/dół, auto lewo/prawo -> centrowanie */
background-color: lightcyan;
border: 1px solid blue;
padding: 10px;
}
Uwaga: Ustawienie margin-top: auto;
lub margin-bottom: auto;
zazwyczaj skutkuje wartością 0
i nie centruje elementu w pionie w standardowym przepływie dokumentu. Pionowe centrowanie wymaga innych technik (np. Flexbox, Grid, pozycjonowanie absolutne).
Ujemne marginesy
Ujemne wartości marginesów powodują, że element "wchodzi" na przestrzeń sąsiednich elementów lub swojego rodzica. Mogą być używane do tworzenia efektów nachodzenia na siebie lub do kompensowania innych odstępów, ale należy ich używać ostrożnie, ponieważ mogą łatwo zaburzyć layout.
.box1 {
background-color: red;
height: 50px;
margin-bottom: 10px;
}
.box2 {
background-color: blue;
height: 50px;
margin-top: -20px; /* Box2 nachodzi na Box1 o 10px (10px - 20px = -10px) */
}
Marginesy a elementy inline
Dla elementów inline
(np. <span>
, <a>
):
- Marginesy poziome (
margin-left
,margin-right
) działają zgodnie z oczekiwaniami, tworząc odstęp od sąsiednich elementów w linii. - Marginesy pionowe (
margin-top
,margin-bottom
) **nie mają wpływu** na otaczające elementy ani na wysokość linii.
Aby móc stosować marginesy pionowe do elementu, który normalnie jest inline, należy zmienić jego display
na inline-block
lub block
.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz główny kontener strony (div
z klasą .main-content
). Nadaj mu szerokość 90%
, maksymalną szerokość 1000px
i wycentruj go na stronie.
Rozwiązanie:
HTML:
<div class="main-content">
<!-- Treść strony -->
</div>
CSS:
.main-content {
width: 90%;
max-width: 1000px;
margin: 0 auto; /* Centrowanie */
padding: 20px; /* Opcjonalny padding wewnętrzny */
background-color: #fff; /* Opcjonalne tło */
}
Efekt: Główny kontener strony będzie responsywny (90% szerokości okna), ale nie szerszy niż 1000px i zawsze wyśrodkowany.
Zadanie 2 (do samodzielnego wykonania)
Stwórz trzy paragrafy (<p>
) jeden pod drugim. Nadaj każdemu z nich margin-bottom: 20px;
. Zmierz odstęp między nimi w narzędziach deweloperskich. Czy jest on równy 20px czy 40px? Dlaczego?
Zadanie 3 (do samodzielnego wykonania)
Stwórz dwa elementy div
obok siebie (możesz użyć display: inline-block;
). Nadaj pierwszemu margin-right: -15px;
. Zaobserwuj, jak drugi element nachodzi na pierwszy.
FAQ - Najczęściej zadawane pytania
Czy marginesy są wliczane do całkowitego rozmiaru elementu?
Nie, marginesy tworzą przestrzeń *wokół* elementu (na zewnątrz obramowania) i nie są wliczane do jego obliczonej szerokości czy wysokości, niezależnie od wartości box-sizing
. Wpływają one na pozycję elementu względem innych.
Czy procentowy margines zawsze odnosi się do szerokości rodzica?
Tak, podobnie jak w przypadku paddingu, wartości procentowe dla margin-top
, margin-right
, margin-bottom
i margin-left
zawsze odnoszą się do **szerokości** bloku zawierającego (containing block).
Jak usunąć domyślne marginesy przeglądarki?
Wiele przeglądarek dodaje domyślne marginesy do niektórych elementów, np. body
, h1-h6
, p
, ul
. Powszechną praktyką jest resetowanie tych marginesów na początku pliku CSS, np. body, h1, h2, p, ul { margin: 0; padding: 0; }
lub użycie bardziej kompleksowych resetów CSS (jak Normalize.css).
Co to jest nakładanie się marginesów (margin collapsing)?
Jest to zjawisko, w którym pionowe marginesy (margin-top
i margin-bottom
) dwóch sąsiadujących elementów blokowych (lub rodzica i pierwszego/ostatniego dziecka) łączą się w jeden margines, którego rozmiar jest równy **większemu** z dwóch nakładających się marginesów (a nie ich sumie). Zostanie to szczegółowo omówione w następnej lekcji.