snap-inline-block.html (3662B)
1 <!DOCTYPE html> 2 <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#scroll-snap-type" /> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <style> 6 div { 7 position: absolute; 8 margin: 0px; 9 } 10 #scroller { 11 width: 400px; 12 height: 350px; 13 overflow: scroll; 14 scroll-snap-type: both mandatory; 15 } 16 #space { 17 width: 1000px; 18 height: 1000px; 19 } 20 #target { 21 width: 200px; 22 height: 200px; 23 left: 300px; 24 top: 300px; 25 } 26 </style> 27 28 <div id="scroller"> 29 <div id="space"></div> 30 <div id="target"></div> 31 </div> 32 33 <script> 34 const scroller_width = scroller.clientWidth; 35 const scroller_height = scroller.clientHeight; 36 [ 37 ["horizontal-tb", 300, 500 - scroller_height], 38 ["vertical-lr", 500 - scroller_width, 300], 39 ["vertical-rl", scroller_width - 700, 300] 40 ].forEach(([writing_mode, left, top]) => { 41 test(() => { 42 const target_left = getComputedStyle(target).left; 43 scroller.style.writingMode = writing_mode; 44 target.style.scrollSnapAlign = "end start"; 45 if (writing_mode == "vertical-rl") { 46 target.style.left = (scroller_width - 700) + "px"; 47 scroller.scrollTo(-500, 0); 48 } else { 49 scroller.scrollTo(0, 0); 50 } 51 assert_equals(scroller.scrollLeft, left, "aligns correctly on x"); 52 assert_equals(scroller.scrollTop, top, "aligns correctly on y"); 53 target.style.left = target_left; 54 scroller.style.writingMode = ""; 55 }, "Snaps correctly for " + writing_mode + 56 " writing mode with 'scroll-snap-align: end start' alignment"); 57 }); 58 59 [ 60 ["horizontal-tb", 500 - scroller_width, 300], 61 ["vertical-lr", 300, 500 - scroller_height], 62 ["vertical-rl", target.clientWidth - 700, 500 - scroller_height] 63 ].forEach(([writing_mode, left, top]) => { 64 test(() => { 65 const target_left = getComputedStyle(target).left; 66 scroller.style.writingMode = writing_mode; 67 target.style.scrollSnapAlign = "start end"; 68 if (writing_mode == "vertical-rl") { 69 target.style.left = (scroller_width - 700) + "px"; 70 scroller.scrollTo(-500, 0); 71 } else { 72 scroller.scrollTo(0, 0); 73 } 74 assert_equals(scroller.scrollLeft, left, "aligns correctly on x"); 75 assert_equals(scroller.scrollTop, top, "aligns correctly on y"); 76 target.style.left = target_left; 77 scroller.style.writingMode = ""; 78 }, "Snaps correctly for " + writing_mode + 79 " writing mode with 'scroll-snap-align: start end' alignment"); 80 }); 81 82 test(() => { 83 const target_left = getComputedStyle(target).left; 84 scroller.style.direction = "rtl"; 85 target.style.scrollSnapAlign = "end start"; 86 target.style.left = (scroller_width - 700) + "px"; 87 88 scroller.scrollTo(-500, 0); 89 assert_equals(scroller.scrollLeft, target.clientWidth - 700, 90 "aligns correctly on x"); 91 assert_equals(scroller.scrollTop, 500 - scroller_height, 92 "aligns correctly on y"); 93 94 target.style.left = target_left; 95 scroller.style.direction = ""; 96 }, "Snaps correctly for 'direction: rtl' with 'scroll-snap-align: end start' " + 97 "alignment"); 98 99 test(() => { 100 const target_left = getComputedStyle(target).left; 101 scroller.style.direction = "rtl"; 102 target.style.scrollSnapAlign = "start end"; 103 target.style.left = (scroller_width - 700) + "px"; 104 105 scroller.scrollTo(-500, 0); 106 assert_equals(scroller.scrollLeft, scroller_width - 700, 107 "aligns correctly on x"); 108 assert_equals(scroller.scrollTop, 300, "aligns correctly on y"); 109 110 target.style.left = target_left; 111 scroller.style.direction = ""; 112 }, "Snaps correctly for 'direction: rtl' with 'scroll-snap-align: start end' " + 113 "alignment"); 114 115 </script>