Статьи

Погружение в регионы CSS

В этом руководстве будут рассмотрены основы областей CSS, которые позволяют нам передавать контент в различные разделы страницы. Смущенный? Вы, вероятно, есть; читай дальше!



На момент написания этой статьи спецификация CSS Regions была рабочим проектом, и все может измениться! Методы, упомянутые в этом руководстве, могут измениться в реализации. Цель этого руководства — дать общее представление о регионах CSS и о том, что может появиться в ближайшем к вам браузере.

Проверьте caniuse.com для списка браузеров, которые имеют некоторую поддержку регионов CSS. В этом руководстве для простоты будут использоваться примеры с префиксами webkit / non-vendor.

Если вы обнаружите, что демонстрация не работает для вас, это может быть связано с тем, что CSS Regions необходимо включить, вот инструкции для Chrome (должно работать для Chrome , Chrome Canary & Chromium )

  1. Перейдите к chrome: // flags / (или about: flags)
  2. Найдите «Включить регионы CSS» и включите его.
  3. Перезапустите браузер и убедитесь, что демоверсия работает.
  4. Скриншот страницы Chrome Flags

Простая демонстрация областей CSS на самом деле требует очень мало кода!

Чтобы попасть в поток вещей, давайте рассмотрим краткий пример использования областей CSS.

Во-первых, нам нужен некоторый фиктивный текст, который содержится в теге абзаца, ниже вы заметите два пустых элемента div, каждый с классом «регионов». Используя CSS Regions, мы позволим нашему «примеру текста» перетекать в div региона.

1
2
3
4
<p class=»example-text»>»Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.»</p>
 
<div class=»regions»></div>
<div class=»regions»></div>
01
02
03
04
05
06
07
08
09
10
11
12
13
14
.example-text {
    -webkit-flow-into: example-text-flow;
    padding: 0;
    margin: 0;
}
   
.regions {
    -webkit-flow-from: example-text-flow;
    border: 1px solid black;
    padding: 2px;
    margin: 5px;
    width: 200px;
    height: 50px;
}

Если вы попытаетесь просмотреть приведенный выше код в браузере Webkit, который поддерживает регионы CSS, вы должны увидеть что-то вроде:

Базовый пример областей CSS

Все стили (за исключением -webkit-flow-from), которые были применены к классу «регионов», предназначены только для того, чтобы понять, где находятся регионы, две линии CSS, которые нас действительно волнуют:

1
2
3
-webkit-flow-into: example-text-flow;
 
-webkit-flow-from: example-text-flow;

Это будет обсуждаться более подробно ниже


Свойство flow-into принимает идентификатор в качестве значения, как только мы применяем свойство flow-into к элементу и передаем ему идентификатор, этот элемент затем становится частью «именованного потока». Как только элемент становится частью именованного потока, он выводится из своего обычного потока — это, по сути, означает, что элемент не будет отображаться на странице, например:

1
<p class=»example-text»>I will not be rendered on the page</p>
1
2
3
.example-text {
    -webkit-flow-into: example-text-flow;
}

Однако есть некоторые исключения: если для свойства flow-in задано значение none, элемент не будет частью именованного потока и, следовательно, будет подвергаться обычному отображению на странице. Как вы могли догадаться, другой случай, когда элемент, который является частью именованного потока, будет отображаться, когда с ним связана действительная область.

Несколько элементов могут быть помещены в один и тот же именованный поток:

1
2
3
4
5
6
7
#example-1 {
    -webkit-flow-into: my-named-flow;
}
 
#example-2 {
    -webkit-flow-into: my-named-flow;
}

Если для «my-named-flow» существует связанная область, будет предпринята попытка передать два элемента ( #example-1 & #example-2 ) в их цепочку соответствующих областей.

Это не просто кусочки текста, которые можно поместить в именованный поток, мы также можем поместить изображения ! Возможность помещать все виды HTML-элементов в именованные потоки — мощная вещь. Например, скажем, у нас было два отдельных списка, но с точки зрения представления мы хотели показать их вместе. Один из способов добиться этого — использовать CSS-селекторы для нацеливания только на те части, которые нам нужны, и поместить их в именованный поток, например (фрагмент кода):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<article id=»css3″>
  <header><h4>CSS3</h4></header>
  <ul>
    <li>Media Queries</li>
    <li>Text Shadows</li>
    <li>3D Transforms</li>
  </ul>
</article>
   
<article id=»html5″>
  <header><h4>HTML5</h4></header>
  <ul>
    <li>Canvas</li>
    <li>Drag-and-drop</li>
    <li>Web Storage</li>
  </ul>
</article>
 
   
<div id=»buzzwords-region»></div>
01
02
03
04
05
06
07
08
09
10
11
12
13
/* Only put the list within the article into a named flow */
#css3 > ul {
-webkit-flow-into: buzzwords-flow;
}
 
#html5 > ul {
-webkit-flow-into: buzzwords-flow;
}
 
#buzzwords-region {
-webkit-flow-from: buzzwords-flow;
border: 1px solid green;
}
Результат объединения двух списков с использованием областей CSS

( Демонстрация выше. ) Если вы посмотрите на исходный код, вы заметите, что наши списки HTML5 и CSS3 были объединены в новый список. Обратите внимание на то, что заголовки этих списков не были целевыми в селекторах CSS и, следовательно, не являются частью какого-либо именованного потока, поэтому они по-прежнему отображаются на странице и не содержатся внутри региона.


Свойство flow-from может взять контейнер, например пустой div, и превратить его в область. Чтобы он превратился в действительный регион, он должен иметь связанный именованный поток. Как уже говорилось, именованные потоки создаются с использованием свойства flow-into, а затем с использованием идентификатора в качестве его значения.

1
<div class=»region»></div>
1
2
3
.region {
    -webkit-flow-from: my-named-flow;
}

Подобно свойству flow-in, мы можем присвоить значение ‘none’ свойству flow-from, что делает соответствующий элемент не чем иным, как контейнером, например, он не будет действовать как регион.

При применении свойства flow-from к элементу у него не будет высоты или ширины, поэтому вам необходимо установить их для просмотра содержимого области. Регионы могут действовать как цепочки областей только для одного именованного потока, поэтому несколько элементов могут перетекать в один именованный поток, однако регион может перетекать только из одного именованного потока. Регион будет поддерживать стили своего исходного элемента; это означает, что если исходный элемент имеет значение цвета красный, текст будет по-прежнему отображаться красным при визуализации как части региона.

Спецификация CSS Region рассматривает возможность использования правил @region для стилизации конкретного региона.

«Правило @region содержит объявления стилей, специфичные для определенных регионов».

Это может учитывать синтаксис CSS (похожий на синтаксис медиазапросов), например:

01
02
03
04
05
06
07
08
09
10
11
/* A regular style on all paragraph tags */
p {
    font-weight: normal;
}
 
@region #my-region {
    /* When text from the p element is flowing into #my-region, use the styling below */
    p {
        font-weight: bold;
    }
}

Возможность сделать это позволит применить к источнику стиль, специфичный для региона, в настоящее время настройка, например, «font-weight: bold» для региона, не приведет к выделению содержимого, отображаемого в нем, — стиль должен быть применен к исходный элемент.


На момент написания этой статьи в браузерах на основе Webkit была некоторая поддержка для доступа к информации о CSS-регионах через JavaScript. Используя JavaScript, мы можем выбрать поток по его идентификатору и выяснить, какие регионы связаны с ним. Мы даже можем узнать статус определенного региона, может быть случай использования, когда пустые регионы нуждаются в особой обработке, используя JavaScript, мы можем сделать это.

Именованный поток может быть доступен в JavaScript с помощью document.getFlowByName (‘identifier’) (Вы можете попробовать это в консоли разработчика в демонстрационной версии.)

Возвращаемый объект getFlowByName

Возвращаемый объект — это то, что называется WebkitNamedFlow. flow.contentNodes будет содержать массив элементов HTML, которые используются в качестве источника для доступа к потоку.

Способность определять, какой контент принадлежит каким регионам, может оказаться полезной в различных ситуациях.

В приведенном выше коде мы сначала находим наш поток на странице, используя имя потока, затем, используя API селекторов, получаем доступ к фрагменту содержимого на странице и передаем его в качестве аргумента getRegionsByContentNode (), который возвращает список элементов, которые используются в качестве регионов для этой конкретной части контента.

Мы можем очень быстро определить статус региона с точки зрения его соответствия содержимому.

element.regionOverflow будет возвращать разные значения в зависимости от того, как он обрабатывает исходный контент. Существует четыре возможных значения: «переполнение», «соответствие», «пусто» и «неопределено»

  • переполнение: содержимое не помещается в указанный регион и будет переполнено в следующий регион, если оно доступно
  • fit: область успешно содержит контент, и переполнение не требуется.
  • empty: внутри выделенной области нет содержимого, и поэтому оно пустое (как обычно будет в случае с регионом, предыдущая область которого возвращает ‘fit’ для regionOverflow)
  • undefined: элемент не является допустимым регионом.

Вы можете попробовать это с помощью инструментов разработчика в Chrome, на демонстрационной странице щелкните правой кнопкой мыши на одном из синих полей (регион) и выберите «Проверить элемент». Вы можете обнаружить, что выбран исходный элемент, а не регион div. Попробуйте найти ближайший div с классом ‘region’ и выберите один из дочерних div (они должны появиться пустыми). В этот момент вы можете нажать клавишу Escape на клавиатуре, которая должна вызвать консоль; теперь в качестве удобного ярлыка вы можете ввести $ 0 в консоль для доступа к выбранному элементу. Теперь попробуйте набрать:

Использование ярлыка «доллар ноль» в консоли разработчика для доступа к выбранному элементу

Здравствуйте! Спасибо за чтение этого учебника, вот некоторые дополнительные сведения, которые могут вас заинтересовать.