Опубликован: 06.06.2006 | Доступ: свободный | Студентов: 3909 / 694 | Оценка: 4.34 / 4.02 | Длительность: 21:23:00
Лекция 13:

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

< Лекция 12 || Лекция 13: 12 || Лекция 14 >

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

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

Разрывы перед/после элементов: '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'.

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

Использование именованных страниц: '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>

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

'orphans'

Значение: <integer> | inherit

Начальное: 2

Применяется: к элементам уровня блока

Наследуется: да

Процентное: N/A

Носитель: визуальный, страничный

'widows'

Значение: <integer> | inherit

Начальное: 2

Применяется: к элементам уровня блока

Наследуется: да

Процентное: N/A

Носитель: визуальный, страничный

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

Информацию о форматировании параграфов см. в разделе "Модель визуального форматирования" .

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

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

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

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

  • Правило A: Разрывы из пункта (1) допускаются, только если свойства 'page-break-after' и 'page-break-before' всех элементов, генерирующих боксы у данного поля, разрешают это, что имеет место, когда по меньшей мере одно из них (свойств) имеет значение 'always', 'left' или 'right', или когда все они - 'auto'.
  • Правило B: В то же время, если все они - 'auto' и ближайший общий предок всех элементов имеет значение свойства 'page-break-inside' - 'avoid', тогда разрыв здесь не разрешается.
  • Правило C: Разрывы из пункта (2) допускаются, только если количество строчных боксов между разрывом и началом закрывающего бокса блока имеет значение 'orphans' или более, а количество строчных боксов между разрывом и концом бокса имеет значение 'widows' или более.
  • Правило D: В дополнение, разрывы (2) допускаются, только если свойство 'page-break-inside' - 'auto'.

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

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

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

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

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

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

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

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

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

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

  • Если параграф в конце текущей страницы содержит 20 строк или менее, он должен быть размещён на текущей странице.
  • Если параграф содержит 21 или 22 строк, вторая часть параграфа обязана не нарушать работы 'widows', и, следовательно, вторая часть обязана содержать точно две строки.
  • Если параграф содержит 23 строки или более, первая часть должна содержать 20 строк, а вторая часть - остальные строки.

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

  • Если параграф в конце текущей страницы содержит 8 строк или менее, он должен быть размещён на текущей странице.
  • Если параграф содержит 9 строки или более, он не может быть разделён (что могло бы нарушить работу orphans), следовательно, он должен быть перемещён как блок на следующую страницу.

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

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

@page {
  margin-left: 3cm;
}

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

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

< Лекция 12 || Лекция 13: 12 || Лекция 14 >