Menu

Display w CSS: block, inline, inline-block, none i flex

Właściwość display decyduje o tym, jak element uczestniczy w układzie strony. Poznaj block, inline i inline-block na zmierzonych pudełkach obok siebie, display none a visibility hidden oraz miejsce flex, grid, flow-root i contents.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Co robi display

Każdy element ma wartość display, która decyduje o tym, jak jest układany. Trzy pierwsze, które poznajesz, to block, inline i inline-block. Oto trzy identyczne pudełka, z tymi samymi width, height, padding i margin, różni je tylko display:

blockinlineinline-block
Zaczyna się w nowej liniiTakNieNie
Domyślna szerokośćWypełnia kontenerDopasowana do treściDopasowana do treści
width i heightDziałająIgnorowaneDziałają
Pionowy marginesDziałaIgnorowanyDziała
Pionowy paddingOdpycha treśćRysowany, ale nie rozsuwa liniiOdpycha treść
Typowe elementydiv, p, h1, ul, sectionspan, a, strong, embutton, input, img (elementy zastępowane zachowują się w ten sposób)

W podglądzie pudełko blokowe stoi w osobnej linii i ma 120px szerokości. Liniowe ignoruje szerokość i wysokość i otacza tylko swoje słowo, a jego pionowy padding i obramowanie wystają nad i pod linię, nie zwiększając jej wysokości. Pudełko inline-block zostaje w linii tekstu, ale zachowuje pełny rozmiar.

display: block

Element blokowy zajmuje całą dostępną szerokość i przenosi to, co po nim następuje, do nowej linii. Zamiana odnośnika w blok to sposób na klikalny cały wiersz:

.menu a {
  display: block;       /* the full row is the link */
  padding: 10px 16px;
}

Szerokość bloku można ustawić, a gdy ją ma, margin: 0 auto go wyśrodkowuje, co pokazuje strona o wyśrodkowaniu diva.

display: inline-block

inline-block to rozwiązanie pośrednie: płynie w linii jak słowo, ale możesz nadać mu rozmiar. Przydaje się do znaczków, przycisków i ikon w tekście:

Kilka pudełek inline-block w rzędzie dostaje między sobą mały odstęp z białych znaków w HTML. Do rzędów pudełek lepiej nadaje się display: flex na rodzicu.

display: none a visibility: hidden

Obie sprawiają, że element jest niewidoczny. Różnica polega na tym, czy zachowuje swoje miejsce:

display: nonevisibility: hiddenopacity: 0
Zajmuje miejsceNieTakTak
Można go kliknąćNieNieTak
Odczytywany przez czytniki ekranuNieNieTak
Da się płynnie animowaćNieNieTak

Atrybut HTML hidden działa tak samo jak display: none przez arkusz stylów przeglądarki, co oznacza, że każda reguła CSS ustawiająca display na elemencie (na przykład .card { display: flex; }) go nadpisuje i element znów się pokazuje. Dodaj [hidden] { display: none !important; }, jeśli to ci przeszkadza.

Żeby ukryć coś wizualnie, ale zostawić dla czytników ekranu (na przykład etykietę przycisku z ikoną), użyj klasy "visually hidden" zamiast display: none.

display: flex i display: grid

Te dwie wartości zamieniają element w kontener układu dla jego dzieci:

  • display: flex układa dzieci w jednym rzędzie albo kolumnie i pozwala sterować wyrównaniem i odstępami. Zobacz flexbox.
  • display: grid rozmieszcza dzieci jednocześnie w wierszach i kolumnach.

Sam kontener pozostaje blokiem. inline-flex i inline-grid robią to samo z dziećmi, ale sprawiają, że kontener płynie w linii, jak inline-block.

Pozostałe wartości

WartośćCo robi
flow-rootBlok, który obejmuje swoje elementy pływające i nie pozwala marginesom dzieci wyciekać na zewnątrz; nowoczesny "clearfix"
contentsWłasne pudełko elementu znika, a jego dzieci działają jak dzieci jego rodzica. Unikaj na przyciskach, listach i tabelach: niektóre przeglądarki gubią wtedy znaczenie elementu dla czytników ekranu
list-itemBlok ze znacznikiem listy, domyślny dla li
table, table-row, table-cellUkład tabeli na elementach, które nie są tabelą
inline-flex, inline-gridKontener flex albo grid, który stoi w linii

Częste błędy

  • Ustawianie width albo height na span lub a. Elementy liniowe je ignorują. Użyj inline-block albo block.
  • Pionowy margines na elemencie liniowym. Też jest ignorowany. Rozwiązanie to samo.
  • Używanie display: none do ukrycia tekstu przeznaczonego dla czytników ekranu. Ukrywa go również przed nimi.
  • Oczekiwanie, że dziecko pokaże się w rodzicu z display: none. Nic w ukrytym rodzicu się nie renderuje.
  • Reguła display nadpisująca atrybut hidden. Wygrywa reguła CSS.
  • Próba animowania display. Ustawienie display: none ukrywa element od razu, bez przenikania; animuj opacity i przełącz display (albo visibility) na końcu.

Najczęściej zadawane pytania

Czym różnią się block, inline i inline-block?

Element block zaczyna się w nowej linii i wypełnia dostępną szerokość. Element inline płynie w tekście i ignoruje width, height i pionowe marginesy. inline-block płynie w tekście jak inline, ale przyjmuje szerokość, wysokość, padding i marginesy jak blok.

Co robi display: none?

Całkowicie usuwa element ze strony: nie zajmuje miejsca, nie jest renderowany i jest ukryty przed czytnikami ekranu. Jego dzieci są ukryte razem z nim i nie da się ich pokazać ich własną wartością display.

Czym różni się display: none od visibility: hidden?

display: none usuwa element i jego miejsce. visibility: hidden sprawia, że jest niewidoczny, ale zachowuje jego miejsce w układzie, więc nic się nie przesuwa.

Czy div jest domyślnie blokowy czy liniowy?

Blokowy. div, p, nagłówki, ul, section i form są domyślnie blokowe; span, a, strong, em, img, input i button są liniowe albo inline-block.

Skąd odstęp między elementami inline-block?

Biały znak między znacznikami w HTML jest renderowany jako spacja, tak jak między słowami. Zamiast tego użyj na rodzicu display: flex z gap albo usuń biały znak.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ