|  | Posted by Ben C on 09/27/07 22:00 
On 2007-09-23, dorayme <doraymeRidThis@optusnet.com.au> wrote:> I notice that the normally well standarded www.htmldog.com does
 > not display well in Safari 2 on a Mac. E.g.
 >
 > http://www.htmldog.com/guides/htmlbeginner/lists/
 >
 > does not wrap properly (as in FF) and needs a fair bit of
 > horizontal scrolling.
 
 They're relying on some rather quirky behaviour of Firefox there. Opera
 does the same sort of thing as Konqueror on that page.
 
 The container (div#content) is position: absolute and auto (i.e.
 shrink-to-fit) width. The important question here is what is its minimum
 content width. In this case the widest unbreakable things in it are
 those <pre> elements containing code examples.
 
 Firefox decides that since they are themselves overflow:auto, it can
 take the liberty of making them narrower than the minimum widths of
 their contents and allow their contents to overflow. So you end up with
 horizontal scrollbars on the <pre> elements' boxes rather than on the
 whole page if you make the viewport narrow.
 
 The CSS spec says nothing about the value of the overflow property
 affecting the minimum content width of an element. MCW is supposed to be
 just width with all allowed linebreaks (which in the case of a <pre> is
 only explicit linebreaks), and the overflow property is only supposed to
 affect what happens when things do overflow, not whether they are
 allowed to overflow in the first place.
 
 As for htmldog there's a bit of a bogosity indicator in the selector for
 these <pre>s:
 
 pre {
 ...
 width: 50%;
 w\idth /**/:auto;
 }
 
 in a file called "fox.css". Don't know what they're up to but in FF
 2.0.0.7 width: auto is parsed and works. In some other version or
 browser it probably doesn't and you end up with width: 50%. But why is
 this stylesheet called "fox.css" if it isn't specific to Firefox
 anyway?
 
 Try this example in FF and Safari/Opera and you can see what's
 happening:
 
 #one
 {
 position: absolute;
 left: 16em;
 }
 #two
 {
 white-space: pre;
 overflow: auto;
 border: 2px solid blue;
 }
 
 ...
 
 <div id="one">
 <div id="two">
 lots of text here no breaks lots of text here no breaks lots of text here no breaks lots of text here no breaks
 </div>
 </div>
  Navigation: [Reply to this message] |