Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /scroll-animations/view-timelines/range-boundary.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<html class="reftest-wait">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="match" href="range-boundary-ref.html">
<title></title>
</head>
<style type="text/css">
@keyframes transform {
0% { transform: translateX(25px); }
100% { transform: translateX(50px); }
}
@keyframes background {
0% { background-color: #99f; }
100% { background-color: #9f9; }
}
.scroller {
display: inline-block;
border: 2px solid black;
height: 100px;
width: 100px;
overflow: hidden;
}
.spacer {
height: 300px;
margin: 0;
}
.box {
background: gray;
height: 50px;
width: 50px;
margin: 0;
animation: transform auto, background auto;
animation-timeline: view(), view();
animation-range: entry 0% entry 100%, contain 0% contain 100%;
}
</style>
<body>
<!-- scroll to bottom
top-box:
transform: none (after phase)
bg-color: #9f9 (at active-after boundary with inclusive endpoint)
bottom-box:
transform: 100px (at active-after boundary with inclusive endpoint)
bg-color: #99f (at active-before boundary with inclusive endpoint)
-->
<div id="scroller-1" class="scroller">
<div class="spacer"></div>
<div class="box"></div>
<div class="box"></div>
</div>
<!-- scroll to top
top-box:
transform: none (after phase)
bg-color: gray (at active-after boundary with exclusive endpoint)
bottom-box:
transform: none (at active-after boundary with exclusive endpoint)
bg-color: #99f (at active-before boundary with inclusive endpoint)
-->
<div id="scroller-2" class="scroller">
<div class="box"></div>
<div class="box"></div>
<div class="spacer"></div>
</div>
<br>
<!-- scroll to midpoint
top-box:
transform: none (after phase)
bg-color: gray (at active-after boundary with exclusive endpoint)
bottom-box:
transform: none (at active-after boundary with exclusive endpoint)
bg-color: #99f (at active-before boundary with inclusive endpoint)
-->
<div id="scroller-3" class="scroller">
<div class="spacer"></div>
<div class="box"></div>
<div class="box"></div>
<div class="spacer"></div>
</div>
<!-- scroll to bottom + reverse
top-box:
transform: none (before phase)
bg-color: gray (at active-before boundary with exclusive endpoint)
bottom-box:
transform: none (at active-before boundary with exclusive endpoint)
bg-color: #9f9 (at active-after boundary with inclusive endpoint)
-->
<div id="scroller-4" class="scroller">
<div class="spacer"></div>
<div class="box reverse"></div>
<div class="box reverse"></div>
</div>
<br>
<!-- scroll to top + reverse
top-box:
transform: none (before phase)
bg-color: #99f (at active-before boundary with inclusive endpoint)
bottom-box:
transform: 25px (at active-before boundary with inclusive endpoint)
bg-color: #9f9 (at active-after boundary with inclusive endpoint)
-->
<div id="scroller-5" class="scroller">
<div class="box reverse"></div>
<div class="box reverse"></div>
<div class="spacer"></div>
</div>
<!-- scroll to midpoint + reverse
top-box:
transform: none (before phase)
bg-color: gray (at active-before boundary with exclusive endpoint)
bottom-box:
transform: none (at active-before boundary with exclusive endpoint)
bg-color: #9f9 (at active-before boundary with inclusive endpoint)
-->
<div id="scroller-6" class="scroller">
<div class="spacer"></div>
<div class="box reverse"></div>
<div class="box reverse"></div>
<div class="spacer"></div>
</div>
</body>
<script src="/common/reftest-wait.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script>
function scrollTo(scroller_id, relative_offset) {
const scroller = document.getElementById(scroller_id);
const max_scroll = scroller.scrollHeight - scroller.clientHeight;
scroller.scrollTop = relative_offset * max_scroll;
}
window.onload = async () => {
await waitForCompositorReady();
document.querySelectorAll('.reverse').forEach(elem => {
elem.getAnimations().forEach(anim => {
anim.reverse();
});
});
// Playing forward
scrollTo('scroller-1', 1);
scrollTo('scroller-2', 0);
scrollTo('scroller-3', 0.5);
// Playing reverse
scrollTo('scroller-4', 1);
scrollTo('scroller-5', 0);
scrollTo('scroller-6', 0.5);
await waitForNextFrame();
takeScreenshot();
};
</script>
</html>