| <!DOCTYPE html> |
| <html> |
| <body> |
| <style> |
| * { |
| scroll-behavior: smooth; |
| } |
| .scroller { |
| overflow-y: scroll; |
| height: 200px; |
| width: 200px; |
| background-color: teal; |
| border: solid 1px black; |
| position: relative; |
| display: inline-block; |
| } |
| .space { |
| height: 200vh; |
| width: 200vw; |
| } |
| .box { |
| height: 50px; |
| width: 50px; |
| background-color: purple; |
| } |
| .target { |
| position: absolute; |
| top: 150%; |
| } |
| </style> |
| <div id="fragment_scroll_container" class="scroller"> |
| <div class="space"></div> |
| <div class="box target" id="fragment_scroll_target">target</div> |
| </div> |
| <div id="scrollintoview_container" class="scroller"> |
| <div class="space"></div> |
| <div class="box target" id="scrollintoview_target"></div> |
| </div> |
| <a id="fragment_link" href="#fragment_scroll_target">Scroll To Fragment</a> |
| </style> |
| <script> |
| const fragment_scroll_container = |
| document.getElementById("fragment_scroll_container"); |
| const scrollintoview_container = |
| document.getElementById("scrollintoview_container"); |
| const scrollintoview_target = |
| document.getElementById("scrollintoview_target"); |
| const parent = window.parent; |
| |
| // Post a message to the parent frame when the scroll ends to the test can |
| // proceed. |
| scrollintoview_container.addEventListener("scrollend", () => { |
| parent.postMessage("ready"); |
| }, { once: true }); |
| |
| // Start a scroll on the scrollintoview container as soon as we start |
| // scrolling the fragment's container. |
| fragment_scroll_container.addEventListener("scroll", () => { |
| scrollintoview_target.scrollIntoView({ behavior: "smooth" }); |
| }, { once: true }); |
| </script> |
| </body> |
| </html> |