Свойство CSS `reading-flow`
Baseline Ограниченная доступность
Эта функция не входит в Baseline, поскольку не работает в некоторых наиболее широко используемых браузерах.
Экспериментальная: Это экспериментальная технология
Перед использованием в рабочей среде внимательно ознакомьтесь с таблицей совместимости с браузерами.
Экспериментальная: Это экспериментальная технология
Перед использованием в рабочей среде внимательно ознакомьтесь с таблицей совместимости с браузерами.
Свойство reading-flow CSS позволяет изменять порядок чтения дочерних элементов блочного, flex- или grid-макета. Это влияет на порядок, в котором они озвучиваются и становятся доступными при последовательной навигации, например при переходе по ссылкам и кнопкам клавишей Tab.
Синтаксис
/* Keyword values */ reading-flow: normal; reading-flow: flex-visual; reading-flow: flex-flow; reading-flow: grid-columns; reading-flow: grid-rows; reading-flow: grid-order; reading-flow: source-order; /* Global values */ reading-flow: inherit; reading-flow: initial; reading-flow: revert; reading-flow: revert-layer; reading-flow: unset;
Значение
Свойству reading-flow можно задать одно из следующих ключевых слов:
-
normal - Значение по умолчанию. Порядок чтения соответствует порядку элементов в DOM.
-
flex-visual - Влияет только на flex-контейнеры. Порядок чтения соответствует визуальному порядку элементов
flexс учётомwriting-mode. Поэтому порядок чтения документа на английском языке с заданными значениямиflex-direction: row-reverseиreading-flow: flex-visualбудет слева направо. -
flex-flow - Влияет только на flex-контейнеры. Порядок чтения соответствует направлению
flex-flow. -
grid-columns - Влияет только на grid-контейнеры. Порядок чтения соответствует визуальному порядку элементов сетки, столбец за столбцом, с учётом режима письма.
-
grid-rows - Влияет только на grid-контейнеры. Порядок чтения соответствует визуальному порядку элементов сетки, строка за строкой, с учётом режима письма.
-
grid-order - Влияет только на grid-контейнеры. Если к любому из дочерних элементов контейнера применено свойство
order, порядок чтения соответствует изменённому порядку элементов. Если к элементам сетки не применено свойствоorder,grid-orderдействует какnormal. -
source-order - Влияет на grid-, flex- и блочные контейнеры. Само по себе не оказывает эффекта: порядок чтения контейнера по-прежнему соответствует порядку элементов в DOM, но позволяет изменить его с помощью свойства
reading-order, заданного для дочерних элементов контейнера.
Описание
Свойство reading-flow изменяет порядок чтения элементов в блочном, flex- или grid-контейнере, если ему задано значение, отличное от normal. Такой контейнер называется контейнером потока чтения.
По умолчанию веб-содержимое читается в порядке исходного кода DOM. Как правило, исходный порядок должен задавать разумный порядок чтения содержимого, который также должен отражаться в визуальном расположении содержимого. Однако иногда визуальный порядок или порядок перехода по клавише Tab отличается от исходного. Например, при применении к документу нескольких flexbox- или grid-макетов с помощью медиазапросов для разных устройств или потребностей пользователей порядок содержимого может меняться в зависимости от ширины области просмотра. В таком случае можно использовать reading-flow, чтобы порядок чтения и перехода по клавише Tab соответствовал визуальному порядку.
В некоторых случаях может потребоваться дополнительно настроить порядок чтения внутри контейнера потока чтения. Для этого можно задать дочерним элементам контейнера значения свойства reading-order, распределив их по порядковым группам, которые затем будут озвучиваться в числовом порядке.
Взаимодействие с tabindex
Если сделать доступными для фокусировки дочерние элементы контейнера потока чтения, которые обычно не получают фокус, задав им атрибуты tabindex="0", их порядок чтения будет изменён ожидаемым образом свойствами reading-flow и reading-order — так же, как у интерактивных элементов, например <a> или <button>.
Однако любые попытки изменить порядок перехода по содержимому контейнера потока чтения с помощью положительных значений tabindex будут проигнорированы и переопределены действием reading-flow и reading-order. В целом использовать такие значения не следует; см. статью Не задавайте tabindex больше 0. Свойства reading-flow и reading-order позволяют гораздо лучше изменить порядок перехода по содержимому, если это необходимо.
Формальное определение
| Начальное значение | normal |
|---|---|
| Применяется к | Блочным контейнерам, flex-контейнерам и grid-контейнерам |
| Наследуется | нет |
| Вычисленное значение | как задано |
| Тип анимации | Без анимации |
Примеры
Сравнение значений для flex
В этом примере мы покажем, как разные значения reading-flow влияют на flex-контейнер с элементами в обратном порядке.
HTML
Разметка включает элемент <select> для выбора разных значений reading-flow и обёртку <div> с тремя элементами <a>.
<form>
<label for="reading-flow">Choose reading flow:</label>
<select id="reading-flow">
<option>normal</option>
<option>flex-visual</option>
<option>flex-flow</option>
</select>
</form>
<div class="wrapper">
<a href="#">Item 1</a>
<a href="#">Item 2</a>
<a href="#">Item 3</a>
</div>
CSS
Мы задаём значение flex свойства display, чтобы превратить <div> во flex-контейнер, и выводим flex-элементы в строку в обратном порядке относительно DOM, задав значение row-reverse свойству flex-direction. Изначально мы задаём reading-flow значение normal, чтобы элементы читались или становились доступными при переходе по клавише Tab в порядке исходного кода DOM.
Мы также задаём значение 1 свойству order первого элемента <a>, чтобы он отображался после второго и третьего элементов во flex-потоке. Визуальный порядок flex-элементов слева направо будет таким: «Элемент 1», «Элемент 3», затем «Элемент 2», однако порядок элементов в DOM останется неизменным.
.wrapper {
display: flex;
flex-direction: row-reverse;
reading-flow: normal;
gap: 1em;
}
a:first-child {
order: 1;
}
JavaScript
В скрипте мы получаем ссылки на элемент <select> и обёртку <div>, а затем добавляем обработчик события change для элемента <select>. При выборе нового значения оно задаётся как значение свойства reading-flow для обёртки.
const selectElem = document.getElementById("reading-flow");
const wrapperElem = document.querySelector(".wrapper");
selectElem.addEventListener("change", () => {
wrapperElem.style.readingFlow = selectElem.value;
});
Результат
Демонстрация выглядит так:
Сначала попробуйте переходить по ссылкам клавишей Tab, когда задано reading-flow: normal. Порядок перехода будет таким: «Элемент 1», «Элемент 2», затем «Элемент 3», поскольку именно так элементы расположены в DOM.
Теперь измените значение reading-flow и снова попробуйте переходить по ссылкам клавишей Tab:
- Значение
flex-visualзадаёт порядок перехода «Элемент 1», «Элемент 3», затем «Элемент 2», соответствующий визуальному порядку, полученному в результате применения свойств flexbox. - Значение
flex-flowзадаёт порядок перехода «Элемент 2», «Элемент 3», затем «Элемент 1», соответствующий направлениюflex-flow— в данном случаеrow-reverse. Здесь порядок перехода обратен порядку отображения.
Сравнение значений для grid
В этом примере мы покажем, как разные значения reading-flow влияют на grid-контейнер.
HTML
Разметка включает элемент <select> для выбора разных значений reading-flow и обёртку <div> с четырьмя элементами <a>.
<form>
<label for="reading-flow">Choose reading flow:</label>
<select id="reading-flow">
<option>normal</option>
<option>grid-rows</option>
<option>grid-columns</option>
<option>grid-order</option>
</select>
</form>
<div class="wrapper">
<a class="a" href="#">Item A</a>
<a class="b" href="#">Item B</a>
<a class="c" href="#">Item C</a>
<a class="d" href="#">Item D</a>
</div>
CSS
Мы задаём значение grid свойства display, чтобы превратить <div> в grid-контейнер, и размещаем элементы сетки в трёх столбцах с помощью свойства grid-template-columns. Мы также задаём grid-template-areas, чтобы определить области размещения в этих столбцах, и помещаем элементы <a> в эти области с помощью свойства grid-area. Изначально мы задаём reading-flow значение normal, чтобы элементы читались или становились доступными при переходе по клавише Tab в стандартном порядке исходного кода DOM.
Наконец, мы задаём значение 1 свойству order первого элемента <a>; это не влияет на макет, поскольку не переопределяет размещение в области сетки, но повлияет на результат при задании определённого значения reading-flow, как вы увидите далее.
При чтении слева направо визуальный порядок элементов сетки будет таким: «Элемент D», «Элемент B», «Элемент C», затем «Элемент A».
.wrapper {
display: grid;
grid-template-columns: repeat(3, 150px);
grid-template-areas:
"d b b"
"c c a";
reading-flow: normal;
}
.a {
grid-area: a;
}
.b {
grid-area: b;
}
.c {
grid-area: c;
}
.d {
grid-area: d;
}
a:first-child {
order: 1;
}
JavaScript
В скрипте мы получаем ссылки на элемент <select> и обёртку <div>, а затем добавляем обработчик события change для элемента <select>. При выборе нового значения оно задаётся как значение свойства reading-flow для обёртки.
const selectElem = document.getElementById("reading-flow");
const wrapperElem = document.querySelector(".wrapper");
selectElem.addEventListener("change", () => {
wrapperElem.style.readingFlow = selectElem.value;
});
Результат
Демонстрация выглядит так:
Сначала попробуйте переходить по ссылкам клавишей Tab, когда задано reading-flow: normal. Порядок перехода будет таким: «Элемент A», «Элемент B», «Элемент C» и «Элемент D», поскольку именно так элементы расположены в DOM.
Теперь измените значение reading-flow и снова попробуйте переходить по ссылкам клавишей Tab:
- Значение
grid-rowsзадаёт порядок перехода, соответствующий визуальному порядку отображения по строкам: «Элемент D», «Элемент B», «Элемент C», затем «Элемент A». - Значение
grid-columnsзадаёт порядок перехода, соответствующий визуальному порядку отображения по столбцам: «Элемент D», «Элемент C», «Элемент B», затем «Элемент A». - Значение
grid-orderзадаёт порядок перехода по DOM с учётом изменений значенияorder. Поскольку для первого элемента<a>заданоorder: 1;, порядок перехода будет таким: «Элемент B», «Элемент C», «Элемент D», затем «Элемент A».
Изменение порядка чтения в блочных контейнерах
В этом примере мы покажем, как значение reading-flow: source-order влияет на блочный контейнер.
HTML
Разметка включает обёртку <div> с четырьмя элементами <a>.
<div class="wrapper"> <a class="a" href="#">Item A</a> <a class="b" href="#">Item B</a> <a class="c" href="#">Item C</a> <a class="d" href="#">Item D</a> </div>
CSS
Мы задаём reading-flow значение source-order, чтобы элементы читались или становились доступными при переходе по клавише Tab в порядке исходного кода DOM, но при этом разрешаем изменять порядок чтения с помощью свойства reading-order. Мы задаём значение 1 свойству reading-order первого элемента <a>.
.wrapper {
reading-flow: source-order;
}
a:first-child {
reading-order: 1;
}
Результат
Демонстрация выглядит так:
Попробуйте переходить по ссылкам клавишей Tab: порядок перехода будет таким: «Элемент B», «Элемент C», «Элемент D», затем «Элемент A». Порядок элементов в DOM сохраняется, однако для элемента A задана группа с более высоким порядковым номером чтения, чем для остальных (значение reading-order по умолчанию — 0), поэтому к нему переходят последним.
Спецификации
| Спецификация |
|---|
| Модуль CSS Display, уровень 4 # reading-flow |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | |
reading-flow |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
flex-flow |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
flex-visual |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
grid-columns |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
grid-order |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
grid-rows |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
normal |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
source-order |
137 |
137 |
Нет |
121 |
Нет |
137 |
Нет |
90 |
Нет |
30.0 |
137 |
Нет |
См. также
reading-order-
Примеры CSS
reading-flowна chrome.dev
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/reading-flow