Понимание логических свойств и значений

Опубликовано: 2022-03-10
Краткое резюме ↬ Логические свойства и значения CSS еще не совсем готовы к использованию, однако изучение их может помочь вам понять макет CSS и взаимодействие с режимами письма.

В прошлом 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.

См. Сетку пера и режимы письма Рэйчел Эндрю (@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.

См. Демонстрацию 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.

См. «Логические границы пера» Рэйчел Эндрю (@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.

См. раздел «Логические свойства пера — заполнение» от Рэйчел Эндрю (@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.

См. «Логические смещения пера» Рэйчел Эндрю (@rachelandrew) на CodePen.

Логические значения

Еще одно место, где мы привыкли использовать физические измерения, — это когда мы плаваем или очищаем объекты. Для float , clear у нас есть несколько логических версий left и right значений.

  • inline-start
  • inline-end

См. Pen Floating with Logical Values ​​Рэйчел Эндрю (@rachelandrew) на CodePen.

См. Pen Floating with Logical Values ​​Рэйчел Эндрю (@rachelandrew) на CodePen.

В демо я плаваю фиолетовым блоком в логической версии inline-start . Я также использую логические свойства поля; это гарантирует, что поле всегда будет после блока и перед содержимым, которое окружает его. Выбрав значение vertical-rl в раскрывающемся списке, вы увидите, как в физическом примере поле заканчивается справа от блока, а не применяется в направлении -end .

Две коробки, содержащие фиолетовые блоки, левый блок смещен
Позиционированный блок в физическом примере слева имеет отступ справа

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

Использование логических свойств и значений сегодня

Веб-сайт Can I Use, демонстрирующий поддержку логических свойств
Состояние поддержки браузеров в феврале 2018 г.

Как уже упоминалось, на данный момент браузеры мало поддерживают логические свойства и значения. Однако, если вы хотите начать работать с ними сейчас, можно написать свой CSS, используя их, а затем использовать плагин PostCSS для преобразования логических свойств и значений в их физические аналоги. Этот плагин Джонатана Нила охватывает все свойства и значения, которые я описал в этой статье.

Вы также можете помочь производителям браузеров принять эти свойства, пометив ошибку Chrome и проголосовав за нее на сайте отзывов разработчиков Edge.

Даже если вы решите не использовать эти свойства сейчас, понимание того, как они работают, является ключевой частью понимания работы с новым макетом. Описывая свой макет Grid или Flex как имеющий начальную и конечную линии, думая о блочных и встроенных размерах, эти вещи значительно упростят понимание того, как работает макет.

Дальнейшее чтение

  • В веб-документах MDN есть все логические свойства и значения, перечисленные с дополнительными примерами.
  • CSS Grid, логические значения и режимы записи, MDN
  • Режимы написания CSS, Джен Симмонс, 24 способа