- From: fantasai <fantasai.lists@inkedblade.net>
- Date: Mon, 13 Apr 2009 14:16:10 -0700
- To: www-style@w3.org, "Grant, Melinda" <melinda.grant@hp.com>, Michael Day <mikeday@yeslogic.com>, MURAKAMI Shinyu <murakami@antenna.co.jp>
I had an action item to write a detailed proposal for allowing page-based
counters and document-based counters to interact. The constraints on this
proposal are:
- It must be precisely and completely defined so that it can be
interoperably implemented.
- It must not cause incremental rendering problems. Specifically,
rendering a page later in the document must not create a counter
scope that starts before that page. (See dbaron's discussion of
this problem in
http://lists.w3.org/Archives/Public/www-style/2008Nov/0024.html
- It must address the use cases for page-document counter interactions,
such as a chapter-scoped page counter or a page-scoped footnote counter.
So here's my attempt to define the interaction of page and document counters.
At every page break (including start of document, which corresponds to
start of root element, i.e. immediately before :root::before):
1. Apply any counter-reset and counter-increment rules to the page box,
creating and incrementing counters as if all page boxes, including
this one, were sibling elements in a document. These counters are in
the @page counter scope, and do not affect content in the document.
2. Apply all @page resets and increments to all document counters in
scope at every element break point at the page break. That is, from
each element that breaks walk up the ancestor chain collecting
counter scopes. (In CSS3, the UA may instead collect only the
scopes associated with the latest break in the normal flow of the
root element.) Then apply all @page-based counter-reset and
counter-increment declarations as if an element with these
declarations existed in each counter scope at the exact position
of the break point in that counter scope.
(Multiple break points are caused by e.g. floats and tables. When
multiple columns of content break across the page, each column has
a break point.)
Example: Suppose we have two table cells side-by-side. We increment
counters scoped to the first cell at the point corresponding to the
breakpoint in that cell, then we increment any counters scoped to
the second cell, the table row, and all ancestor elements at the
point corresponding to the breakpoint in the second cell. If multiple
counter scopes with the same counter name are encountered, they each
get incremented. (In CSS3, however, the UA is not required to increment
counters scoped to the first cell at the page break.)
The effect of @page counter rules at breaks in overflowing content
is undefined. (This because some implementations print incrementally,
and can't back up to make counter increments apply to earlier content.)
3. Copy counters in scope at all break points, in document order,
into the @page counter scope, obscuring any counters of the same name
there. (In CSS3, this step is not required.)
4. Copy counters in scope at the latest break point in the normal
flow of the root element into the @page counter scope, obscuring any
counters of the same name there. This ensures that the counters in
the normal flow preside over counters in e.g. floated elements.
Comments?
~fantasai
Received on Monday, 13 April 2009 21:16:56 UTC