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:
block | inline | inline-block | |
|---|---|---|---|
| Zaczyna się w nowej linii | Tak | Nie | Nie |
| Domyślna szerokość | Wypełnia kontener | Dopasowana do treści | Dopasowana do treści |
width i height | Działają | Ignorowane | Działają |
| Pionowy margines | Działa | Ignorowany | Działa |
| Pionowy padding | Odpycha treść | Rysowany, ale nie rozsuwa linii | Odpycha treść |
| Typowe elementy | div, p, h1, ul, section | span, a, strong, em | button, 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: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| Zajmuje miejsce | Nie | Tak | Tak |
| Można go kliknąć | Nie | Nie | Tak |
| Odczytywany przez czytniki ekranu | Nie | Nie | Tak |
| Da się płynnie animować | Nie | Nie | Tak |
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: flexukłada dzieci w jednym rzędzie albo kolumnie i pozwala sterować wyrównaniem i odstępami. Zobacz flexbox.display: gridrozmieszcza 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-root | Blok, który obejmuje swoje elementy pływające i nie pozwala marginesom dzieci wyciekać na zewnątrz; nowoczesny "clearfix" |
contents | Wł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-item | Blok ze znacznikiem listy, domyślny dla li |
table, table-row, table-cell | Układ tabeli na elementach, które nie są tabelą |
inline-flex, inline-grid | Kontener flex albo grid, który stoi w linii |
Częste błędy
- Ustawianie
widthalboheightnaspanluba. Elementy liniowe je ignorują. Użyjinline-blockalboblock. - Pionowy margines na elemencie liniowym. Też jest ignorowany. Rozwiązanie to samo.
- Używanie
display: nonedo 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
displaynadpisująca atrybuthidden. Wygrywa reguła CSS. - Próba animowania
display. Ustawieniedisplay: noneukrywa element od razu, bez przenikania; animujopacityi przełączdisplay(albovisibility) 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.