Zagłębianie się w właściwość wyświetlania: dwie wartości wyświetlania

Opublikowany: 2022-03-10
Krótkie podsumowanie ↬ Dużo mówimy o Flexbox i CSS Grid Layout, ale te metody układu są zasadniczo wartościami właściwości display CSS, koniem pociągowym właściwości, na którą nie zwraca się zbyt wiele uwagi. Rachel Andrew przygląda się lepiej w krótkiej serii.

Układ flex lub grid zaczyna się od zadeklarowania display: flex lub display: grid . Te metody układu są wartościami właściwości display CSS. Zwykle nie mówimy zbyt wiele o tej właściwości, zamiast tego koncentrujemy się na wartościach flex lub grid , jednak jest kilka interesujących rzeczy do zrozumienia na temat display i tego, jak jest zdefiniowany, które znacznie ułatwią Ci życie podczas korzystania CSS dla układu.

W tym artykule, pierwszym z krótkiej serii, przyjrzę się sposobowi definiowania wartości display w specyfikacji Level 3. Jest to zmiana w sposobie definiowania display we wcześniejszych wersjach CSS. Choć na początku może się to wydawać niezwykłe dla tych z nas, którzy zajmują się CSS od wielu lat, myślę, że te zmiany naprawdę pomagają wyjaśnić, co się dzieje, gdy zmieniamy wartość display na elemencie.

Elementy blokowe i wbudowane

Jedną z pierwszych rzeczy, których uczymy osoby, które są nowe w CSS, są koncepcje elementów blokowych i wbudowanych. Wyjaśnimy, że niektóre elementy na stronie są display: block się i mają z tego powodu pewne funkcje. Rozciągają się w kierunku w linii, zajmując tyle miejsca, ile jest dla nich dostępne. Wkraczają na nową linię; możemy nadać im szerokość, wysokość, margines oraz dopełnienie, a te właściwości odsuną od nich inne elementy na stronie.

Wiemy również, że display: inline . Elementy śródliniowe są jak słowa w zdaniu; nie przełamują się do nowej linii, lecz rezerwują między nimi znak odstępu. Jeśli dodasz marginesy i dopełnienie, zostanie to wyświetlone, ale nie odsunie innych elementów.

Zachowanie elementów blokowych i wbudowanych ma fundamentalne znaczenie dla CSS oraz fakt, że prawidłowo oznaczony dokument HTML będzie domyślnie czytelny. Układ ten jest określany jako „Układ blokowy i wbudowany” lub „Normalny przepływ”, ponieważ w ten sposób układają się elementy, jeśli nie zrobimy z nimi nic innego.

Więcej po skoku! Kontynuuj czytanie poniżej ↓

Wewnętrzne i zewnętrzne wartości display

Rozumiemy elementy blokowe i wbudowane, ale co się stanie, jeśli display: grid ? Czy to coś zupełnie innego? Jeśli spojrzymy na komponent, dla którego określiliśmy display: grid , pod względem elementu nadrzędnego w układzie zachowuje się on jak element block level . Element rozciągnie się i zajmie tyle miejsca w wymiarze wbudowanym, ile jest dostępne, rozpocznie się w nowej linii. Zachowuje się jak element block pod względem tego, jak zachowuje się wraz z resztą układu. Nie powiedzieliśmy display: block , czy nie?

Okazuje się, że mamy. Na poziomie 3 specyfikacji Display, wartość display jest definiowana jako dwa słowa kluczowe. Te słowa kluczowe definiują zewnętrzną wartość wyświetlania, która będzie inline lub block a zatem definiują zachowanie elementu w układzie obok innych elementów. Definiują również wewnętrzną wartość elementu — lub sposób, w jaki zachowują się bezpośrednie dzieci tego elementu.

Oznacza to, że kiedy mówisz display: grid , tak naprawdę mówisz display: block grid . Pytasz o pojemnik z siatką na poziomie bloku. Element, który będzie miał wszystkie atrybuty bloku — możesz nadać mu wysokość i szerokość, margines i dopełnienie, a rozciągnie się, aby wypełnić kontener. Potomkom tego kontenera nadano jednak wewnętrzną wartość grid , więc stają się elementami siatki. To, jak zachowują się te elementy siatki, jest zdefiniowane w specyfikacji CSS Grid: specyfikacja display umożliwia nam poinformowanie przeglądarki, że jest to metoda układu, której chcemy użyć.

Myślę, że taki sposób myślenia o display jest niezwykle pomocny; wyjaśnia bezpośrednio, co robimy z różnymi metodami układu. Gdybyś miał określić display: inline flex , czego byś się spodziewał? Mamy nadzieję, że pudełko, które zachowuje się jak element wbudowany, z elementami potomnymi, które są elementami elastycznymi.

Jest kilka innych rzeczy, które można zgrabnie wyjaśnić, myśląc o display w ten nowy sposób, a niektórym z nich przyjrzę się w dalszej części tego artykułu.

Zawsze wracamy do normalnego przepływu

Myśląc o tych wewnętrznych i zewnętrznych właściwościach wyświetlania, pomocne może być zastanowienie się, co się stanie, jeśli w ogóle nie będziemy bawić się wartością wyświetlania. Jeśli napiszesz kod HTML i wyświetlisz go w przeglądarce, otrzymasz układ blokowy i wbudowany lub normalny przepływ. Elementy są wyświetlane jako elementy block lub inline .

Zobacz blok pisakowy i układ w wierszu autorstwa Rachel Andrew.

Zobacz blok pisakowy i układ w wierszu autorstwa Rachel Andrew.

Poniższy przykład zawiera pewne znaczniki, które przekształciłem w obiekt multimedialny, dzięki wyświetlaniu div display: flex (dwa bezpośrednie dzieci) stają się teraz elementami flex, więc obraz jest teraz w rzędzie z zawartością. Jeśli jednak zobaczysz w treści, nagłówek i akapit, które są ponownie wyświetlane w normalnym toku. Bezpośrednie elementy potomne obiektu multimedialnego stały się elementami elastycznymi; ich dzieci wracają do normalnego przepływu, chyba że zmienimy wartość wyświetlania w elemencie flex. Sam kontener flex jest pudełkiem blokowym, co widać po tym, że obramowanie rozciąga się do krawędzi jego rodzica.

Zobacz blok pisakowy i układ wbudowany z komponentem Flex autorstwa Rachel Andrew.

Zobacz blok pisakowy i układ wbudowany z komponentem Flex autorstwa Rachel Andrew.

Jeśli pracujesz z tym procesem, fakt, że elementy na twojej stronie będą układać się z tym ładnym, czytelnym układem normalnego przepływu, zamiast walczyć z nim i próbować umieścić wszystko, CSS jest znacznie prostszy. Jest również mniej prawdopodobne, że popadniesz w problemy z ułatwieniami dostępu, ponieważ pracujesz z kolejnością dokumentów, czyli dokładnie tak, jak robi to czytnik ekranu lub osoba przeglądająca dokument.

Wyjaśnienie flow-root i inline-block

Wartość inline-block jest prawdopodobnie znana wielu z nas, którzy od jakiegoś czasu zajmują się CSS. Ta wartość jest sposobem na uzyskanie niektórych zachowań blokowych elementu inline . Na przykład element inline-block może mieć szerokość i wysokość. Element z display: inline-block zachowuje się również w ciekawy sposób, tworząc treść blokującą formatowanie (BFC).

BFC robi kilka przydatnych rzeczy pod względem układu, na przykład zawiera elementy pływające. Więcej informacji na temat kontekstów formatowania bloków można znaleźć w moim poprzednim artykule „Zrozumienie układu CSS i kontekstu formatowania bloków”. Dlatego mówiąc display: inline-block daje ci pole inline, które również ustanawia BFC.

Jak odkryjesz (jeśli przeczytasz wyżej wspomniany artykuł o kontekście formatowania bloków), istnieje nowsza wartość wyświetlania, która również jawnie tworzy BFC. Jest to wartość flow-root . Ta wartość tworzy BFC na bloku, a nie na elemencie wbudowanym.

  • display: inline-block daje BFC na inline boxie.
  • display: flow-root daje BFC na polu blokowym.

Prawdopodobnie myślisz teraz, że to wszystko jest trochę zagmatwane: dlaczego mamy tutaj dwa zupełnie różne słowa kluczowe i co się stało ze składnią dwuwartościową, o której mówiliśmy wcześniej? To prowadzi do kolejnej rzeczy, którą muszę wyjaśnić na temat display , tj. do faktu, że CSS ma historię, z którą musimy się uporać pod względem właściwości display .

Starsze wartości wyświetlania

Specyfikacja CSS2 wyszczególnia następujące wartości właściwości display :

  • inline
  • block
  • inline-block
  • list-item
  • none
  • table
  • inline-table

Zdefiniowano również różne wewnętrzne właściwości tabeli, takie jak table-cell którymi nie zajmujemy się w tym artykule.

Następnie dodaliśmy do tych wartości do wyświetlania, aby wspierać układ elastyczny i siatki:

  • grid
  • inline-grid
  • flex
  • inline-flex

Uwaga : Specyfikacja definiuje również ruby ​​i inline-ruby do obsługi tekstu w języku Ruby, o którym możesz przeczytać w specyfikacji Ruby.

Są to wszystkie pojedyncze wartości właściwości display , zdefiniowane przed aktualizacją specyfikacji w celu wyjaśnienia układu CSS w ten sposób. Coś bardzo ważnego w CSS to fakt, że nie łamiemy sieci; nie możemy po prostu zmienić rzeczy . Nie możemy nagle zdecydować, że wszyscy powinni używać tej nowej dwuwartościowej składni, a zatem każda kiedykolwiek zbudowana witryna internetowa, która używała składni jednowartościowej, ulegnie awarii, chyba że programista wróci i to naprawi!

Myśląc o tym problemie, możesz cieszyć się tą listą błędów w projektowaniu CSS, które w wielu przypadkach są mniej pomyłkami, niż rzeczy, które zostały zaprojektowane bez kryształowej kuli do patrzenia w przyszłość! Jednak faktem jest, że nie możemy zepsuć sieci, dlatego mamy taką sytuację, w której obecnie przeglądarki obsługują zestaw pojedynczych wartości do wyświetlania, a specyfikacja przechodzi do dwóch wartości do wyświetlania.

Sposób, w jaki możemy to obejść, polega na określeniu starszych i krótkich wartości do wyświetlania, które obejmują wszystkie te pojedyncze wartości. Oznacza to, że mapowanie można zdefiniować między pojedynczymi wartościami a nowymi dwoma wartościami słów kluczowych. Co daje nam następującą tabelę wartości:

Pojedyncza wartość Wartości dwóch słów kluczowych Opis
block block flow Pudełko blokowe z normalnym przepływem wewnętrznym
flow-root block flow-root Zablokuj pole definiujące BFC
inline inline flow Wbudowane pudełko z normalnym przepływem wewnętrznym
inline-block inline flow-root Inline box definiujący BFC
list-item block flow list-item Pudełko blokowe z normalnym przepływem wewnętrznym i dodatkowym polem znacznikowym
flex block flex Pudełko blokowe z wewnętrznym elastycznym układem
inline-flex inline flex Pudełko inline z wewnętrznym elastycznym układem
grid block grid Pudełko blokowe z układem siatki wewnętrznej
inline-grid inline grid Pudełko inline z układem siatki wewnętrznej
table block table Pudełko blokowe z układem stołu wewnętrznego
inline-table inline table Inline box z wewnętrznym układem stołu

Aby wyjaśnić, jak to działa, możemy pomyśleć o kontenerze siatki. W świecie dwuwartościowym stworzylibyśmy kontener siatki na poziomie bloku z:

 .container { display: block grid; }

Słowo kluczowe starszego typu oznacza jednak, że to samo działa w następujący sposób:

 .container { display: grid; }

Gdybyśmy zamiast tego chcieli kontenera z siatką inline, w świecie dwóch wartości użylibyśmy:

 .container { display: inline grid; }

A jeśli używasz starszych wartości:

 .container { display: inline-grid; }

Możemy teraz wrócić do miejsca, w którym ta rozmowa się zaczęła i spojrzeć na display: inline-block . Patrząc na tabelę, widać, że jest to zdefiniowane w świecie dwóch wartości jako display: inline flow-root . Teraz pasuje do display: flow-root , które w świecie z dwiema wartościami byłoby display: block flow-root . Trochę sprzątania i wyjaśnienia, jak te rzeczy są zdefiniowane. Refaktoryzacja CSS, jeśli chcesz.

Obsługa przeglądarki dla dwuwartościowej składni

Jak dotąd przeglądarki nie obsługują dwuwartościowej składni właściwości display . Błąd implementacji Firefoksa można znaleźć tutaj. Wdrożenie — gdy to nastąpi — zasadniczo wiązałoby się z aliasowaniem starszych wartości z wersjami dwuwartościowymi. Dlatego prawdopodobnie minie sporo czasu, zanim będziesz mógł faktycznie użyć tych dwuwartościowych wersji w swoim kodzie. Jednak tak naprawdę nie o to chodzi w tym artykule. Uważam natomiast, że patrzenie na wartości wyświetlania w świetle modelu dwuwartościowego pomaga wyjaśnić wiele z tego, co się dzieje.

Kiedy definiujesz układ pola w CSS, definiujesz, co dzieje się z tym polem pod względem tego , jak zachowuje się w stosunku do wszystkich innych pól w układzie . Definiujesz również, jak zachowują się dzieci tego pudełka. Możesz myśleć w ten sposób na długo, zanim będziesz mógł jawnie zadeklarować wartości jako dwie oddzielne rzeczy, ponieważ starsze słowa kluczowe są mapowane na te wartości i pomoże Ci zrozumieć, co się stanie, gdy zmienisz wartość display .