On Mon, 16 Oct 2023 12:11:03 GMT, Hannes Wallnöfer <hann...@openjdk.org> wrote:
>> A few years ago we switched to [Flexbox >> Layout](https://developer.mozilla.org/en-US/docs/Glossary/Flexbox) to >> implement the sticky header in the API docs generated by `javadoc`. This >> solved the problem of anchor link targets [not being positioned >> correctly](https://bugs.openjdk.org/browse/JDK-8223378), but it also >> introduced a few new ones: >> >> - It required a workaround to get browser history to work (JDK-8249133, >> JDK-8250779, 8286832) >> - It changed certain aspects of scrolling behavior in the browser >> (JDK-8301080) >> - It changed the way some CSS properties are interpreted (JDK-8315800) >> >> The reason for most of these problems is that the layout paradigm used by >> Flexbox is very different from traditional layout of HTML pages. The >> `scroll-margin-*` CSS properties introduced by the [CSS Scroll Snap >> Module](https://www.w3.org/TR/css-scroll-snap-1/) provide a simpler and less >> intrusive way to implement link target offsets in combination with sticky >> elements implemented using [`position: >> sticky`](https://developer.mozilla.org/en-US/docs/Web/CSS/position). >> However, although it is implemented [in all supported >> browsers](https://caniuse.com/?search=scroll-margin), it comes with its own >> challanges and quirks, which are explained below. >> >> The first problem to overcome was that `position: sticky` is more fragile on >> mobile browsers than Flexbox. If some part of the page content overflows the >> allotted horizontal space, the whole page can be zoomed out to view the >> whole content. This causes the header to become unsticky and the link target >> offsets to become erroneous. It was therefore necessary to make sure page >> content never overflows its allotted horizontal space, either by adding line >> break opportunities, or by making all or part of the page horizontally >> scrollable when its content overflows. Line break opportunities are >> difficult to add especially in preformatted code, so I opted for making the >> parts of the page most likely containing long lines of code scrollable. >> >> The next problem was that enabling horizontal scrolling on an element or one >> of its containing elements breaks the `scroll-margin-top` property in Chrome >> due to a browser quirk (both desktop and mobile versions). This means that >> the scrolling must occur in a child element rather than the sections or >> other elements serving as link targets. >> >> When enabling horizontal scrolling on the contents of sections containing >> user-provided content, another problem is that it disables [Margin Co... > > Hannes Wallnöfer has updated the pull request incrementally with one > additional commit since the last revision: > > A few more tweaks > > - Move scroll-margin update from search.js to script.js > - Use DOMContentLoaded event to update scroll-margin > - Avoid use of :has() CSS pseudo-class which is unsupported on Firefox I have updated this PR with a [few additional fixes](https://github.com/openjdk/jdk/pull/15969/commits/aad899048bdc5cd70424ab73bdcb1c2efa0eda4f): - The callback to update the scroll-margin to accomodate for the draft header has moved from `search.js` to `script.js` which is always available (`search.js` is dependent on the index). - The callback is implemented in pure JavaScript instead of relying on jQuery, and uses the `DOMContentLoaded` event instead of the `window` `load` event, which avoids flickering on Chrome and Safari (still a little bit of flickering in Firefox under some conditions). - I removed the change to make tab buttons scrollable instead of adding line breaks as the `:has()` CSS pseudo-class is not supported on Firefox. This change was unrelated to the issue at hand. Generated documentation can be viewed here: https://cr.openjdk.org/~hannesw/8308659/api.03/ ------------- PR Comment: https://git.openjdk.org/jdk/pull/15969#issuecomment-1764351923