Zagłębianie się w właściwość wyświetlania: dwie wartości wyświetlania
Opublikowany: 2022-03-10display 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.
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.
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.
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-blockdaje BFC na inline boxie. -
display: flow-rootdaje 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 .
