1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-15 11:24:58 +00:00
serenity/Tests/LibWeb/Ref/scrollable-box-with-nested-stacking-context.html
Aliaksandr Kalenik ac6b3c989d LibWeb: Apply scroll boxes offsets after painting commands recording
With this change, instead of applying scroll offsets during the
recording of the painting command list, we do the following:
1. Collect all boxes with scrollable overflow into a PaintContext,
   each with an id and the total amount of scrolling offset accumulated
   from ancestor scrollable boxes.
2. During the recording phase assign a corresponding scroll_frame_id to
   each command that paints content within a scrollable box.
3. Before executing the recorded commands, translate each command that
   has a scroll_frame_id by the accumulated scroll offset.

This approach has following advantages:
- Implementing nested scrollables becomes much simpler, as the
  recording phase only requires the correct assignment of the nearest
  scrollable's scroll_frame_id, while the accumulated offset from
  ancestors is applied subsequently.
- The recording of painting commands is not tied to a specific offset
  within scrollable boxes, which means in the future, it will be
  possible to update the scrolling offset and repaint without the need
  to re-record painting commands.
2023-12-30 11:10:24 +01:00

46 lines
1 KiB
HTML

<link rel="match" href="reference/scrollable-box-with-nested-stacking-context-ref.html" />
<style>
#scrollable-box {
width: 300px;
height: 500px;
overflow: auto;
position: relative;
border: 2px solid black;
}
.content {
height: 1000px;
background-color: lightblue;
}
.abspos {
position: absolute;
bottom: 0px;
right: 0px;
width: 150px;
height: 50px;
background-color: coral;
z-index: 1000;
display: flex;
}
.box {
background-color: magenta;
width: 100px;
height: 100px;
position: relative;
top: 0px;
left: 0px;
}
</style>
<div id="scrollable-box">
<div class="content">
Lots of scrollable content here!
<div class="box">box</div>
</div>
<div class="abspos"><div class="box">box</div></div>
</div>
<script>
const scrollContainer = document.getElementById("scrollable-box");
scrollContainer.scrollTop = 500;
</script>