| <!DOCTYPE html> |
| <title> |
| Adding a scrollable element should make it start capturing snap points. |
| </title> |
| <link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions"/> |
| <meta name="viewport" content="user-scalable=no"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| div { |
| position: absolute; |
| margin: 0px; |
| } |
| |
| html { |
| scroll-snap-type: y mandatory; |
| } |
| |
| body { |
| margin: 0px; |
| } |
| |
| #middle-scroller { |
| top: 100px; |
| height: 500px; |
| width: 500px; |
| overflow: visible; |
| background-color: rgb(12, 61, 2); |
| scroll-snap-type: none; |
| } |
| |
| #inner-scroller { |
| top: 200px; |
| height: 400px; |
| width: 400px; |
| overflow: visible; |
| background-color: rgb(65, 139, 50); |
| scroll-snap-type: y mandatory; |
| } |
| |
| .space { |
| width: 2000px; |
| height: 2000px; |
| } |
| |
| #inner-snap-area { |
| top: 300px; |
| width: 200px; |
| height: 200px; |
| background-color: blue; |
| scroll-snap-align: start; |
| } |
| |
| #document-snap-area { |
| top: 500px; |
| width: 200px; |
| height: 200px; |
| background-color: lightblue; |
| scroll-snap-align: start; |
| } |
| |
| #inserted-snap-container { |
| top: 400px; |
| height: 600px; |
| width: 400px; |
| overflow: scroll; |
| scroll-snap-type: y mandatory; |
| } |
| </style> |
| |
| <div class="space"></div> |
| <div id="middle-scroller"> |
| <div class="space"></div> |
| <div id="inner-scroller"> |
| <div class="space"></div> |
| <div id="inner-snap-area"></div> |
| </div> |
| </div> |
| </div> |
| <div id="document-snap-area"></div> |
| <script> |
| |
| const inner_scroller = document.getElementById("inner-scroller"); |
| const middle_scroller = document.getElementById("middle-scroller"); |
| const document_scroller = document.scrollingElement; |
| |
| // This tests that making an element scrollable will reassign the correct snap |
| // areas to itself, per spec [1]. |
| // [1] https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions |
| test(() => { |
| // Confirm that the document-level scroller is the snap container for all of |
| // the snap areas. |
| document_scroller.scrollTo(0, 10); |
| assert_equals(document_scroller.scrollTop, 500); |
| // Snaps to the inner snap area. |
| document_scroller.scrollBy(0, 75); |
| assert_equals(document_scroller.scrollTop, 600); |
| |
| // The middle scroller should now have the inner snap area assigned to it. |
| // Per spec, even if the snap-type is 'none', it should still capture snap |
| // points. |
| middle_scroller.style.setProperty("overflow", "scroll"); |
| |
| // The middle scroller has snap-type 'none' so it should not snap. |
| middle_scroller.scrollBy(0, 10); |
| assert_equals(middle_scroller.scrollTop, 10); |
| |
| // The document scroller should only snap to the document-level snap area. |
| document_scroller.scrollTo(0, 600); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // The inner scroller should now have the innermost snap area assigned to it. |
| inner_scroller.style.setProperty("overflow", "scroll"); |
| inner_scroller.scrollBy(0, 10); |
| assert_equals(inner_scroller.scrollTop, 300); |
| |
| document_scroller.scrollTo(0, 600); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| }, "Making an element scrollable should make it capture the correct descendant\ |
| snap areas' snap points."); |
| |
| // Test that attaching a new snap container also properly assigns snap areas. |
| test(() => { |
| // All containers should capture snap areas. |
| middle_scroller.style.setProperty("overflow", "scroll"); |
| inner_scroller.style.setProperty("overflow", "scroll"); |
| |
| // Sanity check that the scrollers still snap to the snap areas. |
| document_scroller.scrollTo(0, 10); |
| inner_scroller.scrollTo(0,10); |
| assert_equals(inner_scroller.scrollTop, 300); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // Create new snap container and append thedocument-level snap area as its |
| // child. |
| const inserted_scroller = document.createElement("div"); |
| inserted_scroller.id = "inserted-snap-container"; |
| const space = document.createElement("div"); |
| space.classList.add("space"); |
| inserted_scroller.appendChild(space); |
| inserted_scroller.appendChild(document.getElementById("document-snap-area")); |
| document_scroller.appendChild(inserted_scroller); |
| |
| // Document scroller no longer snaps. |
| document_scroller.scrollTo(0, 400); |
| assert_equals(document_scroller.scrollTop, 400); |
| |
| // Inserted scroller snaps. |
| inserted_scroller.scrollTo(0, 10); |
| assert_equals(inserted_scroller.scrollTop, 500); |
| }, "Attaching a new element that is scrollable should assign the correct snap\ |
| areas to it."); |
| </script> |