7.1. Właściwość display
: block
, inline
, inline-block
display
: block
, inline
, inline-block
Wprowadzenie: Jak element jest wyświetlany?
Właściwość display
w CSS jest jedną z najważniejszych właściwości kontrolujących layout. Określa ona, jak element HTML jest traktowany w przepływie dokumentu i jak oddziałuje z innymi elementami. Decyduje o tym, czy element generuje "pudełko" blokowe czy liniowe, co wpływa na jego rozmiar, marginesy, padding i pozycję.
Każdy element HTML ma domyślną wartość display
(np. <div>
i <p>
to block
, a <span>
i <a>
to inline
), ale możemy ją zmienić za pomocą CSS, aby dostosować układ strony.
W tej lekcji skupimy się na trzech podstawowych wartościach: block
, inline
i inline-block
.
display: block;
Elementy z display: block;
(elementy blokowe) charakteryzują się następującymi cechami:
- Zaczynają się w nowej linii: Zawsze powodują przełamanie linii przed i po sobie.
- Zajmują całą dostępną szerokość: Domyślnie rozciągają się na 100% szerokości swojego kontenera nadrzędnego (chyba że jawnie ustawiono im
width
). - Respektują
width
iheight
: Można im jawnie ustawić szerokość i wysokość. - Respektują marginesy i paddingi: Można im ustawiać marginesy (
margin
) i wypełnienia (padding
) ze wszystkich czterech stron (góra, prawo, dół, lewo), które wpływają na otaczające elementy. - Przykładami domyślnych elementów blokowych są:
<div>
,<p>
,<h1>
-<h6>
,<ul>
,<ol>
,<li>
,<form>
,<header>
,<footer>
,<section>
,<article>
.
div {
display: block; /* Domyślne dla div */
width: 300px;
height: 100px;
margin: 10px;
padding: 15px;
background-color: lightblue;
border: 1px solid blue;
}
span.make-block {
display: block; /* Zmienia span w element blokowy */
margin-bottom: 10px;
background-color: lightyellow;
}
display: inline;
Elementy z display: inline;
(elementy liniowe lub śródliniowe) charakteryzują się następującymi cechami:
- Nie zaczynają się w nowej linii: Układają się w jednej linii z otaczającą treścią i innymi elementami inline, dopóki nie zabraknie miejsca (wtedy następuje zawinięcie).
- Szerokość i wysokość dopasowują się do treści: Ich wymiary wynikają tylko z zawartości.
- Ignorują
width
iheight
: Jawne ustawienie szerokości i wysokości jest ignorowane. - Ograniczone respektowanie marginesów i paddingów:
- Marginesy i paddingi poziome (
margin-left/right
,padding-left/right
) działają i odsuwają element od sąsiadów w linii. - Marginesy i paddingi pionowe (
margin-top/bottom
,padding-top/bottom
) **nie wpływają** na otaczające elementy ani na wysokość linii (choć padding pionowy może wizualnie nachodzić na inne linie).
- Marginesy i paddingi poziome (
- Przykładami domyślnych elementów inline są:
<span>
,<a>
,<strong>
,<em>
,<img>
(choćimg
ma pewne cechy inline-block),<button>
,<input>
,<label>
.
span {
display: inline; /* Domyślne dla span */
padding: 5px 10px; /* Padding poziomy działa, pionowy nie wpływa na układ */
margin: 0 5px; /* Marginesy poziome działają */
background-color: lightpink;
/* width: 100px; - ignorowane */
/* height: 50px; - ignorowane */
/* margin-top: 10px; - ignorowane dla układu */
}
div.make-inline {
display: inline; /* Zmienia div w element liniowy */
background-color: lightgreen;
}
display: inline-block;
Elementy z display: inline-block;
łączą cechy elementów inline i block:
- Nie zaczynają się w nowej linii: Układają się w jednej linii z innymi elementami inline lub inline-block (jak elementy
inline
). - Respektują
width
iheight
: Można im jawnie ustawić szerokość i wysokość (jak elementyblock
). - Respektują marginesy i paddingi: Można im ustawiać marginesy i paddingi ze wszystkich czterech stron, które wpływają na otaczające elementy (jak elementy
block
).
inline-block
jest bardzo przydatny do tworzenia elementów, które mają zachowywać się jak bloki (mieć wymiary, marginesy), ale jednocześnie układać się obok siebie w linii, np. przyciski, elementy nawigacji, małe karty.
button, .card {
display: inline-block; /* Domyślne dla button, ustawiamy dla .card */
width: 150px;
padding: 10px;
margin: 5px;
background-color: beige;
border: 1px solid brown;
text-align: center;
}
span.make-inline-block {
display: inline-block;
width: 80px;
height: 40px;
margin: 10px;
background-color: lightcoral;
}
Problem z odstępami w inline-block
: Elementy inline-block
traktują białe znaki (spacje, entery) w kodzie HTML między nimi jako pojedynczą spację, co może powodować niechciane odstępy wizualne. Można to obejść, np. usuwając białe znaki w HTML, ustawiając font-size: 0;
na rodzicu (i przywracając go na dzieciach) lub używając Flexbox/Grid.
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Masz listę nieuporządkowaną (<ul>
) z kilkoma elementami (<li>
). Domyślnie li
to elementy blokowe. Zmień ich display
na inline-block
, aby ułożyły się w jednej linii (np. tworząc menu poziome).
Rozwiązanie:
HTML:
<ul class="horizontal-menu">
<li>Start</li>
<li>O nas</li>
<li>Kontakt</li>
</ul>
CSS:
.horizontal-menu {
list-style: none; /* Usuń kropki */
padding: 0;
margin: 0;
}
.horizontal-menu li {
display: inline-block;
margin-right: 15px; /* Odstęp między elementami */
padding: 5px 10px;
background-color: #f0f0f0;
}
Efekt: Elementy listy ułożą się poziomo obok siebie.
Zadanie 2 (do samodzielnego wykonania)
Stwórz element <span>
z tekstem. Spróbuj nadać mu width: 200px;
, height: 50px;
i margin-top: 20px;
. Zaobserwuj, które z tych właściwości zostaną zignorowane. Następnie zmień jego display
na block
i zobacz różnicę.
Zadanie 3 (do samodzielnego wykonania)
Stwórz trzy elementy div
. Nadaj im display: inline-block;
, szerokość 100px
, wysokość 100px
, różne tła i margin: 10px;
. Zobacz, jak układają się obok siebie i jak respektują marginesy ze wszystkich stron.
FAQ - Najczęściej zadawane pytania
Czy <img>
to element inline czy block?
Domyślnie <img>
jest elementem zastępowanym (replaced element) i zachowuje się podobnie do inline-block
. Układa się w linii, ale respektuje width
i height
. Można mu również nadawać marginesy i paddingi.
Kiedy używać block
, inline
, a kiedy inline-block
?
Używaj block
dla głównych sekcji strony, akapitów, nagłówków - elementów, które mają zajmować całą szerokość lub mieć określone wymiary i być oddzielone od reszty. Używaj inline
dla fragmentów tekstu wewnątrz bloków, które mają być częścią przepływu tekstu (np. wyróżnienia, linki). Używaj inline-block
dla elementów, które mają mieć wymiary i marginesy jak bloki, ale układać się w linii (np. przyciski, elementy menu, małe karty).
Czy istnieją inne wartości dla display
?
Tak, istnieje wiele innych wartości, które zmieniają sposób wyświetlania i kontekst formatowania elementu. Najważniejsze z nich to none
(ukrywa element), flex
(tworzy kontener Flexbox), grid
(tworzy kontener Grid), table
, table-cell
itp. (do tworzenia układów tabelarycznych). Zostaną one omówione w kolejnych lekcjach i rozdziałach.
Jak pozbyć się odstępów między elementami inline-block
?
Istnieje kilka metod: usunięcie białych znaków między elementami w kodzie HTML, ustawienie font-size: 0;
na rodzicu (i przywrócenie go na dzieciach), użycie komentarzy HTML między elementami (<!-- -->
) lub, co jest najczystszym rozwiązaniem, użycie Flexbox lub Grid dla kontenera tych elementów.