mirror of
https://github.com/fergalmoran/ladybird.git
synced 2025-12-22 09:19:03 +00:00
Sticky positioning is implemented by modifying the algorithm for assigning and refreshing scroll frames. Now, elements with "position: sticky" are assigned their own scroll frame, and their position is refreshed independently from regular scroll boxes. Refreshing the scroll offsets for sticky boxes does not require display list invalidation. A separate hash map is used for the scroll frames of sticky boxes. This is necessary because a single paintable box can have two scroll frames if it 1) has "position: sticky" and 2) contains scrollable overflow.
61 lines
1.6 KiB
HTML
61 lines
1.6 KiB
HTML
<!DOCTYPE html>
|
|
<link rel="match" href="reference/position-sticky-should-stay-within-containing-block-ref.html" />
|
|
<style>
|
|
.scrollable-container {
|
|
width: 300px;
|
|
height: 300px;
|
|
overflow-y: scroll;
|
|
border: 5px solid red;
|
|
}
|
|
|
|
.sticky-box {
|
|
position: sticky;
|
|
top: 0;
|
|
bottom: 0;
|
|
width: 240px;
|
|
height: 80px;
|
|
background: #3498db;
|
|
color: white;
|
|
}
|
|
|
|
.box {
|
|
height: 500px;
|
|
background-color: orange;
|
|
}
|
|
</style>
|
|
|
|
<div class="scrollable-container" id="sticky-is-below-scrollport">
|
|
<div class="box"></div>
|
|
<div>
|
|
<div class="sticky-box">I stick within this scrollable box!</div>
|
|
</div>
|
|
<div class="box"></div>
|
|
</div>
|
|
|
|
<div class="scrollable-container" id="sticky-is-inside-scrollport">
|
|
<div class="box"></div>
|
|
<div>
|
|
<div class="sticky-box">I stick within this scrollable box!</div>
|
|
</div>
|
|
<div class="box"></div>
|
|
</div>
|
|
|
|
<div class="scrollable-container" id="sticky-is-above-scrollport">
|
|
<div class="box"></div>
|
|
<div>
|
|
<div class="sticky-box">I stick within this scrollable box!</div>
|
|
</div>
|
|
<div class="box"></div>
|
|
</div>
|
|
|
|
<script>
|
|
const stickyIsBelowScrollport = document.getElementById("sticky-is-below-scrollport");
|
|
stickyIsBelowScrollport.scrollTop = 0;
|
|
|
|
const stickyIsInsideScrollport = document.getElementById("sticky-is-inside-scrollport");
|
|
stickyIsInsideScrollport.scrollTop = 390;
|
|
|
|
const stickyIsAboveScrollport = document.getElementById("sticky-is-above-scrollport");
|
|
stickyIsAboveScrollport.scrollTop = 780;
|
|
</script>
|