Zrozumienie właściwości i wartości logicznych
Opublikowany: 2022-03-10 W przeszłości CSS wiązał się z fizycznymi wymiarami i kierunkami, fizycznie mapując rozmieszczenie elementów po lewej, prawej stronie oraz na górze i na dole. float element w left lub w right , używamy właściwości przesunięcia pozycjonowania top , left , bottom i right . Ustawiamy marginesy, padding i bordery jako margin-top i padding-left . Te fizyczne właściwości i wartości mają sens, jeśli pracujesz w trybie i kierunku pisania poziomo, od góry do dołu, od lewej do prawej.
Mają mniej sensu, jeśli używasz trybu pisania w pionie, czy to dla całego układu, czy dla niektórych elementów. W tym artykule wyjaśnię, w jaki sposób CSS zmienia się w celu obsługi trybów pisania, a robiąc to, wyjaśnię niektóre rzeczy, które mogą wprowadzać w błąd w Flexbox i Grid.
Kiedy po raz pierwszy zacząłem pracować z CSS Grid i wyjaśniać ludziom nową specyfikację, zauważyłem, że właściwość grid-area może być używana jako jednowierszowy skrót do ustawiania wszystkich czterech wierszy. W związku z tym trzy poniższe przykłady skutkowałyby tym samym umieszczeniem przedmiotu. Pierwsza używa właściwości odręcznych, druga określa linie początkowe i końcowe dla każdego wymiaru, a trzecia używa grid-area .
.item { grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4; } .item { grid-row: 1 / 3; grid-column: 2 / 4; } .item { grid-area: 1 / 2 / 3 / 4; } Kolejność wierszy, gdy używamy grid-area jest następująca:
- początek wiersza siatki
- początek kolumny siatki
- koniec wiersza siatki
- koniec kolumny siatki
Pierwsze pytanie, które zadałem (i wiele osób z moich odbiorców), brzmiało: „dlaczego nie są one zgodne z kolejnością Góra, Prawo, Dół, Lewo, do której jesteśmy przyzwyczajeni ze wszystkiego innego w CSS ?” W rzeczywistości idą w odwrotnej kolejności do tych wartości: Góra, Lewo, Dół, Prawo! Czy Grupa Robocza CSS aktywnie stara się utrudnić sprawy?
Odpowiedź jest taka, że wartości te odeszły od podstawowego założenia, że treść w sieci jest mapowana na fizyczne wymiary ekranu, przy czym pierwsze słowo zdania znajduje się w lewym górnym rogu pola, w którym się znajduje. Kolejność linii w grid-area ma całkowity sens, jeśli nigdy nie spotkałeś się z istniejącym sposobem, w jaki ustawiamy te wartości w skrócie. Najpierw ustawiamy dwie linie początkowe, potem dwie linie końcowe.
Oznacza to, że jeśli zmienimy tryb pisania naszego dokumentu na pionowy, pozycja bloku pozostaje w stosunku do trybu pisania dokumentu, a nie fizycznych właściwości ekranu. Możesz spróbować tego w poniższym przykładzie, zmienić wartość trybu pisania dla naszego układu i zobaczyć, jak cała siatka się obraca.
Zobacz siatkę pióra i tryby pisania autorstwa Rachel Andrew (@rachelandrew) na CodePen.
Znajomość tego faktu na temat trybów pisania wyjaśnia również, dlaczego CSS Grid i Flexbox odnoszą się do linii start i end , a nie mapowania siatki do fizycznych wymiarów górnej, prawej, dolnej i lewej, tak jakbyśmy używali w przypadku pozycjonowania bezwzględnego. W powyższym przykładzie pierwszy element jest pozycjonowany za pomocą pozycjonowania na podstawie grid-area i linii.
grid-area: 1 / 2 / 3 / 4;Gdybyśmy mieli użyć odręcznego, to wyglądałoby to tak:
grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4;Ustawiamy obie linie początkowe, najpierw oś blokową, drugą oś śródliniową, a następnie postępuj zgodnie z tym samym wzorem dla linii końcowych w każdym wymiarze. Niezależnie od tego, jak ułożona jest siatka, linie początkowe i końcowe pozostają w stosunku do siatki i trybu pisania dokumentu.
Wymiary blokowe i wbudowane
Wspomniałem już o czymś, co jest kluczem do zrozumienia nowego układu, koncepcji wymiarów Bloku i Inline. Te terminy będą się pojawiać podczas pracy z nowym CSS. Te dwa wymiary są dość łatwe do zrozumienia w kontekście układu siatki, ponieważ podczas pracy w układzie siatki zawsze pracujemy z blokiem i osią w wierszu, więc użyję demonstracji siatki, aby to wyjaśnić.
Wymiar Bloku odpowiada kolejności, w jakiej bloki są ułożone na stronie. Jeśli myślisz o akapicie tekstu w języku angielskim. Każdy akapit jest ułożony jeden pod drugim, kierunek, w którym są one ułożone, jest wymiarem bloku, a więc w układzie siatki jest to oś bloku.
W CSS Grid Layout oś bloku jest również określana jako oś wiersza, dlatego właściwościami osi bloku są grid-row-start i grid-row-end .

Oś inline biegnie zatem w poprzek osi bloku, w kierunku, w którym słowa układają się w zdaniu. W języku angielskim ta oś biegnie od lewej do prawej. W układzie siatki oś wbudowana jest osią słupa z właściwościami grid-column-start i grid-column-end .

Jeśli zmienimy tryb pisania naszego przykładu na vertical-lr , tryb pisania jest teraz pionowy, co oznacza, że oś bloku biegnie pionowo, a oś inline wzdłuż linii (od góry do dołu).

Więc jeśli mówimy o wymiarze Bloku, opisujemy kierunek, w którym akapity tekstu byłyby ułożone w normalnym przepływie dokumentu, a wymiar Inline to kierunek, w którym biegnie zdanie.
Właściwości logiczne
Kiedy już przyzwyczaisz się do pracy z wymiarami blokowymi i wbudowanymi, liniami początkowymi i końcowymi, łącze do wymiarów fizycznych w pozostałej części CSS zaczyna wydawać się niewygodne. Istnieje jednak specyfikacja, która definiuje logiczne wersje wszystkich istniejących właściwości fizycznych — specyfikacja CSS Logical Properties and Values, która jest pierwszą publiczną wersją roboczą. Obecnie jedyną przeglądarką z dobrą obsługą tych właściwości jest Firefox, jednak zrozumienie ich działania może być dobrym sposobem myślenia o nowym CSS, więc przyjrzyjmy się.
Zilustrowałem każdą sekcję przykładami CodePen, aby zobaczyć, jak działają, musisz użyć Firefoksa!
Wymiary logiczne
Właściwości logiczne definiują właściwość początkową i końcową dla wymiaru blokowego i wbudowanego. W przypadku właściwości height i width używamy zamiast tego block-size i inline-size . Możemy również ustawić max-block-size , min-block-size , max-inline-size i min-inline-size . Jeśli pracujesz w języku angielskim, poziomym języku od góry do dołu, block-size odnosi się do fizycznej height bloku na ekranie, inline-size w wierszu oznacza fizyczną width elementu. Jeśli pracujesz w języku, w którym bloki biegną pionowo, to gdy spojrzysz na ekran, pojawi się inline-size block-size , który kontroluje width i wysokość.

Możesz to zobaczyć w akcji w poniższym demo. Mój blok ma block-size 150 pikseli i inline-size w 250 pikseli. Zmień właściwość writing-mode aby zobaczyć, jak dostosowuje się układ.
Zobacz demo Pen Block i Inline Size autorstwa Rachel Andrew (@rachelandrew) na CodePen.
Granice logiczne
Mamy wtedy właściwości do kontrolowania granic, które działają w ten sam sposób. Fizyczne właściwości granic to:
-
border-top -
border-top-width -
border-top-style -
border-top-color -
border-right -
border-right-width -
border-right-style -
border-right-color -
border-bottom -
border-bottom-width -
border-bottom-style -
border-bottom-color -
border-left -
border-left-width -
border-left-style -
border-left-color
Mają one następnie logiczne odwzorowania, które stają się nieco gadatliwe, jak w przypadku długich rąk, ale są to:
-
border-block-start -
border-block-start-width -
border-block-start-style -
border-block-start-color -
border-inline-start -
border-inline-start-width -
border-inline-start-style -
border-inline-start-color -
border-block-end -
border-block-end-width -
border-block-end-style -
border-block-end-color -
border-inline-end -
border-inline-end-width -
border-inline-end-style -
border-inline-end-color
W poniższym przykładzie są dwa bloki, z których pierwszy używa właściwości logicznych do ustawienia koloru zielonego border-block-start-color oraz stylu border-inline-end-style dod. Drugi blok wykorzystuje fizyczne właściwości border-top-color i border-right . Zmień tryb pisania, aby zobaczyć, jak się zachowują.
Zobacz Pen Logical Borders autorstwa Rachel Andrew (@rachelandrew) na CodePen.
Marginesy i dopełnienie
Marginesy i dopełnienie mają podobne długie dłonie do naszych właściwości granicznych, przy czym właściwości fizyczne to:
-
margin-top -
margin-left -
margin-bottom -
margin-right -
padding-top -
padding-right -
padding-bottom -
padding-left
Mają one następujące właściwości logiczne:
-
margin-block-start -
margin-inline-start -
margin-inline-start -
margin-inline-end -
padding-block-start -
padding-inline-start -
padding-inline-start -
padding-inline-end
W następnym przykładzie ustawiłem padding-block-start na pierwszym bloku, a padding-top na drugim, zmieniłem tryb pisania, aby zobaczyć różnicę, gdy osie Block i Inline są przełączane.
Zobacz właściwości logiczne pióra - dopełnienie autorstwa Rachel Andrew (@rachelandrew) na CodePen.
Przesunięcia pozycjonowania
Innym miejscem, w którym używa się właściwości fizycznych, jest pozycjonowanie rzeczy za pomocą właściwości position . Po ustawieniu position: absolute lub innej wartości position innej niż domyślna static , możemy następnie pozycjonować element za pomocą przesunięć, albo z rzutni, albo z rodzica, który utworzył nowy kontekst pozycjonowania.
Przesunięte właściwości fizyczne to:
-
top -
right -
bottom -
left
Zgodnie ze wzorem naszych innych własności logicznych mamy wtedy:
-
offset-block-start -
offset-inline-start -
offset-block-end -
offset-inline-end
Wypróbuj je w poniższym przykładzie. Ramka z obramowaniem ma position: relative i pozycję małego fioletowego kwadratu position: absolute . W fizycznym przykładzie kwadrat jest umieszczony u top: 50px i right: 20px . Wersja logiczna ma offset-block-start: 50px i offset-inline-end: 20px .
Zobacz Pen Logical Offsets autorstwa Rachel Andrew (@rachelandrew) na CodePen.
Wartości logiczne
Innym miejscem, w którym jesteśmy przyzwyczajeni do używania wymiarów fizycznych, jest unoszenie się lub oczyszczanie rzeczy. Dla float , clear mamy kilka logicznych wersji left i right wartości.
-
inline-start -
inline-end
Zobacz pióro unoszące się z wartościami logicznymi autorstwa Rachel Andrew (@rachelandrew) na CodePen.
W demie pływam fioletowy blok w wersji logicznej inline-start . Używam również właściwości logicznych dla marginesu; zapewnia to, że margines zawsze pojawia się po bloku, a przed treścią, która go otacza. Wybierając wartość vertical-rl z listy rozwijanej, możesz zobaczyć, jak w fizycznym przykładzie margines kończy się po prawej stronie bloku, a nie jest stosowany w kierunku -end .

Istnieją również wartości start i end dla text-align . Wyrównanie czegoś do początku spowoduje wyrównanie go do początku osi wbudowanej, do end do końca osi wbudowanej, niezależnie od tego, czy tryb pisania jest poziomy czy pionowy.
Używanie logicznych właściwości i wartości dzisiaj

Jak już wspomniano, w tej chwili przeglądarki nie obsługują właściwości i wartości logicznych. Jeśli jednak chcesz zacząć z nimi teraz pracować, opcją byłoby napisanie za ich pomocą kodu CSS, a następnie użycie wtyczki PostCSS do konwersji właściwości logicznych i wartości na ich fizyczne odpowiedniki. Ta wtyczka autorstwa Jonathana Neala obejmuje wszystkie właściwości i wartości, które opisałem w tym artykule.
Możesz również pomóc w zachęceniu dostawców przeglądarek do przyjęcia tych właściwości, umieszczając gwiazdkę w błędzie Chrome i głosując na nie w witrynie Edge Developer Feedback.
Nawet jeśli zdecydujesz się nie używać tych właściwości teraz, zrozumienie ich działania jest kluczowym elementem zrozumienia pracy z nowym układem. Opisując układ Grid lub Flex jako mający linie początkowe i końcowe, myśląc o wymiarach blokowych i śródliniowych, te rzeczy znacznie ułatwią zrozumienie działania układu.
Dalsza lektura
- Dokumenty sieciowe MDN zawierają wszystkie właściwości logiczne i wartości wymienione wraz z dodatkowymi przykładami.
- Siatka CSS, wartości logiczne i tryby pisania, MDN
- Tryby pisania CSS, Jen Simmons, 24 sposoby
