| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Dynamically set animation-play-state to paused</title> |
| <link rel="author" title="Igalia S.L." href="https://www.igalia.com/"> |
| <link rel="help" href="https://drafts.csswg.org/css-animations-1/#animation-play-state"> |
| <meta name="assert" content="Visually check that transform animations stop |
| when animation-play-state is set to paused"> |
| <link rel="match" href="set-animation-play-state-to-paused-001-ref.html"> |
| <style> |
| #container { |
| position: absolute; |
| left: 0; |
| top: 3em; |
| } |
| #squareLinear, #squareSteps { |
| width: 100px; |
| height: 100px; |
| background: red; |
| position: absolute; |
| left: -50px; |
| } |
| #squareLinear { |
| top: 25px; |
| animation: move 2s linear; |
| } |
| #squareSteps { |
| top: 175px; |
| animation: move 2s steps(1000, end); |
| } |
| #coveringRect { |
| position: absolute; |
| background: lightgreen; |
| width: 150px; |
| height: 300px; |
| left: -75px; |
| top: 0px; |
| transform: translate(150px); |
| } |
| .pause { |
| opacity: 0.6; |
| animation-play-state: paused !important; |
| } |
| @keyframes move |
| { |
| 100% { |
| transform: translate(500px); |
| } |
| } |
| </style> |
| <script> |
| var start = null; |
| var animationDuration = 2000; |
| function halfWidth(id) |
| { |
| return document.getElementById(id).scrollWidth / 2; |
| } |
| function shift(id) |
| { |
| var transform = window.getComputedStyle(document.getElementById(id)).transform; |
| if (transform === "none") |
| return 0; |
| // See https://drafts.csswg.org/css-transforms-2/#serialization-of-the-computed-value |
| return parseFloat(transform.split(/,\s*/)[4]); |
| } |
| function step(timestamp) { |
| // For each square, pause the animation as soon as it passes under the covering rect. |
| ["squareLinear", "squareSteps"].forEach((id) => { |
| if (Math.abs(shift("coveringRect") - shift(id)) < halfWidth("coveringRect") - halfWidth(id)) |
| document.getElementById(id).classList.add("pause"); |
| }); |
| |
| // Stop the reftest after the time when the animations would have stop. |
| // If pausing failed for some reason, the squares will be visible. |
| if (!start) start = timestamp; |
| if (timestamp - start < animationDuration) |
| window.requestAnimationFrame(step); |
| else if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| function runTest() { |
| if (window.testRunner) |
| testRunner.waitUntilDone(); |
| window.requestAnimationFrame(step); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>This test passes if you see a green rectangle and no red.</p> |
| <div id="container"> |
| <div id="squareLinear"></div> |
| <div id="squareSteps"></div> |
| <div id="coveringRect"></div> |
| </div> |
| </body> |
| </html> |