| <!DOCTYPE html> |
| <title> |
| When an element no longer captures snap positions (e.g., no longer |
| scrollable), then its currently captured snap areas must be reassigned. |
| </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: scroll; |
| background-color: rgb(12, 61, 2); |
| scroll-snap-type: none; |
| } |
| |
| #inner-scroller { |
| top: 200px; |
| height: 400px; |
| width: 400px; |
| overflow: scroll; |
| 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; |
| } |
| |
| </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> |
| |
| // This tests that making a snap container no longer scrollable will reassign |
| // its snap areas to the next scrollable ancestor, per spec [1]. |
| // [1] https://drafts.csswg.org/css-scroll-snap/#captures-snap-positions |
| test(() => { |
| const inner_scroller = document.getElementById("inner-scroller"); |
| const middle_scroller = document.getElementById("middle-scroller"); |
| const document_scroller = document.scrollingElement; |
| |
| // Inner scroller should snap to its captured area. |
| // Middle scroller doesn't snap. |
| // Document scroller should snap to its only captured area. |
| inner_scroller.scrollBy(0,10); |
| middle_scroller.scrollBy(0, 10); |
| // Scroll to (0,600), where we would expect the inner snap area to be relative |
| // to the document scroller. |
| document_scroller.scrollTo(0, 600); |
| assert_equals(inner_scroller.scrollTop, 300); |
| assert_equals(middle_scroller.scrollTop, 10); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // Inner scroller is no longer a scroll container. |
| inner_scroller.style.setProperty("overflow", "visible"); |
| assert_equals(inner_scroller.scrollTop, 0); |
| assert_equals(middle_scroller.scrollTop, 10); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // The new snap container is the middle scroller, which has snap-type 'none'. |
| // Per spec, the scroll container should capture snap positions even if it has |
| // snap-type 'none'. |
| // The middle scroller should not snap. |
| // The document scroller should still only snap to its captured snap area. |
| document_scroller.scrollBy(0, 100); |
| middle_scroller.scrollBy(0, 10); |
| assert_equals(inner_scroller.scrollTop, 0); |
| assert_equals(middle_scroller.scrollTop, 20); |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // The scroll container should now be at the document level. |
| middle_scroller.style.setProperty("overflow", "visible"); |
| document_scroller.scrollBy(0, -10); |
| assert_equals(inner_scroller.scrollTop, 0); |
| assert_equals(middle_scroller.scrollTop, 0); |
| |
| // Check that the existing snap area did not get removed when reassigning |
| // the inner snap area. |
| assert_equals(document_scroller.scrollTop, 500); |
| |
| // Check that the inner snap area got reassigned to the document. |
| document_scroller.scrollBy(0, 150); |
| assert_equals(document_scroller.scrollTop, 600); |
| }, 'Making a snap container not scrollable should promote the next scrollable\ |
| ancestor to become a snap container.'); |
| </script> |