- From: Mike Wilson <mikewse@hotmail.com>
- Date: Wed, 23 Apr 2008 13:37:43 +0200
- To: "'Anne van Kesteren'" <annevk@opera.com>, "'Www-style'" <www-style@w3.org>
- Cc: "'Daniel Glazman'" <daniel.glazman@disruptive-innovations.com>
[sorry, this was sent prematurely due to fat fingers]
Anne van Kesteren wrote:
> On Wed, 23 Apr 2008 12:28:30 +0200, Mike Wilson
> <mikewse@hotmail.com> wrote:
> > Though, the CSSOM scheme will break down if you want to know the
> > offset to the body element as there is no way to get at this
> > information.
> >
> > In particular, as Garrett pointed out, this offset is available
> > in all browsers except Opera (and CSSOM) when using
> > position:relative on the body element:
> > http://www.nabble.com/Re%3A--cssom-view--small-update-p16063070.html
>
> Following that (special casing position:relative on the HTML
> body element)
> would break finding the position of an element within the page, as I
> explained here:
>
> http://lists.w3.org/Archives/Public/www-style/2008Apr/0366.html
That's only the current behaviour of Firefox you're talking about, right?
The Firefox algorithm is admittedly broken
https://bugzilla.mozilla.org/show_bug.cgi?id=255754
and according to Boris Zbarsky they are waiting for your IE reverse-
engineering (done for this spec) before they do any changes or fix the
bugs.
The offset behaviour in (standards mode) IE, when you have
position:relative on the body element, will give you both offset between
body and viewport edge and between body and other elements:
offsetParent for/in: IE7 CSSOM
HTML null null
BODY null null
div1(pos=rel) BODY BODY
div2a div1 div1
div2b div1 div1
div3a(pos=abs) div1 div1
div3b div2b div1
offsetLeft for/in: IE7 CSSOM
HTML(4m,2b,1p) 0 0
BODY(32m,16b,8p) 39 0
div1(4m,2b,1p) 12 67
div2b(32m,16b,8p) 33 33
div3b(4m,2b,1p) 12/div2b 61/div1
Note 1: IE gives you both BODY's offset against viewport and div1's
offset against BODY while CSSOM skips over BODY.
Note 2: IE gives an ideal offset and offsetParent chain that will work
with any recursion wherever it stops.
(although ignoring most things on the root element)
Note 3: IE honors the Containing Block algorithm for div3b for its
offsetParent choice.
I think the above IE algorithm would be much preferred compared to the
broken FF algorithm that CSSOM partly derives from.
Best regards
Mike Wilson
The example used for the above test is:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<title></title>
<style type="text/css">
* {
border-color: gray;
border-style: solid;
}
html {
margin: 4px;
border-width: 2px;
padding: 1px;
}
body {
position: relative;
font-family: verdana, arial, helvetica,
sans-serif;
font-size: 77%;
margin: 32px;
border-width: 16px;
padding: 8px;
}
div {
height: 30px;
overflow: hidden;
text-align: right;
}
#div1 {
position: relative;
height: auto;
margin: 4px;
border-width: 2px;
padding: 1px;
}
#div2a {
margin: 32px;
border-width: 16px;
padding: 8px;
}
#div2b {
height: 60px;
margin: 32px;
border-width: 16px;
padding: 8px;
}
#div3a {
position: absolute;
left: 64px;
top: 64px;
margin: 4px;
border-width: 2px;
padding: 1px;
}
#div3b {
margin: 4px;
border-width: 2px;
padding: 1px;
}
</style>
<script type="text/javascript">
function printOffsetData( elem ) {
document.write( "Element: " + (elem.id ||
elem.tagName) + "<br>" );
document.write( "offsetLeft/Top: " +
elem.offsetLeft + "/" + elem.offsetTop + "<br>" );
document.write( "offsetParent: " +
(elem.offsetParent && (elem.offsetParent.id || elem.offsetParent.tagName)) +
"<br>" );
document.write( "<br>" );
}
</script>
</head>
<body>
<div id="div1">
<div id="div2a">div2a</div>
<div id="div2b">
<div id="div3a">div3a</div>
<div id="div3b">div3b</div>
div2b
</div>
div1
</div>
<script type="text/javascript">
printOffsetData( document.documentElement );
printOffsetData( document.body );
printOffsetData( document.getElementById("div1") );
printOffsetData( document.getElementById("div2a") );
printOffsetData( document.getElementById("div2b") );
printOffsetData( document.getElementById("div3a") );
printOffsetData( document.getElementById("div3b") );
</script>
</body>
</html>
Received on Wednesday, 23 April 2008 11:38:45 UTC