Главная » Статьи » Понятие логических свойств и значений

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

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

От автора: раньше CSS привязывался к физическим измерениям и направлениям, физически отображая элементы слева, справа, сверху и снизу. Мы использовали float left и right, свойства сдвига top, left, bottom и right. Задавали margin, padding и рамки через margin-top и padding-left. Эти физические свойства и значения имеют смысл, если вы работаете в горизонтальной плоскости, сверху вниз и режиме письма слева направо.

Они имеют смысл, если вы используете вертикальный режим письма на всем макете или некоторых элементах. В этой статье я объясню, как CSS меняется в сторону поддержки режимов письма, при этом проясню некоторые моменты, которые могут смутить в Flexbox и CSS Grid. Мы будем говорить про логические свойства и значения.

Когда я начала работать с CSS Grid и объяснять новую спецификацию людям, я отмечала, что свойство grid-area можно использовать, как сокращение в одну строку для установки всех четырех линий. Поэтому 3 примера ниже создают одинаковую раскладку. Первый пример использует длинные свойства, второй определяет стартовые и конечные линии для всех плоскостей, третий использует 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:

grid-row-start

grid-column-start

grid-row-end

grid-column-end

Первый мой вопрос (и многих других среди моей аудитории) был «почему не Top, Right, Bottom, Left, как мы уже привыкли в CSS?». На самом деле, они идут в обратном порядке тем значениям: Top, Left, Bottom, Right! CSS Working Group активно пытается все усложнить?

Ответ – эти значения отошли от базового предположения о том, что контент в вебе соответствует физическим размерам экрана, причем первое слово предложения находится сверху слева от своего блока. Порядок линий в grid-area имеет смысл, если вы никогда не сталкивались с существующим способом установки этих значений в сокращении. Сначала мы указываем 2 стартовые линии, потом две конечные.

То есть если мы изменим режим письма документа на вертикальный, положение блока останется относительно режима письма документа, а не физических свойств экрана. Можете проверить в примере ниже, переключите значение writing-mode для макета, сетка должна повернуться.

Этот факт о режимах письма объясняет, почему 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, так как мы все время работаем с блоком и инлайн осями. Поэтому для объяснения я буду использовать CSS Grid демо.

Блоковое измерение соответствует порядку раскладки блоков на странице. Возьмем параграф текста на английском. Каждый параграф располагается друг под другом, они раскладываются в блоковом измерении. Так же и в Grid Layout. Это блоковые оси.

В CSS Grid Layout блоковые оси также называют строчными осями. Вот почему свойства блоковой оси grid-row-start и grid-row-end.

Поэтому инлайн оси пересекает блоковую ось в том направлении, в котором слова раскладываются в предложении. В английском эта ось идет слева направо. В Grid Layout инлайн ось – это колоночная ось со свойствами grid-column-start и grid-column-end.

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

Поэтому если мы говорим о блоковом измерении, мы описываем направление, в котором параграфы текста раскладываются в документе с нормальным потоком, а инлайн измерение является направлением предложений.

Логические свойства

Как только вы привыкните к работе с блоковыми и инлайн измерениями, стартовыми и конечными линиями, связь с физическими измерениями в остальном CSS будет казаться чем-то странным. Тем не менее, есть спецификация, которая определяет логические версии всех существующих физических свойств — CSS Logical Properties and Values, находится в статусе First Public Working Draft. Сейчас только Firefox хорошо поддерживает эти свойства. Однако понимание принципов их работы – это хороший способ подумать о новом CSS. Давайте разбираться.

Я проиллюстрировала каждый раздел CodePen примерами. Для их просмотра вам понадобится Firefox!

Логические измерения

Логические свойства определяют стартовое и конечное свойство для блокового и инлайн измерения. Для свойств высоты и ширины используем 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 – height.

Можете проверить в демо ниже. Мой блок имеет block-size 150px и inline-size 250px. Измените свойство writing-mode и посмотрите, как подстроится макет.

Логические рамки

У нас есть свойства контроля рамок, которые работают по схожему принципу. Физические свойства рамок:

border-top

border-top-size

border-top-style

border-top-color

border-right

border-right-size

border-right-style

border-right-color

border-bottom

border-bottom-size

border-bottom-style

border-bottom-color

border-left

border-left-size

border-left-style

border-left-color

У них есть логические версии, которые стали немного длиннее:

border-block-start

border-block-start-size

border-block-start-style

border-block-start-color

border-inline-start

border-inline-start-size

border-inline-start-style

border-inline-start-color

border-block-end

border-block-end-size

border-block-end-style

border-block-end-color

border-inline-end

border-inline-end-size

border-inline-end-style

border-inline-end-color

В примере ниже 2 блока. Первый использует логические свойства для установки border-block-start-color в зеленый цвет и border-inline-end-style в пунктир. Второй блок использует физические свойства border-top-color и border-right. Измените режим письма, чтобы посмотреть на их поведение:

Margin и padding

У margin и padding есть схожие длинные версии, как у свойств рамок. Физические свойства:

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 на второй. Измените режим письма, что увидеть отличие блоковой оси от инлайн.

Позиционирование сдвигов

Физические свойства также используются при позиционировании элементов с помощью свойства position. После установки position: absolute или любого другого значения отличного от стандартного 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.

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

Мы привыкли использовать физические измерения с float и clear. Для float и clear есть логические версии значений left и right.

inline-start

inline-end

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

Для text-align есть значения start и end. Значение start выравнивает контент к началу инлайн оси, а end – к концу инлайн оси, независимо от режима письма (вертикальный или горизонтальный).

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

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

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

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

Автор: Rachel Andrew

Источник: https://www.smashingmagazine.com/

Редакция: Команда webformyself.