- From: Nico Burns via GitHub <sysbot+gh@w3.org>
- Date: Wed, 10 Jul 2024 00:03:31 +0000
- To: public-css-archive@w3.org
nicoburns has just created a new issue for https://github.com/w3c/csswg-drafts: == [cssom-view] Spec for offsetTop/Left does not match implementations for `position:static` `<body>` element == ## Context This issue was discovered when trying to run unrelated WPT tests (css-flexbox tests) in Servo. It turns out that many of them depend on this non-standard behaviour. For example https://wpt.live/css/css-flexbox/align-content-horiz-001b.html ## Specification The [spec](https://www.w3.org/TR/cssom-view-1/#extensions-to-the-htmlelement-interface) says: ### offsetParent > The offsetParent attribute must return the result of running these steps: > > ... > > Return the nearest ancestor element of the element for which at least one of the following is true and terminate this algorithm if such an ancestor is found: > > The computed value of the [position](https://www.w3.org/TR/css3-positioning/#propdef-position) property is not [static](https://www.w3.org/TR/css3-positioning/#valdef-position-positionfake-maybe-placeholderstatic-fake-maybe-placeholder). > > It is [the HTML body element](https://www.w3.org/TR/cssom-view-1/#the-html-body-element). > > ... ### offsetTop/offsetLeft > The offsetTop attribute must return the result of running these steps: > > If the element is [the HTML body element](https://www.w3.org/TR/cssom-view-1/#the-html-body-element) or does not have any associated [CSS layout box](https://www.w3.org/TR/cssom-view-1/#css-layout-box) return zero and terminate this algorithm. > > If the [offsetParent](https://www.w3.org/TR/cssom-view-1/#dom-htmlelement-offsetparent) of the element is null return the y-coordinate of the top [border edge](https://www.w3.org/TR/cssom-view-1/#border-edge) of the first [CSS layout box](https://www.w3.org/TR/cssom-view-1/#css-layout-box) associated with the element, relative to the [initial containing block](https://www.w3.org/TR/css-display-3/#initial-containing-block) origin, ignoring any [transforms](https://www.w3.org/TR/cssom-view-1/#transforms) that apply to the element and its ancestors, and terminate this algorithm. > > Return the result of subtracting the y-coordinate of the top [padding edge](https://www.w3.org/TR/cssom-view-1/#padding-edge) of the first [CSS layout box](https://www.w3.org/TR/cssom-view-1/#css-layout-box) associated with the [offsetParent](https://www.w3.org/TR/cssom-view-1/#dom-htmlelement-offsetparent) of the element from the y-coordinate of the top [border edge](https://www.w3.org/TR/cssom-view-1/#border-edge) of the first [CSS layout box](https://www.w3.org/TR/cssom-view-1/#css-layout-box) associated with the element, relative to the [initial containing block](https://www.w3.org/TR/css-display-3/#initial-containing-block) origin, ignoring any [transforms](https://www.w3.org/TR/cssom-view-1/#transforms) that apply to the element and its ancestors. ## Test Case ```html <!doctype html> <html> <body id="body" onload="recompute()"> <div id="target" style="height: 40px; width: 40px; background: red;"></div> <div id="output" style="text-wrap: nowrap"></div> <button onclick="recompute()">recompute</button> <script type="text/javascript"> function recompute() { let targetNode = document.getElementById("target"); let outputNode = document.getElementById("output"); outputNode.innerHTML = ` offsetParent: ${targetNode.offsetParent.id}<br /> offsetTop: ${targetNode.offsetTop}<br /> offsetLeft: ${targetNode.offsetLeft}<br /> `; } </script> </body> </html> ``` Per the spec, the `offsetParent` for `#target` ought to be the `<body>` element. And therefore the `offsetTop` and `offsetLeft` both ought to be 0. However, actual browsers (tested Chrome 126.0.6478.127, Firefox 127.0.2, Safari 17.5) return 8 for both properties. The actual observed behaviour seems to be that browsers are returning the offset relative to the **border-edge of the `<html>` element** rather than the **padding-edge of the `<body>` element** in this case (note that this is only the case if the `<body>` is `position: static`. If the `<body>` is `position: relative` then all browsers return 0 as per the spec). ## Implications This issue affects a number of of WPT tests and means that browsers that conform to both the [offsetTop/offsetLeft spec](https://www.w3.org/TR/cssom-view-1/#extensions-to-the-htmlelement-interface) and the [css-flexbox spec](https://www.w3.org/TR/css-flexbox-1/) cannot pass those tests. Either the spec or browser behaviour ought to be updated. ## Questions - Would PRs to update affected WPT tests to not depend on this behaviour (by adding `position:relative` to the `<body>` and updating the expected offset values to match) be likely to be accepted? Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/10549 using your GitHub account -- Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Wednesday, 10 July 2024 00:03:32 UTC