13  Страничные носители

Содержание


13.1 Введение

Страничный носитель (скажем, бумага, плёнка, страницы , выводимые на экране компьютера и т.п.) отличается от непрерывного носителя тем, что содержимое документа разделяется на одну либо больше абстрактных страниц. Дабы обрабатывать обрывы страниц, CSS2 расширяет модель визуального форматирования дальнейшим образом:

  1. Страничный бокс расширяет модель бокса, что дозволяет авторам специфицировать размеры страницы, её полей и т.д.
  2. Страничная модель расширяет модель визуального форматирования, дабы рассчитывать разрывы страниц.

Страничная модель CSS 2 специфицирует, как форматируется документ в пределах прямоугольной области - страничного бокса - тот, что имеет финальные ширину и высоту. Страничный бокс не непременно соответствует реальному листу\странице, на котором документ в конце концов будет выведен (бумага, плёнка, экран и т.п.). Страничная модель CSS специфицирует форматирование в страничном боксе, но за перенос страничного бокса на лист отвечает пользовательский шпион (ПА).
Некоторые возможности переноса:

Хотя CSS2 не специфицирует то, как  ПА переносят страничные боксы на листы, не даётся также и определённого механизма для того, дабы осведомить ПА о размерах и ориентации целевого листа.


13.2 Страничные боксы: правило  @page

Страничный бокс это прямоугольный регион, содержащий две области:

Примечание. В CSS2 свойства рамки и заполнения не используются к страницам; это допустимо в грядущем.

Авторы специфицируют размеры, ориентацию, поля и т.п. страничного бокса в правиле  @page. Правило @page состоит из ключевого слова "@page", селектора станицы (и, без пробелов, допустимого псевдокласса страницы) и блока объявлений (находящихся в т.н. контексте страницы).

Селектор страницы специфицирует, для каких страниц объявления используются. В CSS2 селекторы страницы могут обозначать первую страницу, все левые страницы, все правые страницы либо страницу с определённым именем.

Размеры страничного бокса устанавливаются свойством 'size'.
Размеры области страницы - это размеры страничного бокса минус область полей.

Пример(ы):

Следующее правило @page устанавливает размер страничного бокса в 8.5 x 11 дюймов и создаёт поле '2см' со всех сторон между краем страничного бокса и областью листа:

@page { size 8.5in 11in; margin: 2cm }
Качество 'marks' в правиле @page специфицирует знаки обрезки и крестика для страничного бокса.


13.2.1 Поля страницы

Свойства полей ('margin-top', 'margin-right', 'margin-bottom', 'margin-left' и 'margin') используются внутри контекста страницы. На дальнейшей диаграмме показаны соотношения между листом, страничным боксом и полями страницы:

Illustration of sheet, page
box, margin, and page area.   [D]

Вычисленное значение полей бокса вверху либо внизу области страницы - '0'.

Контекст страницы не имеет никаких указаний о шрифте, так что единицы измерения 'em' и 'ex' не допускаются. Процентные значения свойств полей относительны к размерам страничного бокса; для левого и правого полей - они соотносятся с шириной страничного бокса, а для верхнего и нижнего полей - к высоте страничного бокса. Все другие единицы измерения, ассоциированные с соответствующими свойствами CSS2, являются возможными.

Из-за отрицательных значений полей (у страничного бокса либо у элементов) либо абсолютного позиционирования содержимое может оканчиваться вне страничного бокса, но это содержимое может быть "вырезано" - ПАгентом, принтером либо, наконец, бумажным ножиком.


13.2.2 Размер страницы: качество 'size'

'size'
Значение:<length>{1,2} | auto | portrait | landscape | inherit
Начальное:auto
Применяется:  к контексту страницы
Наследуется:N/A
Процентное:N/A
Носитель:визуальный, страничный

Это качество специфицирует размер и ориентацию страничного бокса.

Размер страничного бокса может быть либо "absolute/абсолютным" (фиксированный размер), либо "relative/относительным" (масштабируемым, т.е. соответствующим имеющимся размерам листа). Относительные страничные боксы дозволяют ПА масштабировать документ и оптимально применять целевые размеры.

Три значения свойства 'size' создают относительный страничный бокс:

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

Пример(ы):

Здесь внешний край страничного бокса будет выровнен с целевым. Процентные значения свойства 'margin' - относительны к целевым размерам, следственно, если целевые размеры -  21.0см x 29.7см (т.е. A4), поля будут 2.10см и 2.97см.

@page {
  size: auto;   /* auto это исходное значение */
  margin: 10%;
}

Измеряемые значения свойства 'size' создают безусловный страничный бокс. Если специфицировано только одно значение, оно устанавливает и ширину, и высоту страничного бокса (т.е. квадратный бокс). От того что страничный бокс является начальным содержащим блоком, процентные значения для свойства 'size' не допускаются.

Пример(ы):

@page {
  size: 8.5in 11in;  /* ширина - высота */
}

В этом примере устанавливаются: ширина страничного бокса - 8.5 дюймов и высота - 11 дюймов. Такой страничный бокс требует размеров целевого листа 8.5"x11" либо огромнее.

ПА могут разрешать пользователям контролировать перенос страничного бокса на лист (скажем, поворачивать безусловный страничный бокс при печати).

Размещение страничных боксов, не помещающихся на листе

Если страничный бокс не вмещается в размеры целевого листа, ПА может:

ПА должен запрашивать у пользователя доказательство на эти операции.

Позиционирование страничного бокса на листе

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


13.2.3 Знаки обрезки: качество 'marks'

'marks'
Значение:[ crop || cross ] | none | inherit
Начальное:none
Применяется:  к контексту страницы
Наследуется:N/A
Процентное:N/A
Носитель:визуальный, страничный

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

Знаки обрезки обозначают место, где страница должна быть обрезана.
Знак "крестик" (вестимый также как знак регистрации) применяется для выравнивания листов.

Маркировка видна только на безусловных страничных боксах (см. качество 'size'). При относительных страничных боксах, страничный бокс будет выровнен с целевым, а маркировка будет находиться за пределами области печати.

Размеры, жанр и расположение крестиков зависят от ПА.


13.2.4  Левая, правая и первая страницы

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

Все страницы механически систематизируются ПАгентами на псевдоклассы :left  либо :right.

Пример(ы):

@page :left {
  margin-left: 4cm;
  margin-right: 3cm;
}

@page :right {
  margin-left: 3cm;
  margin-right: 4cm;
}

Если даны различные объявления для левых и правых страниц, ПА обязан применять эти объявления, даже если ПА не переносит страничные боксы на левый и правый листы (скажем, для принтера, имеющего только одностороннюю печать).

Авторы могут специфицировать также жанр для первой страницы документа псевдоклассом :first:

Пример(ы):

@page { margin: 2cm } /* Все поля установлены в 2см */

@page :first {
  margin-top: 10cm    /* Верхнее поле на первой странице - 10см */
}

Является ли первая страница документа :left либо :right, зависит от направления письма в документе и находится вне пределов рассмотрения данного документа. Впрочем, дабы форсировать первую страницу в :left либо :right, авторы могут вставить обрыв страницы перед первым генерируемым боксом (скажем, в HTML, специфицировать это для элемента BODY).

Свойства, специфицированные в :left (либо :right) в правилах @page, переопределяют те же свойства, специфицированные в правиле @page  и не имеющие специфицированного псевдокласса. Свойства, специфицированные в :first в правиле @page, переопределяют те же свойства, специфицированные в :left (либо :right) в правилах @page.

Примечание. Добавление объявлений в псевдоклассы :left либо :right не указывает, выходит ли документ на принтер одно- либо двухсторонним (это находится вне рамок данной спецификации).

Примечание. В грядущих версиях CSS допустимо происхождение других псевдоклассов страницы.


13.2.5  Содержимое вне страничного бокса

При форматировании содержимого модели страницы, часть содержимого может выйти за границы страничного бокса. Скажем, элемент, чьё качество 'white-space' имеет значение 'pre', может генерировать бокс, тот, что окажется шире страничного бокса. Также, если боксы позиционированы абсолютно, они могут оканчиваться в "несогласованном" месте. Скажем, изображения могут быть помещены у края страничного бокса либо на 100,000 дюймов ниже страничного бокса.

Спецификация точного форматирования таких элементов находится вне пределов рассмотрения данного документа. Впрочем мы рекомендуем, дабы авторы и ПА рассматривали следующие всеобщие тезисы, касающиеся содержимого вне страничного бокса:


13.3 Разрывы страниц

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


13.3.1 Разрывы перед/после элементов: 'page-break-before', 'page-break-after', 'page-break-inside'

'page-break-before'
Значение:auto | always | avoid | left | right | inherit
Начальное:auto
Применяется:  к элементам яруса блока
Наследуется:нет
Процентное:N/A
Носитель:визуальный, страничный
'page-break-after'
Значение:auto | always | avoid | left | right | inherit
Начальное:auto
Применяется:  к элементам яруса блока
Наследуется:нет
Процентное:N/A
Media:  визуальный, страничный
'page-break-inside'
Значение:avoid | auto | inherit
Начальное:auto
Применяется:  к элементам яруса блока
Наследуется:да
Процентное:N/A
Media:  визуальный, страничный

Значения этих свойств имеют дальнейший толк:

auto
Ни форсирует, ни воспрещает обрыв страницы перед (позже, внутри) генерируемого бокса.
always
Всегда форсирует обрыв страницы перед (позже, внутри) генерируемого бокса.
avoid
Исключает обрыв страницы перед (позже, внутри) генерируемого бокса.
left
Форсирует один либо два обрыва страницы перед (позже, внутри) генерируемого бокса, так что дальнейшая страница форматируется как левая страница.
right
Форсирует один либо два обрыва страницы перед (позже, внутри) генерируемого бокса, так что дальнейшая страница форматируется как правая страница.

Потенциально размещение обрыва страницы находится под влиянием свойства 'page-break-inside' родительского элемента, свойства 'page-break-after' предыдущего элемента и свойства 'page-break-before' дальнейшего элемента. Если эти свойства имеют значения, чудесные от 'auto', то значения 'always', 'left' и 'right' получают превосходство перед 'avoid'.
См. в разделе о допустимых обрывах страниц точные правила того, как эти свойства могут форсировать либо подавлять обрыв страницы.


13.3.2 Использование именованных страниц: 'page'

'page'
Значение:<identifier> | auto
Начальное:auto
Применяется:  к элементам яруса блока
Наследуется:да
Процентное:N/A
Носитель:визуальный, страничный

Свойство 'page' дозволено применять для спецификации определённого типа страницы, на которой элемент должен быть выведен.

Пример(ы):

Все таблицы будут помещены на правой стороне страницы с ориентацией landscape:

@page rotated {size: landscape}
TABLE {page: rotated; page-break-before: right}

Свойство 'page' работает так: если бокс блока с инлайн-содержимым имеет качество 'page', чудесное от аналогичного свойства предшествующего бокса блока с инлайн-содержимым, тогда один либо два обрыва страницы вставляются между ними, и боксы позже обрыва отображаются в страничном боксе именованного типа. См. ниже "Форсированные обрывы страниц".

Пример(ы):

В этом примере две таблицы отображаются на landscape-страницах (либо на одной странице, если входят), и тип страницы "narrow" вообще не применяется, против установкам в DIV:

@page narrow {size: 9cm 18cm}
@page rotated {size: landscape}
DIV {page: narrow}
TABLE {page: rotated}
с этим документом:
<DIV>
<TABLE>...</TABLE>
<TABLE>...</TABLE>
</DIV>

13.3.3 Разрывы внутри элементов: 'orphans', 'widows'

'orphans'
Значение:<integer> | inherit
Начальное:2
Применяется:  к элементам яруса блока
Наследуется:да
Процентное:N/A
Носитель:визуальный, страничный
'widows'
Значение:<integer> | inherit
Начальное:2
Применяется:  к элементам яруса блока
Наследуется:да
Процентное:N/A
Носитель:визуальный, страничный

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

Информацию о форматировании параграфов см. в разделе Строчные боксы.


13.3.4 Допустимые обрывы страниц

При типичном обтекании обрывы страниц могут возникать в следующих местах:

  1. На вертикальном поле между боксами блока. Если обрыв страницы возникает тут, вычисленные значения соответствующих свойств 'margin-top' и 'margin-bottom' установлены в '0'.
  2. Между строчными боксами внутри бокса блока.

Эти обрывы являются субъектами для следующих правил:

Если вышесказанное не обеспечивает довольное число точек обрывов для предотвращения выхода содержимого за пределы страничного бокса, тогда правила B и D исключаются для того, дабы обнаружить добавочные точки обрывов.

Если это всё ещё не даёт довольного числа точек обрывов, то правила A и C также исключаются, дабы обнаружить добавочные точки обрывов.

Разрывы страниц не могут возникать внутри боксов, позиционированных абсолютно.


13.3.5 Форсированные обрывы страниц

Разрыв страницы обязан появиться в (1), если среди свойств 'page-break-after' и 'page-break-before' всех элементов, генерирующих боксы у данного поля, имеется по меньшей мере одно со значением 'always', 'left' либо 'right'.

Разрыв страницы обязан возникнуть в (1), если конечный строчный бокс выше этого поля и 1-й бокс - ниже него не имеют идентичного значения для 'page'.


13.3.6 "Наилучшие" обрывы страниц

CSS2 не определяет, какой из комплектов возможных обрывов страниц обязан применяться; CSS2 не воспрещает ПАгенту делать обрыв в всякий допустимой точке обрыва либо не делать обрывов вообще. Но CSS2 рекомендует, дабы ПА следовали дальнейшей эвристике (признавая присутствие некоторых возражений):

Пример(ы):

Предположим, скажем, что таблица жанров содержит 'orphans : 4', 'widows : 2', и имеется 20 свободных строк (строчных боксов) внизу нынешней страницы:

Теперь представим, что 'orphans' - '10', 'widows' - '20', и имеется 8 свободных строк внизу нынешней страницы:


13.4 Каскадирование в контексте страницы

Объявления в контексте страницы подчиняются каскаду так же, как и типичные объявления CSS2.

Пример(ы):

@page {
  margin-left: 3cm;
}

@page :left {
  margin-left: 4cm;
}

Из-за больше высокой специфики селектора псевдокласса, левое поле левых страниц будет '4см', а все остальные страницы (т.е. правые) - левое поле '3см'.