|  | <!DOCTYPE html> | 
|  | <link rel="help" href="https://drafts.csswg.org/css-scroll-snap-1/#scroll-margin" /> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <style> | 
|  | div { | 
|  | position: absolute; | 
|  | margin: 0px; | 
|  | } | 
|  | #scroller { | 
|  | height: 500px; | 
|  | width: 500px; | 
|  | overflow: hidden; | 
|  | scroll-snap-type: both mandatory; | 
|  | } | 
|  | #target { | 
|  | width: 300px; | 
|  | height: 300px; | 
|  | background-color: blue; | 
|  | } | 
|  | #another-target { | 
|  | width: 300px; | 
|  | height: 300px; | 
|  | top: 400px; | 
|  | left: 400px; | 
|  | background-color: blue; | 
|  | scroll-snap-align: start; | 
|  | } | 
|  | </style> | 
|  |  | 
|  | <div id="scroller"> | 
|  | <div style="width: 2000px; height: 2000px;"></div> | 
|  | <div id="target"></div> | 
|  | <div id="another-target"></div> | 
|  | </div> | 
|  |  | 
|  | <script> | 
|  | test(() => { | 
|  | target.style.scrollSnapAlign = "start"; | 
|  | target.style.scrollMargin = "100px"; | 
|  | target.style.left = "300px"; | 
|  | target.style.top = "300px"; | 
|  |  | 
|  | scroller.scrollTo(0, 0); | 
|  | // `target position (300px, 300px)` - `margin (100px, 100px)`. | 
|  | assert_equals(scroller.scrollLeft, 200); | 
|  | assert_equals(scroller.scrollTop, 200); | 
|  |  | 
|  | target.style.scrollSnapAlign = "end"; | 
|  |  | 
|  | // `target position (300px, 300px)` + `target size (300px, 300px) + | 
|  | // `margin (100px, 100px) - `scroller size (500px, 500px)`. | 
|  | scroller.scrollTo(0, 0); | 
|  | assert_equals(scroller.scrollLeft, 200); | 
|  | assert_equals(scroller.scrollTop, 200); | 
|  | }, "Snaps to the positions adjusted by scroll-margin"); | 
|  |  | 
|  | test(() => { | 
|  | target.style.left = "0px"; | 
|  | target.style.top = "0px"; | 
|  | target.style.scrollSnapAlign = "start"; | 
|  |  | 
|  | // Since the target is at (0px, 0px) in the scroll port, the added margin | 
|  | // should not be considered, and the snap points for this snap area should be | 
|  | // the closest points in the scroll port (i.e x=0 or y=0). | 
|  | target.style.scrollMargin = "200px"; | 
|  |  | 
|  | // Distance from target without margin: | 
|  | // `scroll position (150px, 150px)` - `target position (0px, 0px)` | 
|  | // = (150px, 150px) | 
|  | // | 
|  | // Distance from target with margin: | 
|  | // `scroll position (150px, 150px)` - [`target position (0px, 0px)` - | 
|  | // `target margin (200px, 200px)`] | 
|  | // = (350px, 350px) | 
|  | // | 
|  | // Distance from other target: | 
|  | // `other target position (400px, 400px)` - `scroll position (150px, 150px)` | 
|  | // = (250px, 250px) | 
|  | // | 
|  | // Therefore if the "out-of-scrollport" scroll-margin contributes to the | 
|  | // calculation, then the other target would be snapped to. However if the | 
|  | // scroll-margin is not considered, then the (0px, 0px) target should be | 
|  | // snapped to. | 
|  | scroller.scrollTo(150, 150); | 
|  | assert_equals(scroller.scrollLeft, 0); | 
|  | assert_equals(scroller.scrollTop, 0); | 
|  | }, "scroll-margin doesn't contribute to the snap position of the element " + | 
|  | "if it's outside of the scroll port"); | 
|  | </script> |