- From: Anton Prowse <prowse@moonhenge.net>
- Date: Fri, 08 Oct 2010 21:26:03 +0200
- To: www-style list <www-style@w3.org>
- CC: Bert Bos <bert@w3.org>, "Tab Atkins Jr." <jackalmage@gmail.com>
On 06/10/2010 21:36, Bert Bos wrote: > On Wednesday 06 October 2010 01:48:17 Tab Atkins Jr. wrote: >> This email is an attempt to resolve Issue 101 >> (http://wiki.csswg.org/spec/css2.1#issue-101) > >> Suggested Change >> ================ > > Why do you propose to change the spec? It's just an implementation bug, > isn't it? Well, the behaviour doesn't match the spec, sure. However, I remain unconvinced that browsers' current behaviour is undesirable. To me, it seems rather logical. As I've mentioned a couple of times already, the issue here is containing blocks and overflow: Firstly, browsers treat all floats as if their overflow from their containing block is clipped (ie ignored for layout purposes). This is enough to "explain" the test cases for Rule 3, and some of the test cases for Rule 7. This behaviour is reasonable because overflow is impotent in all other ways in CSS21, so it's anomalous that it isn't impotent for floats. Secondly, browsers think that Rule 7 only applies when the presence of a previous left float causes the current left float to overflow its containing block more that it would if the previous float did not exist. This behaviour is reasonable because Rule 7 only exists in the first place to make the new left float overflow as little as possible. If the previous left float isn't causing the new one to overflow more, then there's no reason at all to prevent the new left float from being on the same horizontal level as the old one, even though it's overflowing its containing block to the right. To me, moving the new left float down is just silly; it overflows its containing block by exactly the same amount anyway. > The bug is probably the result of an "optimization" that wasn't thought > through correctly. It's not intrinsic to the model Perhaps not. Still, I don't get the impression that the model gave much thought to floats in different containing blocks anyway, so I don't much buy that argument. > That is true even if the changed behavior would be better in some way. > But, in fact, it isn't better. It is much worse. It makes no sense that > the width of the parent influences whether the two floats overlap. > Floats shouldn't overlap in the first place. And if the parent has such > influence, why not the grandparent? It just makes no sense at all. It's containing block we're interested in, not parent per se. (Peter Moulder noted this too; the parent does not establish the containing block in some common cases, eg inline parent.) I think Tab needs to reword his new text in terms of containing block, and then the seeming arbitrariness of "parent" goes away. > Take this example. This is a little trick to center a green box, while > there is already an orange box on the right. If there is not enough > space for both, the green box is lowered. > > <!doctype html public '-//W3C//DTD HTML 4.01//EN'> > <title>Test</title> > <style type="text/css"> > .orange {width: 5em; height: 4em; background: orange; float: right} > .green {width: 5em; height: 3em; background: lime; float: left} > .centerwrapper {width: 5em; margin: auto} > </style> > > <div class=orange></div> > <div class=centerwrapper> > <div class=green></div> > </div> > > (Try increasing the font size or narrowing the window until there is no > room for green and orange side by side.) This works, both in the > current spec and in Tab's proposed change. But in Tab's proposal only > if the wrapper has the same width as the green box. In reality, it is > easier to make a generic wrapper of width zero, and then the green box > only needs to coordinate its own width and margins, as follows: > > .centerwrapper {width: 0; margin: auto} > .green {width: 5em; margin-left: -2.5em;...} > > Under Tab's proposal, however, this creates overlap. [Well, I'd hardly say that that was "easier" than your first example! From a layout perspective it's generally wiser to be explicit with these "grids" (and hence make the parent the same dimension as the float) even if it's not visually necessary.] Your second example results in overlap because the float entirely overflows its containing block. I have no problem with this; I do feel that overflow should be impotent. Cheers, Anton Prowse http://dev.moonhenge.net
Received on Friday, 8 October 2010 19:27:04 UTC