- From: Bert Bos <bert@w3.org>
- Date: Wed, 4 Feb 2009 13:36:46 +0100
- To: www-style@w3.org
On Tuesday 03 February 2009 11:11, Anne van Kesteren wrote: > In http://www.w3.org/TR/CSS21/visuren.html#flow-control it states > "... then its clearance must be set to the greater of" and then "... > to make the sum of the following equal ..." and the one of the > following is "the clearance itself". This seems circular. What am I > missing? Assume (for the sake of simplicity), that we have just three boxes, in this order: block B1 with a bottom margin of M1 (B1 has no children and no padding or border), floating block F with a height H, and block B2 with a top margin of M2 (no padding or border, no children). We also assume B2 is not empty. Without considering the 'clear' property on B2, we have the situation in the diagram below. The margins of B1 and B2 collapse. Let's say the bottom border edge of B1 is at y = 0, then the top of F is at y = M1, the top border edge of B2 is at y = max(M1,M2), and the bottom of F is at y = M1 + H. | | | | | B1 | |_ 0 |_____________________| | |_ M1 _______ | | | |_ max(M1,M2) | F | ____________ | | | | |_ M1+H |_______| | | | | | B2 | | | | We also assume that B2 is not below F, i.e., we are in the situation described in the spec where we need to add clearance. That means: max(M1,M2) < M1 + H The spec says that we need to compute clearance C twice, C1 and C2, and keep the greater of the two: C = max(C1,C2). The first way is to put the top of B2 flush with the bottom of F, i.e., at y = M1 + H. That means, because the margins no longer collapse with a clearance between them: bottom of F = top border edge of B2 <=> M1 + H = M1 + C1 + M2 <=> C1 = M1 + H - M1 - M2 = H - M2 The second computation is to keep the top of B2 where it is, i.e., at y = max(M1,M2). That means: max(M1,M2) = M1 + C2 + M2 <=> C2 = max(M1,M2) - M1 - M2 We assumed that max(M1,M2) < M1 + H, which implies C2 = max(M1,M2) - M1 - M2 < M1 + H - M1 - M2 = H - M2 => C2 < H - M2 And, as C1 = H - M2, it follows that C2 < C1 and hence C = max(C1,C2) = C1 (With slightly different assumptions, notably when B2 is an empty block, C2 may be greater than C1... I think :-) ) Bert -- 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, 4 February 2009 12:37:23 UTC