scroll-snap-stop-change.html (2363B)
1 <!DOCTYPE html> 2 <link rel="help" href="https://drafts.csswg.org/css-scroll-snap/#scroll-snap-stop" /> 3 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <style> 7 div, html, body { 8 margin: 0; 9 padding: 0; 10 } 11 12 html { 13 scroll-snap-type: x mandatory; 14 overflow: scroll; 15 } 16 17 #scroller { 18 scroll-snap-type: x mandatory; 19 overflow: scroll; 20 height: 400px; 21 width: 400px; 22 } 23 24 .large_space { 25 width: 2000px; 26 height: 2000px; 27 } 28 29 .snap_area { 30 scroll-snap-align: none start; 31 width: 100px; 32 height: 100px; 33 34 background-color: blue; 35 } 36 37 .snap_area:nth-child(1) { 38 margin-left: 0; 39 } 40 41 .snap_area:nth-child(2) { 42 margin-left: 100px; 43 } 44 45 .snap_area:nth-child(3) { 46 margin-left: 300px; 47 } 48 49 .snap_area:nth-child(4) { 50 margin-left: 500px; 51 } 52 </style> 53 54 <!-- Add snap area to the root scroller --> 55 <div class="snap_area"></div> 56 <div class="snap_area"></div> 57 <div class="snap_area"></div> 58 <div class="snap_area"></div> 59 60 <div id="scroller"> 61 <div class="snap_area"></div> 62 <div class="snap_area"></div> 63 <div class="snap_area"></div> 64 <div class="snap_area"></div> 65 <div class="large_space"></div> 66 </div> 67 68 <div class="large_space"></div> 69 70 <script> 71 const scrollers = [document.scrollingElement, document.getElementById("scroller")]; 72 for (const scroller of scrollers) { 73 test(_ => { 74 assert_equals(scroller.scrollLeft, 0); // sanity check 75 76 scroller.querySelectorAll('.snap_area').forEach(area => area.style.scrollSnapStop = 'always'); 77 scroller.scrollBy(500, 0); 78 assert_equals(scroller.scrollLeft, 100, "scrollBy should not skip area with stop always"); 79 80 scroller.querySelectorAll('.snap_area').forEach(area => area.style.scrollSnapStop = 'normal'); 81 scroller.scrollBy(500, 0); 82 assert_equals(scroller.scrollLeft, 500, "scrollBy should skip secon area with stop normal"); 83 84 // When snap type is changed back to mandatory, scrolling should snap. 85 scroller.querySelectorAll('.snap_area').forEach(area => area.style.scrollSnapStop = 'always'); 86 scroller.scrollBy(-500, 0); 87 assert_equals(scroller.scrollLeft, 300, "scrollBy should not skip area with stop always"); 88 }, `scroll-snap-stop for areas on ${scroller.nodeName} should control snapping behavior and changing it takes effect`); 89 } 90 </script>