doctype of webpage.doc

download doctype of webpage.doc

of 19

Transcript of doctype of webpage.doc

  • 7/29/2019 doctype of webpage.doc

    1/19

    Adding a doctype to your webpage

    Doctype is a special declaration at the very top of your webpage source, right above the

    tag, that informsvalidators the rules in which to validate your page using, and

    for modern browsers (IE6+, Firefox, NS6+, Opera, IE5 Mac), whether to display your

    page in Quirks or Standards mode.

    Below lists the major doctypes you can deploy on your webpage. All of them enters

    modern browsers into "Standards" mode when used.

    HTML 4.01 Transitional, Strict, Frameset

    HTML 4.01 transitional doctype supports all attributes of HTML 4.01, presentationalattributes, deprecated elements, and link targets. It is meant to be used for webpages that

    are transitioning to HTML 4.01 strict:

    HTML 4.01 Strict is a trimmed down version of HTML 4.01 with emphasis on structure

    over presentation. Deprecated elements and attributes (including most presentational

    attributes), frames, and link targets are not allowed. CSS should be used to style all

    elements:

    HTML 4.01 frameset is identical to Transitional above, except for the use of

    over :

    XHTML 1.0 Transitional, Strict, Frameset

    Use XHTML 1.0 Transitional when your webpage conforms to basic XHTML rules,but still uses some HTML presentational tags for the sake of viewers that don't support

    CSS:

    Use XHTML 1.0 Strict when your webpage conforms to XHTML rules and uses CSSfor full separation between content and presentation:

    http://validator.w3.org/http://validator.w3.org/http://validator.w3.org/
  • 7/29/2019 doctype of webpage.doc

    2/19

    XHTML 1.0 frameset is identical to Transitional above, except in the use of the

    tag over :

    XHTML 1.1 DTD

    XHTML 1.1 declaration. Visit the WC3 site for an overview and what's changed from

    1.0:

    Six months ago a readerof my site alerted me to an important bit of data: when using adoctype that switches Explorer 6 to Compatibility Mode, several properties ofdocument.body are reassigned to document.documentElement. This information

    enabled me to get one of my scripts working in Explorer 6 with a doctype.

    At first I thought that allproperties ofdocument.body were reassigned to

    document.documentElement, but this turned out not to be the case. Because the data

    confused me and because I had other things to do, I only skimmed through the W3CRecommendations and Flanagan's "JavaScript, the Definitive Guide" to get a theoretical

    overview. I postponed the necessary browser tests, because they were likely to be

    complex and time-consuming.

    Theory

    The overall picture that emerged was as follows:

    document.documentElement has been standardizedby W3C as a kind of shortcut

    to the HTML element, the highest element in the DOM tree of any (X)HTML

    page. W3C has not defined any properties for this element. document.body has been added by Microsoft. Originally it was a convenience

    object that had several properties with information about the current state of the

    browser window and the document in it. Microsoft defined lots of properties, the

    most important of which are clientWidth and clientHeight which store the

    current size of the browser window. It also has properties like

    document.body.text, accessing the old TEXT attribute. It thus (also) refers to

    the BODY element.

    http://www.w3.org/TR/xhtml11/http://www.w3.org/TR/xhtml11/changes.html#a_changeshttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DUWindowsNS6.htmlhttp://www.xs4all.nl/~ppk/js/index.html?fixedmenu.htmlhttp://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#i-Documenthttp://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#i-Documenthttp://www.w3.org/TR/xhtml11/http://www.w3.org/TR/xhtml11/changes.html#a_changeshttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DUWindowsNS6.htmlhttp://www.xs4all.nl/~ppk/js/index.html?fixedmenu.htmlhttp://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html#i-Document
  • 7/29/2019 doctype of webpage.doc

    3/19

    Netscape 6, Explorer 5 and Konqueror have adopted documentElement as part of their

    W3C DOM support. body was originally Explorer-only, but more recently both Netscape

    6 and Opera 6 have started supporting it (Konqueror not tested).

    So documentElement refers to the outermost box in a document, the HTML element,

    while body refers to its only child box: the BODY element. Through their properties wecan read out information about the two most important elements.

    --------------

    | HTML |

    |------------|

    || BODY ||

    || ||

    || ||

    || ||

    || ||

    |------------|

    --------------

    Unfortunately my tests have proven this theoretical model to be unfounded when applied

    to properties like clientWidth and offsetHeight.

    Besides there is a third box that needs to be measured: the browser window itself. It isfrequently far smaller than the HTML document it contains. The theoretical model

    described above doesn't leave any room for the window dimensions; nonetheless they are

    present.

    No standards

    What we want is to read out interesting information about the entire HTML page and thebrowser window. One of the problems is that the properties that contain this information

    are not standardized. In the W3C DOM, to read out the total height of the HTML

    document you'd have to do

    document.defaultView.getComputedStyle(document.documentElement,null).ge

    tPropertyValue("height")

    Apart from the syntax being way too complicated, this only works in Mozilla. It's even

    worse if you want to know the window width and height or the scrolling offset: there isno official W3C way to read out this information. (Shouldthere be one? At the moment I

    don't think so. But feel free to disagree.)

    Fortunately the browser vendors have created their own properties: Netscape 4 and up

    supports window.innerWidth/Height and Explorer 4 and up supports

    document.body.clientWidth/Height . All this works fine, though without the

    blessing of W3C.

    Doctype switching

  • 7/29/2019 doctype of webpage.doc

    4/19

    When Explorer 6 added the possibility of entering strict standards compliance mode by

    using certain doctypes, it turned out that using these doctypes also influenced the value of

    some of these properties. As far as I know this happens only in Explorer 6 on Windows, Ihaven't yet found a trace of doctype-switching effects on JavaScript properties in Mozilla

    and Explorer on Mac. (But I stand ready to be corrected)

    So what exactly happens? I wondered for six months, then finally found the time to do

    some browser tests.

    The experiment

    So I set up an experiment. I researched four property pairs, all of which may be propertiesofdocument.body and document.documentElement. The pairs are:

    1. clientWidth, clientHeight

    2. offsetWidth, offsetHeight

    3. scrollWidth, scrollHeight4. scrollTop, scrollLeft

    I created two test pages which print out the values of these properties. They are exactly

    the same, except that I added the doctype

    to one of them. It causes Explorer 6 to enter compatibility mode. I chose this doctype

    more or less randomly. For the moment I assume that all doctypes in Microsoft's listcause the same compatibility mode. (Here, too, I stand ready to be corrected in case

    anyone has noticed a difference).

    View the test pages for yourself, if you like.

    Test page with doctype

    Test page without doctype

    I tested the various properties in several browsers: Explorer 5.0 and 6.0 on Windows,Explorer 5.0 on Mac OS 9 and 5.1 on OS X, and Mozilla 1.0 final. I also studied Opera 6,

    which doesn't support documentElement at all.

    There were no differences between both Mac Explorers, only very slight differences

    between the Windows Explorers on the no-doctype page.

    The actual testing consisted of carefully measuring the various widths and heights and

    finding out which properties contained these numbers.

    No general rules

    http://msdn.microsoft.com/library/en-us/dnie60/html/cssenhancements.asp?frame=true#cssenhancements_topic2http://msdn.microsoft.com/library/en-us/dnie60/html/cssenhancements.asp?frame=true#cssenhancements_topic2http://www.xs4all.nl/~ppk/js/doctype_on.htmlhttp://www.xs4all.nl/~ppk/js/doctype_off.htmlhttp://msdn.microsoft.com/library/en-us/dnie60/html/cssenhancements.asp?frame=true#cssenhancements_topic2http://www.xs4all.nl/~ppk/js/doctype_on.htmlhttp://www.xs4all.nl/~ppk/js/doctype_off.html
  • 7/29/2019 doctype of webpage.doc

    5/19

    I'd hoped to find some general rules for dealing with document.body,

    document.documentElement and doctype switching. Unfortunately the conclusion must

    be that there are considerable differences between body and documentElement and that a

    lot happens in Explorer 6 when switching between quirks and standards mode, but that it

    is impossible to formulate a general theory.

    See the table of research results and try to make sense of it. I can't. If you do find ageneral rule, please note it in a comment below.

    One rule concerning Explorer 6 in Strict mode has been made clear by Michael van

    Ouwekerk of13th Parallel. He wrote:

    From what I've gathered so far, IE6 in Strict mode always makes the html element as bigas the viewport. The styles given by currentStyle are width: auto, height: auto, overflow:

    scroll. The offsetWidth and offsetHeight are always equal to the viewport's width and

    height. When there is a lot of content, the overflow: scroll takes care of that.

    This seems to explain the values I found, so I think he's right.

    A few more interesting points:

    Above I said document.body is supposed to represent the BODY element, while

    document.documentElement should represent the HTML element. This turned

    out only to be the case with the offset properties in Mozilla and the

    scrollWidth/Height properties in Explorer 6 in standards compliance mode.

    Otherwise this theory has little to do with practice.

    Explorer 5 on Mac and Opera 6 are inconsistent in their use of the offset

    properties. While offsetHeight gives the height of the entire HTML document(as it does in most other browsers), offsetWidth gives the width of the window,

    not of the HTML document.

    The only reliable property pair is scrollTop/Left: it always gives the amount of

    pixels the page has scrolled. Unfortunately this information is highly doctype-

    sensitive: in standards compliance mode in Explorer 6 these properties belong todocumentElement, while in quirks mode they belong to body, just like in all other

    browsers. In Explorer 5.0 on Windows these properties were assigned to bothbody and documentElement. I wish Explorer 6 had done the same regardless of

    doctype, it would spare me the need to rewrite scripts.

    I have been unable to find out what function the scrollLeft/Top property pair

    has in Opera 6. The values simply don't make sense.

    Practice

    So how do you write cross-browser scripts that avoid all these complications? Here aresome examples that survive using a doctype that switches Explorer 6 to compatibility

    mode:

    http://www.xs4all.nl/~ppk/js/index.html?doctypes.htmlhttp://www.13thparallel.net/http://www.xs4all.nl/~ppk/js/index.html?doctypes.htmlhttp://www.13thparallel.net/
  • 7/29/2019 doctype of webpage.doc

    6/19

    Scrolling offset

    The scrolling offset of the page is reflected in document.body.scrollTop/Left, except

    when you use a doctype in Explorer 6, then it is reflected indocument.documentElement.scrollTop/Left . Opera is unreliable here. Fortunately

    the old Netscape properties window.readerXOffset/pageYOffsetstill work in allNetscapes and Opera. So the script would become:

    if (window.readerYOffset)

    {

    pos = window.readerYOffset

    }

    else if (document.documentElement && document.documentElement.scrollTop)

    {

    pos = document.documentElement.scrollTop

    }

    else if (document.body)

    {

    pos = document.body.scrollTop}

    and pos contains the vertical scrolling offset.

    Window dimensions

    The window dimensions are reflected in document.body.clientWidth/Height , except

    when you use a doctype in Explorer 6, then they are reflected indocument.documentElement.clientWidth/Height . Opera is unreliable here, the

    window height is never less than the height of the HTML document. Fortunately the old

    Netscape properties window.innerWidth/Height still work in all Netscapes and Opera.So the script would become:

    if (window.innerWidth)

    {

    theWidth = window.innerWidth

    }

    else if (document.documentElement &&

    document.documentElement.clientWidth)

    {

    theWidth = document.documentElement.clientWidth

    }

    else if (document.body)

    { theWidth = document.body.clientWidth

    }

    and theWidth contains the width of the window. Note that the clientWidth is always the

    width excluding the scrollbars. Generally (but not always), offsetWidth/Height gives

    access to the window width including the scrollbars.

  • 7/29/2019 doctype of webpage.doc

    7/19

    Conclusion

    The conclusion must be that the implementation of the body/documentElement

    properties in the various browsers, with and without doctypes, is very complicated. I can

    find no overall theoretical model that explains what the four property pairs are for and

    what the effect of a doctype switch is.

    I hope my table of research resultswill allow people to formulate theories. If you think

    you understand the behaviour of a certain browser (or, better yet, all browsers), please

    leave a comment below.

    Peter-Paul Koch is a freelance browser expert and JavaScript guru living in Amsterdam,

    the Netherlands. He has been an Internet professional only since 1998, so he's definitely

    second generation.

    His personal site is www.quirksmode.org. It includes the W3C DOM Compatibility

    Tables, currently the best resource on the Internet for this subject. Because of thisresearch, he has been asked to co-edited chapters 17 to 19 of Flanagan's "JavaScript, the

    Definitive Guide", O'Reilly, 4th edition.

    He is an administrator of the WDF-DOM mailing list, that counts most internationalJavaScript gurus among its members.

    He has written the "Keep it Simple" column on Digital Web Magazine, as well as articles

    on A List Apart, Apple Developer Connection, andO'Reilly's Web Dev Center, in

    addition to Evolt.

    13 comments on this article. Log into add your comment | Rate this article:

    not so bad...

    Submitted bybobince on June 23, 2002 - 12:46.

    This is less complicated than you think.

    Firstly, both document.documentElement and document.body are fully standardised in

    DOM Level 1. document.documentElement is DOM1-Core and refers to the root

    element, in this case html. It would return the same thing asdocument.getElementsByTagName('html')[0]. document.body is DOM1-HTML and

    refers to the body element. It would return the same as

    document.getElementsByTagName('body')[0]. document.body is supported by a few

    more browsers (IE4, Opera) than document.documentElement, but they are bothstandard.

    http://www.xs4all.nl/~ppk/js/index.html?doctypes.htmlhttp://www.xs4all.nl/~ppk/js/index.html?doctypes.htmlhttp://www.quirksmode.org/http://www.quirksmode.org/dom/list.htmlhttp://www.digital-web.com/columns/keepitsimplehttp://alistapart.com/authors/k/peterpaulkochhttp://developer.apple.com/internet/webcontent/bestwebdev.htmlhttp://developer.apple.com/internet/webcontent/bestwebdev.htmlhttp://www.oreillynet.com/pub/a/javascript/synd/2002/11/15/css_pitfalls.htmlhttp://www.oreillynet.com/pub/a/javascript/synd/2002/11/15/css_pitfalls.htmlhttp://www.oreillynet.com/pub/a/javascript/synd/2002/11/15/css_pitfalls.htmlhttp://evolt.org/userhttp://evolt.org/userhttp://evolt.org/node/30655#comment-31350http://evolt.org/user/14476http://evolt.org/propstar/rate/30655/5http://evolt.org/propstar/rate/30655/4http://evolt.org/propstar/rate/30655/3http://evolt.org/propstar/rate/30655/2http://evolt.org/propstar/rate/30655/1http://www.xs4all.nl/~ppk/js/index.html?doctypes.htmlhttp://www.quirksmode.org/http://www.quirksmode.org/dom/list.htmlhttp://www.digital-web.com/columns/keepitsimplehttp://alistapart.com/authors/k/peterpaulkochhttp://developer.apple.com/internet/webcontent/bestwebdev.htmlhttp://www.oreillynet.com/pub/a/javascript/synd/2002/11/15/css_pitfalls.htmlhttp://evolt.org/userhttp://evolt.org/node/30655#comment-31350http://evolt.org/user/14476
  • 7/29/2019 doctype of webpage.doc

    8/19

    Secondly, the CSS2 box model does not allow you to set something's height to be relative

    to the height of the viewport unless the element has 'position: fixed'. This may be

    remedied in CSS 2.1, but currently the spec does not define how high the InitialContaining Block is, or whether the root element is the ICB (it is self-contradictory on the

    matter, in fact), so you can't guarantee the html element will be any particular height at

    all. You also can't even read the height of an element in standard DOM - clientHeight etc.are IE extensions, albeit ones also supported by Moz, Konq and Op6.

    By far the best way of reading the size of the viewport is window.innerWidth/Height.

    Unfortunately, IE (and only IE of the JS browsers AFAIK) doesn't support it, so we have

    to come up with a backup plan for that browser. We can use the clientWidth/Height stuffthere only because we know IE does make the root element the Initial Containing Block

    and does make that the height of the viewport. It is best not to rely on this where we don't

    have to.

    The way to detect whether IE6 Standards Mode is in operation is to use the

    document.compatMode property. If it is "CSS1Compat" we have IE6 Standards and wemust read documentElement.clientHeight; if it is "BackCompat" we have IE6 Quirks; if it

    is undefined we have IE5.5 or earlier. In both the latter cases we must usebody.clientHeight.

    Finally, window.innerWidth may legitimately be zero, and hence generate a false

    negative with "if (window.innerWidth)". Pull it together and you get code like:

    if (window.innerWidth!=window.undefined) return window.innerWidth;if (document.compatMode=='CSS1Compat') return

    document.documentElement.clientWidth;

    if (document.body) return document.body.clientWidth;return window.undefined;

    (and similarly for height)

    BTW if you're interested in emulating 'position: fixed' in IE/Win for things like sticky

    menus, see http://and.doxdesk.com/software/js/fixed.html

    login orregisterto post comments

    Re: not so bad...

    Submitted byppkon June 24, 2002 - 03:00.

    This is less complicated than you think.

    I think you underestimate the problem .

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31393http://evolt.org/user/380http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31393http://evolt.org/user/380
  • 7/29/2019 doctype of webpage.doc

    9/19

    document.body is DOM1-HTML and refers to the body element. It would return the

    same as document.getElementsByTagName('body')[0]. document.body is supported by a

    few more browsers (IE4, Opera) than document.documentElement, but they are bothstandard.

    Yes, you're right. It's standardized in theDOM 1 HTML spec. I'd forgotten to lookoutside Core.

    Secondly, the CSS2 box model does not allow you to set something's height to be relativeto the height of the viewport unless the element has 'position: fixed'. You can't guarantee

    the html element will be any particular height at all. You also can't even read the height

    of an element in standard DOM - clientHeight etc. are IE extensions, albeit ones alsosupported by Moz, Konq and Op6.

    Which is exactly the problem I'm adressing. The HTML element is interpreted differently

    by different browsers. Fortunately you can read out the width and height of the HTML

    element in all browsers (though you must use eitherscrollHeight oroffsetHeight,depending on the browser). It's not standardized, but who cares? (Besides, I'm still

    wondering if thisshouldbe standardized. Any comments are welcome.)

    By far the best way of reading the size of the viewport is window.innerWidth/Height.

    Unfortunately, IE (and only IE of the JS browsers AFAIK) doesn't support it, so we haveto come up with a backup plan for that browser. We can use the clientWidth/Height stuff

    there only because we know IE does make the root element the Initial Containing Block

    and does make that the height of the viewport. It is best not to rely on this where we don'thave to.

    I don't get this. There are two possibilities for reading out window height:window.innerHeight and document.something.clientHeight. They may not be

    perfect, but what is? Something may theoretically be better than something else, but it'sbrowser behaviour that counts.

    The way to detect whether IE6 Standards Mode is in operation is to use the

    document.compatMode property. If it is "CSS1Compat" we have IE6 Standards.

    This is one way, certainly. The advantage of my way is that it's not specifically writtenfor IE6. What if another browser, that doesn't support document.compatMode, also stores

    clientWidth in document.documentElement? With your method we wouldn't catch it. I

    never use any browser-specific coding if I can help it. (Of course, it's necessarynonetheless in the majority of cases).

    Finally, window.innerWidth may legitimately be zero, and hence generate a false

    negative with "if (window.innerWidth)". Pull it together and you get code like:

    That's true, a simple else return 0 at the end of the code would solve this.

    http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-html.html#ID-1006298752http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-html.html#ID-1006298752http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-html.html#ID-1006298752
  • 7/29/2019 doctype of webpage.doc

    10/19

    if (document.compatMode=='CSS1Compat') return

    document.documentElement.clientWidth;

    As I said before, I will not use this way of compatibility detecting. Otherwise your scriptseems sound.

    ppk

    login orregisterto post comments

    related article / extra comments

    Submitted by Michael on June 24, 2002 - 14:02.

    Hey, you quoted me :) Then I might as well pimp the article I wrote about this a littlemore: The Viewport. This offers some scripts and a lot of examples and testcases for

    some of the problems described here.

    The only reason why some browsers support unexpected features appears to be "let's

    support this property because Internet Explorer has it". This seems certainly true withMozilla and Opera, since they have (partially) implemented the offset and client

    properties. The problem with such implementations is that they copy the property names

    but they do not behave the same way because the rendering engine is different in

    undocumented ways.

    Perhaps it's true that the W3C specs are not precise enough about the root element - I

    would very much like to see some clarifications in a CSS 2.1 recommendation.

    login orregisterto post comments

    viewport vs. document elements

    Submitted bybobince on June 24, 2002 - 15:23.

    Besides, I'm still wondering if this should be standardized. Any comments are welcome.

    The problem with the IE way of doing it (clientHeight, scrollTop etc.) is that it mixes up

    document-specific DOM elements and view-specific properties. DOM Views had a better

    seperation but remains unstandardised, the current DOM 2 Views document being onlyan empty shell.

    In any case, relying on a document element to read the size of the viewport is a doubtful

    proposition when CSS says they're essentially unrelated (unless you go to the lengths of

    making body fixed-positioned with 100% height, in which case you can be sure it's thesame height as the viewport).

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31437http://evolt.org/user/24720http://13thparallel.com/?issue=2002.06&title=viewporthttp://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31452http://evolt.org/user/14476http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31437http://evolt.org/user/24720http://13thparallel.com/?issue=2002.06&title=viewporthttp://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31452http://evolt.org/user/14476
  • 7/29/2019 doctype of webpage.doc

    11/19

    Some other browser that supports the clientFoo extensions but takes CSS literally on the

    height of the root element might return the height of the entire document for

    document.documentElement.clientHeight instead of the height of the viewport. Thiscould even happen in IE7 if they make an Even More Standards Compliant Mode! :-)

    That's why I prefer the window.innerHeight method and consider the clientHeight stuff aworkaround to that. It has been documented for ages and is widely supported by everyone

    except MS.

    As for the compatMode switch, you'll notice if it fails it tries document.body.clientHeight

    anyway. The thinking is that a theoretical browser trying to emulate IE but not knowing

    about compatMode is most likely to be putting the height in document.body.clientHeightas IE5 did. I admit it's a guess, but it's probably a good guess. And a good guess is the

    best you can do with object sniffing.

    Roll on CSS 2.1...

    login orregisterto post comments

    html element size

    Submitted by Michael on June 24, 2002 - 16:03.

    "Some other browser that supports the clientFoo extensions but takes CSS literally on theheight of the root element might return the height of the entire document for

    document.documentElement.clientHeight instead of the height of the viewport."

    This is something I've been wondering about. What should be the height of the rootelement, with no content and with a lot of content? Should it always be as high as the

    viewport?

    login orregisterto post comments

    document.compatMode also in Mozilla

    Submitted by www_richardinfo_com on June 25, 2002 - 04:23.

    Hi,

    Last year I spent some time trying to detect which mode the browser was running in:http://richardinfo.com/case_studies/doctypes.html

    It's not all that correct, and pretty messy.

    I was however contacted by a mozilla developer, who said that document.compatMode

    had been added to Mozilla, to make it easier to determine the mode Mozilla was runningin. (I think from v0.9 upwards).

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31454http://evolt.org/user/24720http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31512http://evolt.org/user/16518http://richardinfo.com/case_studies/doctypes.htmlhttp://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31454http://evolt.org/user/24720http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31512http://evolt.org/user/16518http://richardinfo.com/case_studies/doctypes.html
  • 7/29/2019 doctype of webpage.doc

    12/19

    This actually complicates things though, as you now cannot rely on

    if(document.compatMode) being IE6 in strict mode.

    Finally I gave up on this stuff, and designed pages a little more loosely.

    It's a bit like font-sizes, if we don't set a fixed font-size, the user can view it like they

    want. If we try to set the fontsize the same cross-browser/platform, we fail.

    login orregisterto post comments

    Specific implementations of DHTML model

    Submitted by Doctor_Unclearon June 26, 2002 - 21:49.

    Hello Mr. Koch,

    First let me congratulate you for the research you did. I myself researched this issue quite

    a lot as well.

    There is an important question that your article (and 13th parallel's article) still have notanswered yet. And it has decisive consequences for a lot of other questions and answers.

    Scrollbars are part of what, of which object? Once browser makers, sites developpers all

    agree on the answer to that question, only then we will all see things differently. Ifscrollbars are part of the elements which generate them, then it is absolutely illogical to

    speak in terms of "window height/width with/without scrollbars" if the html element is

    the element responsible for the appearance of scrollbars. Would you say: "What's the

    width of this building when there is an elevator? when there is no elevator? What's thewidth of this house when the garage door is opened? when the garage door is closed?"

    Such questions would all be irrelevant. When a document width or height exceeds thebrowser's viewport (the window height and width as given by the browser or the user'sresizing actions) then an overflow on the document happens. That's why CSS allow us to

    set the overflow property on the html element, or the body element. If the window object

    was the object responsible for scrollbars, then there would be a property for that:something like window.scrollbars = true or window.scrollbars = none window.scrollbars

    = auto or window.overflow = scrollbars, etc...would be possible, doable, implementable.

    It's not the case. So, speaking of "window height/width excluding/including scroll bars" isconfusing matters, is misleading. And when 13thparallel is saying

    "window.innerWidth/Height does not exactly get the viewport size the way we want it,

    because these properties add the space for the scrollbar if it is visible" this also confuses

    matters, misleads. Window.innerWidth/Height never adds nor substracts the space for thescrollbar because scrollbars are not part of the browser's viewport. Chrome elements adds

    or substracts available space for window.innerWidth/Height.

    Open up Opera 6.x without any loaded document: you could then measure the

    window.inner* properties while there would not be any document at all. This is where I

    do make the distinctions.

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31617http://evolt.org/user/31232http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-31617http://evolt.org/user/31232
  • 7/29/2019 doctype of webpage.doc

    13/19

    One thing that your article failed to say is that in standards compliant rendering mode,

    MSIE 6 treats scrollbars as part of the html element when MSIE 6 in compatible mode

    and MSIE 5.5 treat scrollbars as part of the body element. That is what these browserswill "tell" you: I've tested this in several ways and always got the same answers.

    The browser's viewport size/dimensions should be, always should be properties of thewindow object.

    You said: "Microsoft defined lots of properties, the most important of which areclientWidth and clientHeight which store the current size of the browser window." Hold it

    right there! clientWidth and clientHeight do not represent the size of the browser window

    since scrollbars, borders and margins are not stored in there. Scrollbars are part of the

    elements which support them, which use them. Therefore, scrollbars are part of adocument; a document's width and height should compute the width and height of these

    scrollbars if present. Scrollbars must be considered as part of the elements which generate

    them, which display them, otherwise you would have to say that scrollbars are part of the

    window chrome just like toolbars, statusbar, etc. and that cannot be the case. Borders arealso part of an element's display as well ... otherwise, you would have to say that borders

    on a div are part of the window chrome.

    When one tries to figure out the current size of a browser window, he has only 2 choices:

    either access a property which gets this value (Netscape window.innerWidth andwindow.innerHeight do exactly that) or calculate the whole height or width a document

    takes within the browser's rendering area, content area while being displayed and here

    you have to include margins, scrollbars, borders as well as these are display properties of

    the element.

    You can measure the hole or you can measure the substance, the matter filling, covering

    perfectly the hole: either way, you should end up measuring the same distance. You canmeasure inner size of a window or you can measure the document's view (its content,

    margins, borders, padding, scrollbars) which fills the viewable area of the window which

    you are actually viewing.

    Later you repeat: "The window dimensions are reflected in

    document.body.clientWidth/Height, except when you use a doctype in Explorer 6, then

    they are reflected in document.documentElement.clientWidth/Height." Again, I disagree.If you want the strict width/height of the document (content + padding), then

    clientWidth/Height is good enough: if you want to measure the window width and height,

    then you have to measure these from the "document" perspective in MSIE and use thedocument.documentElement.offsetWidth/Height. Even the event.clientX/Y and

    evt.clientX/Y property support my reasoning here for both MSIE 5+ and NS6+. Even the

    event.offsetX/Y property MSIE 6 support my reasoning as well.

    You mentioned that 1) document.documentElement is the current W3C standard through

    which we can now access the root element of a document 2) properties like clientWidth,

    offsetHeight, scrollHeight, etc... are not properly supported by Mozilla, Netscape, MSIE

  • 7/29/2019 doctype of webpage.doc

    14/19

    6 in standard compliant mode... and others on the documentElement element.

    Well, these 12 properties (offset*, scroll* and client*) are not W3C standards to beginwith. They are all part of MSIE's DHTML object model and even that DHTML object

    model (as explained by MSDN) is not without any contradiction or bugs you know. So, it

    may take some time to Mozilla to implement thesehttp://bugzilla.mozilla.org/show_bug.cgi?id=62536

    where it is clearly indicated that these scrollHeight, scrollWidth, clientHeight,

    clientWidth properties are only for divs.

    "One of the problems is that the properties that contain this information are not

    standardized. " In my opinion, the properties that contain this information are not

    standardized and that's the only problem. Once an informal or official standard is agreedupon some kind of rules (like DHTML object property specs), all of these problems will

    disappear. Without standards, only confusion, workarounds headaches, etc. will prevail.

    I'm convinced we're moving toward more smooth and hassle-free interoperability. The

    fact that MS corrected a lot of its faulty CSS implementation with the release of MSIE 6is a sign that we're slowly moving toward such direction. MSIE 6 just looks like an

    incomplete work but nevertheless one cannot claim that others (like Opera) are better inthe field of DHTML and DOM support.

    You are right: there are no standards, no general rules. It's confusing, chaotic, anarchy inthere simply because there are no known official standards covering these properties.

    IMO W3C should have standardized the DHTML object model as well. IMO, W3C is

    bound to standardize these properties. IMO, this is exactly what Mozilla tries to do

    anyway, with or without W3C getting involved, soon or later. Mozilla.org implements theMSIE properties which are useful, relevant to web page designers.

    "It's even worse if you want to know the window width and height or the scrolling offset"Exactly. Absolutely true. "there is no official W3C way to read out this information.

    (Should there be one?" Yes, there should be one, absolutely. The need for reliable bug-

    free hassle-free 100% interoperable cross-browser code is there and will be furthermorestronger as time passes.

    Let me give you 2 examples here. On february 18th 2002, I posted in

    comp.lang.javascript (subject line: offsetLeft bug in IE5.5) the full code of an html pagewhich would generate (via an alert) 4 different offsetLeft values in 3 distinct browsers: 2

    totally different values for MSIE 6 (1 with a full doctype and the other without any

    doctype decl.), a 3rd different value for Opera 6.01 and a 4th different value for Mozilla0.9.7. Just incredible! 1 single page, 1 single DHTML property question and 4 different

    answers coming from 3 distinct browsers.

    MSIE 5+ uses screenTop, Gecko-based browsers uses screenY and Opera 6.x uses

    screenY as one of the window properties...but when you examined carefully each of their

    implementation, you end up with 3 different - totally different and totally incompatible -

    implementations. And I'm not talking about bugs here or absence of support, you know...

    http://bugzilla.mozilla.org/show_bug.cgi?id=62536http://bugzilla.mozilla.org/show_bug.cgi?id=62536
  • 7/29/2019 doctype of webpage.doc

    15/19

    "From what I've gathered so far, IE6 in Strict mode always makes the html element as

    big as the viewport."

    And that is a W3C standard spec violation! The root element should not be stretching to

    fit the viewport if its contents are smaller than the height of the viewport.According to CSS2, section 9.1.2:

    http://www.w3.org/TR/REC-CSS2/visuren.html#containing-block

    says:"The height of the initial containing block may be specified with the 'height' property for

    the root element. If this property has the value 'auto', the containing block height will

    grow to accommodate the document's content."

    http://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DEOWWithOUTV

    ScollBar.html

    and you'll see that only Opera 6 respects the standard. MSIE 6 doesn't.

    "The styles given by currentStyle are width: auto, height: auto, overflow: scroll. The

    offsetWidth and offsetHeight are always equal to the viewport's width and height. Whenthere is a lot of content, the overflow: scroll takes care of that."

    Just open a blank page with MSIE 6 and it will have a dimmed vertical scroll bar at theright side. This is the effect of the stated styles up there. If you declare

    html { overflow:auto; }

    in the style sheet of a blank page with a full doctype in MSIE 6, there won't be any scroll

    bar.

    Say you have a document and an absolutely positioned div in that document. But you

    position this div at, say, top:800px. Now, I tested this with Mozilla 0.9.8, MSIE 6 in

    compliant mode and Opera 6, and... surprise!.. Opera is the only browser that will removethis div from the body and then remove it from the html element and place it outside the

    visual display of the html element.

    http://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/HtmlBodyBugsMoz

    098.html

    W3C CSS2

    10.1 Definition of "containing block"http://www.w3.org/TR/REC-CSS2/visudet.html#containing-block-details says:

    "If the element has 'position: absolute', the containing block is established by the nearest

    ancestor with a 'position' other than 'static' (...) If there is no such ancestor, the contentedge of the root element's box establishes the containing block"

    So, we know that Opera 6 violates a web standard spec here; MSIE 6 and NS 6+ comply

    with the standard.

    http://www.w3.org/TR/REC-CSS2/visuren.html#containing-blockhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DEOWWithOUTVScollBar.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DEOWWithOUTVScollBar.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/HtmlBodyBugsMoz098.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/HtmlBodyBugsMoz098.htmlhttp://www.w3.org/TR/REC-CSS2/visudet.html#containing-block-detailshttp://www.w3.org/TR/REC-CSS2/visuren.html#containing-blockhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DEOWWithOUTVScollBar.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/DEOWWithOUTVScollBar.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/HtmlBodyBugsMoz098.htmlhttp://www.geocities.com/Area51/Realm/8655/HTMLJavascriptCSS/HtmlBodyBugsMoz098.htmlhttp://www.w3.org/TR/REC-CSS2/visudet.html#containing-block-details
  • 7/29/2019 doctype of webpage.doc

    16/19

    There is one thing you never said in your article which is quite important: absolutely

    positioned elements are removed from the normal flow (and the body element as a matterof fact) and put into the html element outside the body element: that's exactly what W3C

    says and that's what NS6+ and MSIE 6 in standards compliant rendering mode do. So

    your html vs body model works regarding absolutely positioned elements.

    "I wish Explorer 6 had done the same regardless of doctype, it would spare me the need

    to rewrite scripts." I share your feeling but maybe you need to better understand whydoctypes were made in the first place. Doctypes are there so that browsers, user agents,

    validators get to know which version of HTML is being used, how to parse or check or

    render the document's syntax, how strictly it should be parsed, checked, rendered, etc. If

    we were all complying to the same type of strict compliant adherence to standards, therewould be no need at all for doctypes. And why should browsers support different modes

    of rendering? There would be no need for different modes of web page rendering if we

    were all willing to learn, apply, comply with standards. It is known that Opera only

    knows of 1 rendering mode and Opera does not bother at all whether a document has orhas not a doctype declaration. Opera always try to render the page in strict compliant

    mode. And this is what all browsers should aim at achieving.

    In your table of measurements, for Mozilla 1.0 browser, you give this:

    Height of the HTML element : dE.offsetHeight b.scrollHeight dE.scrollHeight

    Width of the HTML element : dE.offsetWidth b.scrollWidth dE.scrollWidth

    In my opinion, the height/width of the html element should be dE.scrollHeight/Width andnothing else.

    The height/width of the html element within the viewing area, within the browserviewport, client area should be dE.offsetHeight/Width and nothing else.

    Same thing in your compatibility table, for Mozilla 1.0 browser:

    document.documentElement.offsetHeight: Height of the HTML element. That shouldn't

    be the case.

    document.documentElement.offsetWidth: Width of the HTML element

    Everytime a browser uses the propertynames of a model which comes from another

    browser maker, then such browser must implement the functionality of suchpropertynames as they are in the other browser, otherwise this deliberately creates chaos,

    confusion, cross-browser headaches.

    Best regards,

    DU

  • 7/29/2019 doctype of webpage.doc

    17/19

    login orregisterto post comments

    compatMode unreliable

    Submitted by tarquinwj on July 2, 2002 - 03:19.

    if (document.compatMode=='CSS1Compat') returndocument.documentElement.clientWidth;

    Gecko browsers also give this property as 'CSS1Compat' if using a strict doctype.

    However, they still give properties of body, not documentElement.

    login orregisterto post comments

    Re: compatMode unreliable

    Submitted bybobince on July 3, 2002 - 06:11.

    Gecko browsers also give this property as 'CSS1Compat' if using a strict doctype.

    However, they still give properties of body, not documentElement.

    Yes. Again, it's better to use window.innerFoo: where available, it's reliable. the

    document.fooEl.clientBar properties aren't and shuold be used only as a last resort.

    login orregisterto post comments

    Demo case

    Submitted by Doctor_Unclearon July 9, 2002 - 00:31.

    Go to this precise url while using MSIE 6 for windows (MSIE 5.x for Mac might work...I

    don't know). Using any other browser should not work, will not work.

    http://bugzilla.mozilla.org/attachment.cgi?id=90581&action=view

    In there, you'll see a demo case exemplifying what is the client area dimensions in MSIE 6 in standards compliant mode, how to

    measure them (width, height)

    what is the browser's viewport dimensions, how to measure them

    what is the difference between these 2.

    Simply put, client area dimensions are given by

    document.documentElement.clientWidth/Height . Simply put, client area is given by htmlpadding-left + html content + html padding-right. Client area does not include scrollbars

    nor html borders nor html margins.

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32272http://evolt.org/user/27934http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32476http://evolt.org/user/14476http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32930http://evolt.org/user/31232http://bugzilla.mozilla.org/attachment.cgi?id=90581&action=viewhttp://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32272http://evolt.org/user/27934http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32476http://evolt.org/user/14476http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-32930http://evolt.org/user/31232http://bugzilla.mozilla.org/attachment.cgi?id=90581&action=view
  • 7/29/2019 doctype of webpage.doc

    18/19

    The browser's viewport dimensions in MSIE 6 in standard compliant mode are given by

    document.documentElement.offsetWidth/Height . The browser's viewport dimensions

    include html content + html paddings + html borders + scrollbars.

    These d.dE.offsetWidth/Height properties are the equivalent of Netscape 6+'s

    window.innerWidth/Height values. They are the browser's viewport dimensions from the"document" perspective while Netscape 6+'s window.innerHeight/Width are the

    browser's viewport dimensions from the "window" perspective.

    As long as the user does not resize the browser window, the d.dE.offsetHeight/Width will

    not change. The user can add/remove html borders, generate/ "remove" scrollbars, etc.. .:

    the d.dE.offsetWidth/Height values will not change in MSIE 6 in standards compliant

    mode.The moving lines (red, blue, purple) are there to see how dynamically generated

    scrollbars (without any window resizing) affect the client and offset values. Just move the

    mouse toward the right, beyong the right window border of the browser to generate an

    horizontal scrollbar and observe the changes in the form fields. Move the mouse towardthe bottom, beyond the statusbar to generate a vertical scrollbar and then observe how it

    impacts values in the form.

    Using a high video screen resolution for this demo is preferable.

    DU

    login orregisterto post comments

    about html { overflow:auto; } and mozilla.

    Submitted by fished on July 11, 2002 - 16:41.

    Must be only me but Mozilla doesnt like that in your CSS: html { overflow:auto; } Nice

    for IE though. Ah, interesting topic. Later

    login orregisterto post comments

    THANKS!

    Submitted byjellybellyjo on April 14, 2003 - 17:44.

    Just wanted to say a huge THANK YOU for your tips about scrollTop and scrollLeft and

    how to use them properly depending on your browser. I was getting extremely frustrated

    because no matter what i did, they were always 0, and my values were inaccurate. This isthe only place i found any mention of the documentElement object, which fixed my

    problem.

    so once again, thanks heaps!! :)

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-33353http://evolt.org/user/33352http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-60203http://evolt.org/user/60465http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-33353http://evolt.org/user/33352http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-60203http://evolt.org/user/60465
  • 7/29/2019 doctype of webpage.doc

    19/19

    login orregisterto post comments

    your coments on:document.myBodyId vs document.body

    Submitted by rgfon July 26, 2003 - 16:20.

    Upto now I've used an id for the body element with Explorer to access properties of thebody.

    (eg the actual document height/width and not the browser window.)

    I can't see anything against this, but am very interested in your comments/experience.

    Give the body tag an id

    address this id with:document.myBodyId.clientWidth or document.myBodyId.scrollTop etc.

    This reduces code in ppk's examples to :if (window.readerYOffset)

    {

    pos = window.readerYOffset

    }

    else if (document.myBodyId.scrollTop)

    {

    pos = document.myBodyId.scrollTop

    }

    http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-60707http://evolt.org/user/61533http://evolt.org/user/loginhttp://evolt.org/user/registerhttp://evolt.org/node/30655#comment-60707http://evolt.org/user/61533