Zrozumienie właściwości i wartości logicznych

Opublikowany: 2022-03-10
Krótkie podsumowanie ↬ Logiczne właściwości i wartości CSS nie są jeszcze gotowe do użycia, jednak poznanie ich może pomóc w zrozumieniu układu CSS i interakcji z trybami pisania.

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; }
Więcej po skoku! Kontynuuj czytanie poniżej ↓

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.

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 .

Siatka z poziomym trybem pisania, oś bloku biegnie od góry do dołu
Oś bloku lub rzędu

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 .

Siatka z poziomym trybem pisania, oś w linii biegnie pionowo
Oś w linii lub kolumna

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).

Siatka pokazująca, w jaki sposób przełączają się osie blokowe i liniowe w trybie pisania pionowego
Osie w trybie zapisu pionowego

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.

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.

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.

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.

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.

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 .

Dwa pola zawierające fioletowe klocki, lewy bloczek beż źle wyrównany
Umieszczony blok w fizycznym przykładzie po lewej stronie ma margines po prawej

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

Strona internetowa Can I Use demonstrująca obsługę właściwości logicznych
Stan obsługi przeglądarek w lutym 2018 r.

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