- From: Bert Bos <bert@w3.org>
- Date: Wed, 6 Oct 2010 18:28:14 +0200
- To: W3C style mailing list <www-style@w3.org>
On Monday 23 August 2010 04:22:24 Boris Zbarsky wrote: > On 8/22/10 9:19 AM, Bert Bos wrote: > > This is proposed text for issue 142[1]. Section 10.1 uses the term > > "ancestor box," by which it means the "box of an ancestor element." > > But apparently the term causes confusion. That is probably because > > in some cases and in some implementations the boxes form a tree. > > (CSS doesn't say that the boxes form a tree, only that each box is > > associated with an element and the elements form a tree.) > > > > So here is a rewrite to avoid the term. The following all occur in > > section 10.1: > > > > - Replace the first occurrence of "ancestor box" by "ancestor > > element". > > This doesn't give correct behavior with table anonymous boxes, as far > as I can tell. Specifically, given this markup: > > <div id="outer"> > <div id="row" style="display: table-row"> > <div id="inner"/> > </div> > </div> > > the proposed wording makes the "outer" div the containing block of > the "inner" one, whereas the desired containing block, and the one > all UAs use in practice, is the content edge of the anonymous > table-cell box generated between the table-row and the "inner" block Is that really desired? It seems to me that the anonymous table cell isn't a good choice for a containing block, because you cannot put properties on it. If the "inner" element has 'width: 50%', you want that to be 50% of something that you can control. The "outer" element fits that bill. (The example is a bit artificial, too. When you use table layout, you typically have at least a 'display: table' or a 'display-table-cell' somewhere.) > (which does not have an element associated with it, last I checked, > contrary to the "each box is associated with an element" claim above, > by the way). The anonymous table cell is one of the boxes of the "row" element, in my view. That element has, in this example, two boxes: a row and a cell (which happen to coincide). > > I haven't thought through other possible issues so far past that. After applying issue 120[1], bullet point 2 of section 10.1 reads: 2. For other elements [i.e., other than the root element. BB], if the element's position is 'relative' or 'static', the containing block is formed by the content edge of the nearest block container ancestor box. Where "block container box" is defined in 9.2.1 as: "A block container box either contains only block-level boxes or establishes an inline formatting context and thus contains only inline-level boxes." That makes my original suggestion of replacing "ancestor box" by "ancestor element" impossible. We somehow have to keep the three words "block container box" and replace "ancestor" with something before or after that term. The decision on issue 198 (about the containing block of a float inside a run-in) introduces an exception to the rule that the containing block is found by walking up the element tree: it states that the containing block of such a float is the content edge of the element that the run-in runs in to. Combining that, bullet 2 of section 10.1 could become: 2. For other elements, if the element's position is 'relative' or 'static', the containing block is one of the following: a. If the element is a 'run-in' that is rendered inline in a sibling element, then its containing block is the content edge of the principal box of that sibling. b. Otherwise, if the parent has a principal box that is a block container box (e.g., if the parent is a 'table-cell' or a 'block'), then the containing block is the content edge of the parent's principal box. c. Otherwise the containing block is the same as that of the parent. Still no anonymous boxes that establish containing blocks, and I think that is correct. Take this example: <div id=outer style="height: 20em"> Some text <button style="height: 50%">before</button> the image. <img src="x.png" alt="x" style="display: block"> </div> The text is wrapped in an anonymous block box, but the height of the BUTTON is 50% of the "outer" element, not of that anonymous box. Here is another example, a variation of Boris's: <div id="outer"> <div id="cell" style="display: table-cell"> <div id="inner"/> </div> </div> The containing block of "inner" is the content edge of "cell", because "cell" is a block container. Another variation, very similar to the one above: <div id="outer"> <div id="table" style="display: table"> <div id="inner"/> </div> </div> The containing block of "inner" is the content edge of "table", because "table" is a block container. Boris's original example is different, because a row box is not a block container: <div id="outer" style="height: 20em"> <div id="row" style="display: table-row"> <div id="inner" style="height: 50%"/> </div> </div> The containing block of "inner" is now the content edge of "outer." If that is surprising, then maybe the issue is that the table row is not considered. I don't believe it is a problem that the anonymous cell is ignored. After all, you can't even see it. [1] http://wiki.csswg.org/spec/css2.1#issue-120 > > > - Replace the occurrence of "ancestor boxes" (in the example) by > > "ancestor elements". > > > > - Replace the phrase "the nearest positioned ancestor box" (at > > the end of the example) by "the padding edge of the nearest > > positioned ancestor". > > These changes look fine. > > -Boris -- Bert Bos ( W 3 C ) http://www.w3.org/ http://www.w3.org/people/bos W3C/ERCIM bert@w3.org 2004 Rt des Lucioles / BP 93 +33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Wednesday, 6 October 2010 16:29:09 UTC