改頁をする場所
先ず、改頁出来る場所は、大きく2ヶ所、
- 非フロートブロックボックスの間にあるマージン部分、
- ブロックボックス内の行ボックス同士の間
です。
前者の場合、最も優先されるのは、'page-break-inside'です。これの値にavoidを指定すると、その子孫要素に至るまで、すべての箇所で改頁は禁止されます。そうで無い場合、'page-break-before'又は'page-break-after'が'always'か'left'か'right'の場合、そこで必ず改頁します。その要素の'page-break-before'と前の要素の'page-break-after'が異なる場合、どう処理するかはUA依存です。仕様書だと結果的にalwaysと同じに処理するのが最も良いとされています。
後者の場合、以下のようにするのが最も良いとされています。
例えば、'orphans'の値が'4'、'widows'の値が'2'で、ページの最下段に20行分の余裕があるとします。
- ページ末尾の段落が20行以下なら、段落全体をそのぺージに収めます。
- ページ末尾の段落が21行か22行なら、'widows'の制約に違反しないように、次のページにはちょうど2行侵入します。
- ページ末尾の段落が23行以上なら、そのページに20行入れて、次のページに残りの行を収めます。
次に、'orphans'の値が'10'、'widows'の値が'20'で、ページの最下段に8行分の余裕があるとします。
- ページ末尾の段落が8行以下なら、段落全体をそのぺージに収めます。
- ページ末尾に来るはずの段落が9行以上なら、'orphans'の制約に違反しないように、その段落はブロックごと次のページへ移します。
ほかにも、以下のような事が最も良いとされています。
- 改頁回数は出来るだけ少なくします。
- 強制改頁で終わらないすべてのページは、出来るだけ同じ程度の高さを持つようにします。
- ボーダーがあるブロックの途中で改頁するのは避けます。
- 表の途中で改頁するのは避けます。
- フロート要素の途中で改頁するのは避けます。