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ą
widthiheight: 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ą
widthiheight: 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ćimgma 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ą
widthiheight: 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.