- From: Håkon Wium Lie <howcome@opera.com>
- Date: Wed, 21 Jan 2009 17:42:31 +0100
- To: Stephen Zilles <szilles@adobe.com>
- Cc: MURAKAMI Shinyu <murakami@antenna.co.jp>, "www-style@w3.org" <www-style@w3.org>
Also sprach Stephen Zilles:
> Since I expressed some concern about the direction being proposed
> for CSS2.1 with respect to margins at the top (and bottom) of pages
> and columns, I would like to summarize the discussion as it has
> occurred on this list and during the CSS WG meeting.
>
> The current state of affairs
> ============================
> The CSS2.1 specification says that margins at the top (or bottom)
> of a page are set to zero; that is, they have not affect.
(Actually, the spec only says something about page breaks, which means
-- at least in my interpretation -- that the top of the first page and
the bottom of the last page is excluded)
> 13.3.3 Allowed page breaks
> In the normal flow, page breaks can occur at the following places:
>
> 1. In the vertical margin between block boxes. When a page break
> occurs here, the used values [p. 92] of the relevant 'margin-top'
> and 'margin-bottom' properties are set to '0'.
>
> The justification for this rule, stated by Håkon in his first post,
> is that margins are to keep blocks separated, but if the "adjacent"
> blocks in the normal flow are on two separate pages, then there is
> no need for margins to separate the blocks.
Right.
> Moving toward a revision of CSS 2.1
> ===================================
> The discussion in this thread has been about whether this is the
> correct choice, for CSS 2.1 and for CSS 3.
>
> The consensus seems to be forming around the principle that this is
> not the right choice for CSS 2.1 and that something (to be
> discussed below) should be done for CSS 3. (There is a separate
> discussion about whether a solution for pages should apply to
> columns; again more below.)
>
> The something to be done for CSS 2.1, let's call it "behavior *",
> is to distinguish page breaks caused by user action (the first page
> or page-breaks triggered by page-break-before) from page-breaks
> caused by normal formatting. If the page-break is caused by normal
> formatting, then 13.3.3, item 1. Applies and the relevant
> 'margin-top' and 'margin-bottom' properties are set to '0'. If the
> page-break is caused by user (stylesheet) action, then 13.3.3.,
> item 1. Does not apply and the 'margin-top' property is honored.
Right. Should we call them "natural" and "forced" page breaks?
> (There does not seem to be a similar case for the 'margin-bottom'
> property; even if the page-break is caused by user action, there
> are (currently) no use cases identified to justify special handling
> in this case.)
Yes. I'd be happy to always ignore margin-bottom at the bottom of
pages (even the last).
> Proposed Change to CSS 2.1:
> ===========================
> It is viewed as being too late to have "behavior *" become the
> required behavior for CSS 2.1. So, the proposal for CSS 2.1 is to
> say that either 13.3.3, item 1 or "behavior *" is acceptable in a
> conformant implementation of CSS 2.1.
>
> The reason for this change is that often (but not always) the
> insertion of a page-break by user action signals the start of a new
> section. It seems clear that authors will want their 'margin-tip'
> honored at the start of a new section.
>
> Note, however, that there are other reasons for using
> 'page-break-before' other than starting a new section. Consider the
> case of a table that will just fit on a page. In this case, the
> author may use 'page-break-before' to place the table on new page.
> Since this is not a new section, but just a continuation with a
> large object, the author would not expect the margin that his/her
> stylesheet assigned to tables in the normal flow to be honored. If
> "behavior *" is adopted, then it would be. But, it has been noted
> that the stylesheet author can, in this case, specify both that
> there should be a 'page-break-before' and 'margin-top: 0'. Without
> "behavior *" it is not possible, using 13.3.3., item 1, to apply a
> property that says "honor the 'margin-top'".
Yes.
> Even with the analysis of the previous paragraph, it seems to me
> (and this was my original objection to "behavior *") that having a
> special case handling for the first page and pages caused by
> 'page-break-before' is bad system architecture. I still think that
> it is bad system architecture because only one of the reasons for
> using 'page-break-before' (to start a new section) needs "behavior
> *". It is, however, too late to come up with a good solution for
> CSS 2.1 so we may have to accept "behavior *".
I think it's sound architechture -- by default you provide the
solution that works best in most cases, and then you allow other
behaviors to be specified.
> Note that 'page-break-after' was (intentionally) left out of the
> specification of "behavior *". This is because this property is
> applied to the block that proceeds the block which may or may not
> want its margin honored. For that reason, it does not make sense to
> change the behavior of 'page-break-after' because adding this
> property to a block does not give the stylesheet designer a chance
> to change the margin properties on the following block. (And, no
> use case for preserving the margin on new page has been identified
> for this case. Note that although a new page always starts at the
> top of the page, only the UA formatting the last page knows how
> much space is available on that page so the 'margin-bottom' may or
> may not fit on that page and the author cannot really tell which
> will be the case.)
I wouldn't distinguish between properties. To me, it's the fact that a
page break is forced which triggers a certain behavior. Forced page
breaks can also occur from settings on the 'page' property.
When I write style sheet, it's fairly arbitrary if I use
page-break-before or page-break-after.
> Proposed Changes to CSS 3:
> ==========================
> Several people have suggested (both on this thread and in the CSS
> WG discussion) that there needs to be a new property (or
> modifications to an existing property) to correctly identify the
> authors intent with respect to honoring the "margin-top" (and
> 'margin-bottom') of blocks at the beginning (or end) of a page. The
> reason for considering a new property (or modification of an old
> one) is that there is no uniform rule that seems to work for the
> two use cases cited above ("beginning a section" and "putting a
> table on a new page").
I disagree. I think we have a perfectly fine solution in behavior *,
you just have to write two declarations instead of one:
table.alone {
page: separate;
margin: 0;
}
If you add a new property, you still have to write two declarations.
> The key thing to note in designing such a property is that it is
> intended to control the interaction between content (a normal flow)
> that is being flowed into a sequence of containers (pages in the
> discussion above). The relationship between the content and the
> containers is only partially determined by the author (using
> explicit page-breaks); the remaining page-breaks are determined by
> the UA (formatter). Thus, any new property must be designed to
> control this relationship. Murakami-san, in the message below,
> proposes two new enumerated values to be added to the 'margin'
> values in addition to the length value for the 'margin'.
This, in effect, would make the margin-* properties shorthand properties.
That would turn 'margin' into short-short-hand? :)
I don't support changing the margin properties -- we have
interoperability now, and adding new values will complicate things.
> I will not repeat his discussion because I think it is clear. I
> think that this is a good way to indicate, for any particular
> margin value, whether it is to be (necessarily) honored at a
> page-break or it may (conditionaly) be set to zero at a page-break.
>
> If Murakami-san's proposal is adopted, and it is agreed that
> "behavior *" is desirable, then a third value, 'auto' is needed to
> perpetuate "behavior *"; that is, 'auto' is equivalent to 'discard'
> except on the first page or any page caused by a
> 'page-break-before'.
>
> Multi-columns
> =============
>
> The whole discussion above is in terms of pages (because that is
> all that is in CSS 2.1). But, CSS 3 has multiple columns. Having
> noted that, it seems clear that columns are as much a container
> that should trigger the special behavior (of margin suppression or
> honoring) in the same way that pages are handled. If a UA does not
> implement columns, then the column containment will be ignored and
> the user should expect that he get the same behavior (as he would
> have expected for columns) on the pages that are created. Clearly
> if not columns or pages are created (the typical browser case) than
> all of this discussion is moot.
>
> So, I support both adding "behavior *" as an option to CSS 2.1 and
> using Murakami-san's suggestion below with the addition of an
> "auto" value to reflect the addition of "behavior *".
I agree to adding behavior * to CSS 2.1 now.
Perhaps we could discuss the best solution for CSS3 on a white-board
in Tokyo?
-h&kon
Håkon Wium Lie CTO °þe®ª
howcome@opera.com http://people.opera.com/howcome
Received on Wednesday, 21 January 2009 16:43:23 UTC