Понимание логических свойств и значений
Опубликовано: 2022-03-10 В прошлом CSS привязывался к физическим размерам и направлениям, физически отображая размещение элементов слева, справа, сверху и снизу. Мы float элемент left или right , мы используем свойства смещения позиционирования top , left , bottom и right . Мы устанавливаем поля, отступы и границы как margin-top и padding-left . Эти физические свойства и значения имеют смысл, если вы работаете в горизонтальном, сверху вниз, слева направо режиме и направлении письма.
Они имеют меньше смысла, если вы используете вертикальный режим письма, будь то для всего макета или для некоторых элементов. В этой статье я собираюсь объяснить, как меняется CSS для поддержки режимов записи, и при этом я проясню некоторые моменты, которые могут вас смутить в отношении Flexbox и Grid.
 Когда я впервые начал работать с CSS Grid и объяснять людям новую спецификацию, я заметил, что свойство grid-area можно использовать как однострочное сокращение для установки всех четырех строк. Следовательно, три приведенных ниже примера приведут к одному и тому же размещению элемента. Первый использует обычные свойства, второй указывает начальную и конечную линии для каждого измерения, а третий использует 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; } Порядок строк при использовании grid-area следующий:
- сетка-строка-начало
- начало столбца сетки
- сетка-ряд-конец
- конец столбца сетки
Первый вопрос, который у меня (и у многих людей из моей аудитории) был: «Почему они не следуют порядку сверху, справа, снизу, слева, к которому мы привыкли из всего остального в CSS ?» На самом деле они идут в порядке, обратном этим значениям: сверху, слева, снизу, справа! Активно ли рабочая группа CSS пытается все усложнить?
 Ответ заключается в том, что эти значения отошли от лежащего в основе предположения о том, что содержимое в Интернете соответствует физическим размерам экрана, при этом первое слово предложения находится в левом верхнем углу поля, в котором оно находится. Порядок строк в grid-area имеет смысл, если вы никогда не сталкивались с существующим способом, которым мы устанавливаем эти значения в сокращении. Сначала мы устанавливаем две начальные линии, затем две конечные линии.
Это означает, что если мы изменим режим записи нашего документа на вертикальный, положение блока останется относительно режима записи документа, а не физических свойств экрана. Вы можете попробовать это в приведенном ниже примере, переключив значение режима письма для нашего макета и увидев, как вращается вся сетка.
См. Сетку пера и режимы письма Рэйчел Эндрю (@rachelandrew) на CodePen.
 Знание этого факта о режимах записи также объясняет, почему CSS Grid и Flexbox ссылаются на start и end линии, а не отображают сетку на физические размеры сверху, справа, снизу и слева, как мы использовали бы с абсолютным позиционированием. В приведенном выше примере первый элемент позиционируется с использованием grid-area и позиционирования на основе строк.
 grid-area: 1 / 2 / 3 / 4;Если бы мы использовали длинную запись, это выглядело бы так:
 grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4;Мы устанавливаем обе начальные линии, сначала ось блока, затем встроенную ось, затем следуем тому же шаблону для конечных линий в каждом измерении. Каким бы способом ни располагалась сетка, начальная и конечная линии остаются относительно сетки и режима письма документа.
Блочные и встроенные размеры
Я уже упоминал то, что является ключом к пониманию нового макета, концепцию блочных и встроенных измерений. Эти термины будут появляться по мере того, как вы будете работать с новым CSS. Два измерения достаточно легко понять в контексте Grid Layout, поскольку мы всегда работаем с блоком и встроенной осью при работе в Grid Layout, поэтому я буду использовать демонстрацию Grid для объяснения.
Размер блока соответствует порядку расположения блоков на странице. Если вы думаете об абзаце текста на английском языке. Каждый абзац расположен один под другим, направление, в котором они расположены, является размером блока, и поэтому в макете сетки это ось блока.
 В CSS Grid Layout ось блоков также называется осью строк, поэтому свойства оси блоков — grid-row-start и grid-row-end . 

 Таким образом, встроенная ось проходит через ось блока в том направлении, в котором слова располагаются в предложении. В английском языке эта ось проходит слева направо. В макете сетки встроенная ось — это ось столбца со свойствами grid-column-start и grid-column-end . 

 Если мы изменим режим записи в нашем примере на vertical-lr , режим записи станет вертикальным, что означает, что ось блока проходит вертикально, а встроенная ось — вдоль линий (сверху вниз). 

Итак, если мы говорим о блочном измерении, мы описываем направление, в котором абзацы текста будут расположены в обычном потоке документа, а встроенное измерение — это направление, в котором движется предложение.
Логические свойства
Как только вы привыкнете работать с блочными и встроенными размерами, начальными и конечными линиями, ссылка на физические размеры в остальной части CSS начинает казаться неудобной. Однако существует спецификация, которая определяет логические версии всех существующих физических свойств — Спецификация логических свойств и значений CSS, которая является первым общедоступным рабочим проектом. В настоящее время единственным браузером с хорошей поддержкой этих свойств является Firefox, однако понимание того, как они работают, может быть хорошим способом подумать о новом CSS, так что давайте посмотрим.
Я проиллюстрировал каждый раздел примерами CodePen, чтобы увидеть, как они работают, вам понадобится Firefox!
Логические измерения
 Логические свойства определяют начальное и конечное свойства для блочного и встроенного измерения. Вместо свойств height и width мы используем block-size и inline-size . Мы также можем установить max-block-size , min-block-size , max-inline-size и min-inline-size . Если вы работаете на английском языке, горизонтальном языке сверху вниз, тогда block-size относится к физической height блока на вашем экране, а inline-size — к физической width элемента. Если вы работаете с языком, в котором блоки расположены вертикально, то, когда вы посмотрите на свой экран block-size будет контролировать width , а inline-size — высоту.

 Вы можете увидеть это в действии в демо ниже. Мой блок имеет block-size блока 150 пикселей и inline-size 250 пикселей. Измените свойство writing-mode чтобы увидеть, как настраивается макет. 
См. Демонстрацию Pen Block и Inline Size от Rachel Andrew (@rachelandrew) на CodePen.
Логические границы
Затем у нас есть свойства для управления границами, которые работают таким же образом. Физические свойства границ:
-  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
Затем они имеют логические сопоставления, которые становятся немного подробными, как от руки, но таковы:
-  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
 В следующем примере есть два блока, первый использует логические свойства для установки зеленого border-block-start-color границы и пунктирного border-inline-end-style . Второй блок использует физические свойства border-top-color и border-right . Измените режим записи, чтобы увидеть, как они себя ведут. 
См. «Логические границы пера» Рэйчел Эндрю (@rachelandrew) на CodePen.
Поля и отступы
Поля и отступы имеют аналогичную форму нашим свойствам границ, а физические свойства таковы:
-  margin-top
-  margin-left
-  margin-bottom
-  margin-right
-  padding-top
-  padding-right
-  padding-bottom
-  padding-left
Они имеют следующие логические свойства:
-  margin-block-start
-  margin-inline-start
-  margin-inline-start
-  margin-inline-end
-  padding-block-start
-  padding-inline-start
-  padding-inline-start
-  padding-inline-end
 В следующем примере я установил padding-block-start для первого блока и padding-top для второго, изменив режим записи, чтобы увидеть разницу при переключении осей Block и Inline. 
См. раздел «Логические свойства пера — заполнение» от Рэйчел Эндрю (@rachelandrew) на CodePen.
Смещения позиционирования
 Другое место, где используются физические свойства, — это позиционирование объектов с использованием свойства position . После установки position: absolute или другого значения position , отличного от static значения по умолчанию, мы можем позиционировать элемент, используя смещения, либо от окна просмотра, либо от родителя, который создал новый контекст позиционирования.
Физические свойства смещения:
-  top
-  right
-  bottom
-  left
Следуя шаблону других наших логических свойств, мы имеем:
-  offset-block-start
-  offset-inline-start
-  offset-block-end
-  offset-inline-end
 Попробуйте это в примере ниже. Коробка с рамкой имеет position: relative , а маленький фиолетовый квадрат position: absolute . В физическом примере квадрат расположен top: 50px и right: 20px . Логическая версия имеет offset-block-start: 50px и offset-inline-end: 20px . 
См. «Логические смещения пера» Рэйчел Эндрю (@rachelandrew) на CodePen.
Логические значения
 Еще одно место, где мы привыкли использовать физические измерения, — это когда мы плаваем или очищаем объекты. Для float , clear у нас есть несколько логических версий left и right значений.
-  inline-start
-  inline-end
См. Pen Floating with Logical Values Рэйчел Эндрю (@rachelandrew) на CodePen.
 В демо я плаваю фиолетовым блоком в логической версии inline-start . Я также использую логические свойства поля; это гарантирует, что поле всегда будет после блока и перед содержимым, которое окружает его. Выбрав значение vertical-rl в раскрывающемся списке, вы увидите, как в физическом примере поле заканчивается справа от блока, а не применяется в направлении -end . 

 Также есть start и end значения для text-align . Выравнивание чего-либо по началу выровняет его по началу встроенной оси, по end — по концу встроенной оси, независимо от того, является ли режим записи горизонтальным или вертикальным.
Использование логических свойств и значений сегодня

Как уже упоминалось, на данный момент браузеры мало поддерживают логические свойства и значения. Однако, если вы хотите начать работать с ними сейчас, можно написать свой CSS, используя их, а затем использовать плагин PostCSS для преобразования логических свойств и значений в их физические аналоги. Этот плагин Джонатана Нила охватывает все свойства и значения, которые я описал в этой статье.
Вы также можете помочь производителям браузеров принять эти свойства, пометив ошибку Chrome и проголосовав за нее на сайте отзывов разработчиков Edge.
Даже если вы решите не использовать эти свойства сейчас, понимание того, как они работают, является ключевой частью понимания работы с новым макетом. Описывая свой макет Grid или Flex как имеющий начальную и конечную линии, думая о блочных и встроенных размерах, эти вещи значительно упростят понимание того, как работает макет.
Дальнейшее чтение
- В веб-документах MDN есть все логические свойства и значения, перечисленные с дополнительными примерами.
- CSS Grid, логические значения и режимы записи, MDN
- Режимы написания CSS, Джен Симмонс, 24 способа
