| <!DOCTYPE html> |
| <style> |
| body { |
| height: 2000px; |
| } |
| |
| #box { |
| position: relative; |
| width: 20px; |
| height: 20px; |
| background-color: blue; |
| } |
| |
| .animating { |
| animation-name: slide; |
| animation-duration: 1ms; |
| animation-fill-mode: forwards; |
| animation-timing-function: linear; |
| -webkit-animation-trigger: container-scroll(20px, 120px); |
| } |
| |
| @-webkit-keyframes slide { |
| from { |
| left: 0px; |
| } |
| to { |
| left: 100px; |
| } |
| } |
| </style> |
| <script> |
| |
| var results; |
| var box; |
| |
| var scrollMin = 20; |
| var scrollMax = 120; |
| |
| if (window.testRunner) { |
| window.testRunner.dumpAsText(); |
| window.testRunner.waitUntilDone(); |
| } |
| |
| if (window.internals) |
| window.internals.settings.setVisualViewportEnabled(false); |
| |
| function runTest() { |
| results = document.getElementById("results"); |
| box = document.getElementById("box"); |
| var leftValue = window.getComputedStyle(box).left; |
| if (leftValue == "0px") |
| results.innerHTML = "PASS: Value before animation is applied is 0px<br>"; |
| else |
| results.innerHTML = "FAIL: Value before animation is applied should be auto, was " + leftValue + "<br>"; |
| box.className = "animating"; |
| setTimeout(checkValueWithoutScroll, 0); |
| } |
| |
| function checkValueWithoutScroll() { |
| var leftValue = window.getComputedStyle(box).left; |
| if (leftValue == "0px") |
| results.innerHTML += "PASS: Value with animation but no scroll was 0px<br>"; |
| else |
| results.innerHTML += "FAIL: Value with animation but no scroll should be 0px, was " + leftValue + "<br>"; |
| |
| window.scrollTo(0, scrollMin + 10); |
| setTimeout(function () { |
| checkValueWithScroll(10); |
| }, 0); |
| } |
| |
| function checkValueWithScroll(scrollAmount) { |
| var leftValue = Math.round(window.getComputedStyle(box).getPropertyCSSValue("left").getFloatValue(CSSPrimitiveValue.CSS_NUMBER)); |
| |
| if (leftValue == scrollAmount) |
| results.innerHTML += "PASS: Value with scroll amount of " + scrollAmount + " was " + scrollAmount + "px<br>"; |
| else |
| results.innerHTML += "FAIL: Value with scroll amount of " + scrollAmount + " should be " + scrollAmount + "px, was " + leftValue + "px<br>"; |
| |
| if (scrollMin + scrollAmount + 10 < scrollMax) { |
| window.scrollTo(0, scrollMin + scrollAmount + 10); |
| setTimeout(function () { |
| checkValueWithScroll(scrollAmount + 10); |
| }, 0); |
| } else { |
| if (window.testRunner) |
| window.testRunner.notifyDone(); |
| } |
| } |
| |
| window.addEventListener("load", runTest, false); |
| |
| </script> |
| |
| <p>This element should begin animating only when the page scrolls to 20px from |
| the top. It then animates smoothly, moving 100px to the left over the next |
| 100px of scrolling. Remember to scroll to the top of the page before reloading!</p> |
| <div id="box"></div> |
| |
| <div id="results"></div> |