prefer-inner-target.html (4743B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <link rel="help" href="https://drafts.csswg.org/css-scroll-snap" /> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="/dom/events/scrolling/scroll_support.js"></script> 8 <script src="/resources/testdriver.js"></script> 9 <script src="/resources/testdriver-actions.js"></script> 10 <script src="/resources/testdriver-vendor.js"></script> 11 <script src="resources/common.js" ></script> 12 </head> 13 <body> 14 <style> 15 .scroller { 16 overflow: scroll; 17 position: relative; 18 height: 400px; 19 width: 400px; 20 border:solid 1px black; 21 scroll-snap-type: y mandatory; 22 } 23 .no-snap { scroll-snap-align: none } 24 .scroller div:focus { 25 border: solid 1px red; 26 } 27 .large-space { 28 height: 300vh; 29 width: 300vw; 30 position: absolute; 31 } 32 .target { 33 scroll-snap-align: start; 34 position: absolute; 35 width: 100px; 36 height: 100px; 37 border: solid 1px black; 38 } 39 .top { 40 top: 0px; 41 } 42 .left { 43 left: 0px; 44 } 45 .right { 46 left: 200px; 47 } 48 .bottom { 49 top: 200px; 50 } 51 .inner { 52 text-align: right; 53 } 54 .inner1 { 55 height: 150px; 56 width: 150px; 57 top: 150px; 58 left: 100px; 59 background-color: blue; 60 } 61 .inner2 { 62 height: 100px; 63 width: 100px; 64 top: 150px; 65 left: 100px; 66 background-color: pink; 67 } 68 .inner3 { 69 height: 75px; 70 width: 75px; 71 top: 150px; 72 left: 100px; 73 background-color: green; 74 } 75 .inner4 { 76 height: 50px; 77 width: 50px; 78 top: 150px; 79 left: 100px; 80 background-color: grey; 81 } 82 .outer { 83 height: 200px; 84 width: 200px; 85 top: 150px; 86 left: 50px; 87 left: 50px; 88 background-color: yellow; 89 } 90 </style> 91 <div id="scroller" class="scroller"> 92 <div class="large-space"></div> 93 <div class="top left target">Top Left</div> 94 <div class="top right target">Top Right</div> 95 <div class="outer target" id="outer">Outer</div> 96 <div class="inner inner1 target" id="inner1">I1</div> 97 <div class="inner inner2 target" id="inner2">I2</div> 98 <div class="inner inner3 target" id="inner3">I3</div> 99 <div class="inner inner4 target" id="inner4">I4</div> 100 </div> 101 <script> 102 function cleanup() { 103 inner.style.top = 100; 104 outer.style.top = 100; 105 } 106 window.onload = (async () => { 107 const inner1 = document.getElementById("inner1"); 108 const inner2 = document.getElementById("inner2"); 109 const inner3 = document.getElementById("inner3"); 110 const inner4 = document.getElementById("inner4"); 111 const outer = document.getElementById("outer"); 112 const scroller = document.getElementById("scroller"); 113 114 promise_test(async (t) => { 115 await waitForCompositorCommit(); 116 117 await runScrollSnapSelectionVerificationTest(t, scroller, 118 /*aligned_elements_x=*/[], 119 /*aligned_elements_y=*/[inner1, inner2, inner3, inner4, outer], 120 /*axis=*/"y", 121 /*expected_target_x*/null, 122 /*expected_target_y*/inner4); 123 124 // Push inner4 outside the snapport. It should no longer be considered 125 // the snap target; inner3 is next in line. 126 inner4.style.left = "500px"; 127 await runScrollSnapSelectionVerificationTest(t, scroller, 128 /*aligned_elements_x=*/[], 129 /*aligned_elements_y=*/[inner1, inner2, inner3, inner4, outer], 130 /*axis=*/"y", 131 /*expected_target_x*/null, 132 /*expected_target_y*/inner3); 133 134 // Reset inner4's style. 135 inner4.style.left = "100px"; 136 }, "snap container selects innermost area as snap target"); 137 138 promise_test(async (t) => { 139 t.add_cleanup(() => { 140 outer.style.top = "150px"; 141 }); 142 await waitForCompositorCommit(); 143 144 // Move outer target below inner targets. 145 outer.style.top = "400px"; 146 147 // Snap to now-below outer target. 148 scroller.scrollTop = outer.offsetTop; 149 150 runLayoutSnapSeletionVerificationTest(t, scroller, 151 [inner1, inner2, inner3, inner4], outer, "y"); 152 }, "snap container follows selected snap target after layout change " + 153 "(the pre-existing snap target should not be overriden because of " + 154 "the innermost area)"); 155 }); 156 </script> 157 </body> 158 </html>