mirror of
https://github.com/RGBCube/serenity
synced 2025-05-15 11:24:58 +00:00

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.
46 lines
1 KiB
HTML
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>
|