| <!DOCTYPE html> |
| <html> |
| <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"> |
| |
| <body> |
| <style> |
| :root { |
| margin: 0px; |
| } |
| |
| #spacer { |
| height: 100vh; |
| width: 100px; |
| } |
| |
| #top_box { |
| width: 100px; |
| height: 60vh; |
| background-color: blue; |
| } |
| #middle_box { |
| width: 100px; |
| height: 60vh; |
| scroll-initial-target: nearest; |
| background-color: purple; |
| } |
| #bottom_box { |
| width: 100px; |
| height: 60vh; |
| background-color: yellow; |
| } |
| |
| #fragment_target { |
| width: 100px; |
| height: 100px; |
| background-color: red; |
| } |
| </style> |
| <div id="top_box"></div> |
| <div id="middle_box"></div> |
| <div id="bottom_box"></div> |
| <div id="spacer"></div> |
| <div id="fragment_target">Target</div> |
| <script> |
| function stashResult(key, results) { |
| fetch(`/css/css-scroll-snap/scroll-initial-target/stash.py?key=${key}`, { |
| method: "POST", |
| body: JSON.stringify(results) |
| }).then(() => { |
| window.close(); |
| }); |
| } |
| function record() { |
| let scroll_position = "UNKNOWN"; |
| // Expect page is scrolled all the way down as the text is at the bottom of |
| // the page. |
| const expected_scroll_top = document.scrollingElement.scrollHeight - |
| document.scrollingElement.clientHeight; |
| |
| const scroll_start_target_top = Math.round(top_box.getBoundingClientRect().height); |
| |
| const actual_scroll_top = Math.round(document.scrollingElement.scrollTop); |
| if (actual_scroll_top == scroll_start_target_top) { |
| scroll_position = "AT_SCROLL_START_TARGET"; |
| } else if (actual_scroll_top == expected_scroll_top) { |
| scroll_position = "AT_TEXT_FRAGMENT"; |
| } |
| |
| const result = { |
| scroll_position: scroll_position |
| }; |
| |
| let key = (new URL(document.location)).searchParams.get("key"); |
| stashResult(key, result); |
| } |
| |
| window.onload = () => { |
| window.requestAnimationFrame(function () { |
| window.requestAnimationFrame(record); |
| }) |
| } |
| </script> |
| </body> |
| |
| </html> |