1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
<!DOCTYPE html>
<title>position-try-fallbacks:flip-block, only switch fallback if the current option doesn't fit</title>
<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
<link rel="help" href="https://drafts.csswg.org/css-anchor-position/#position-try-fallbacks">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/test-common.js"></script>
<style>
#anchor {
anchor-name: --a;
margin-top: 200px;
margin-left: 100px;
width: 150px;
height: 50px;
background: blue;
}
#anchored1 {
position: absolute;
position-anchor: --a;
position-area: top left;
position-try-fallbacks: flip-block;
width: 100px;
height: 100px;
background: hotpink;
}
#anchored2 {
position: absolute;
position-anchor: --a;
position-area: top right;
position-try-fallbacks: flip-block;
width: 100px;
height: 450px;
background: yellow;
}
</style>
<div id="scroller" style="position:relative; overflow-y:scroll; width:400px; height:400px;">
<div id="anchor"></div>
<div style="height:1000px;"></div>
<div id="anchored1"></div>
<div id="anchored2"></div>
</div>
<script>
async function redisplay() {
anchored1.style.display = "none";
anchored2.style.display = "none";
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
anchored1.style.display = "block";
anchored2.style.display = "block";
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
}
promise_test(async () => {
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
// Both options fits. Pick the first one.
assert_equals(anchored1.offsetTop, 100);
// None of the options for #anchor2 fits. Use the first one.
assert_equals(anchored2.offsetTop, -250);
}, 'initial position');
promise_test(async () => {
scroller.scrollTop = 100;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
assert_equals(anchored1.offsetTop, 100);
assert_equals(anchored2.offsetTop, -250);
}, 'scroll to 100');
promise_test(async () => {
scroller.scrollTop = 101;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
// The first option for #anchored1 no longer fits. Move to the second one,
// which fits.
assert_equals(anchored1.offsetTop, 250);
// None of the options for #anchor2 fits. Keep using the first one.
assert_equals(anchored2.offsetTop, -250);
}, 'scroll to 101');
promise_test(async () => {
scroller.scrollTop = 100;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
// The first option fits again, but stay at the second option, since that
// one too still fits.
assert_equals(anchored1.offsetTop, 250);
assert_equals(anchored2.offsetTop, -250);
}, 'scroll back to 100');
promise_test(async () => {
await redisplay();
// Redisplaying the anchored element should go through the options over
// again, which means that the first options will be chosen.
assert_equals(anchored1.offsetTop, 100);
assert_equals(anchored2.offsetTop, -250);
}, 'redisplay at 100');
promise_test(async () => {
scroller.scrollTop = 299;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
// The first option no longer fits. Move to the second one, which fits.
assert_equals(anchored1.offsetTop, 250);
assert_equals(anchored2.offsetTop, -250);
}, 'scroll to 299');
promise_test(async () => {
scroller.scrollTop = 300;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
assert_equals(anchored1.offsetTop, 250);
// The second option now fits.
assert_equals(anchored2.offsetTop, 250);
}, 'scroll to 300');
promise_test(async () => {
scroller.scrollTop = 0;
await waitUntilNextAnimationFrame();
await waitUntilNextAnimationFrame();
// The second option still fits.
assert_equals(anchored1.offsetTop, 250);
// The second option no longer fits, but neither does the first one. Stay at
// the second one.
assert_equals(anchored2.offsetTop, 250);
}, 'scroll back to 0');
</script>
|