| <!DOCTYPE html> |
| <title>CSS Anchor Positioning: try-tactic, justify/align-self</title> |
| <link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#typedef-position-try-fallbacks-try-tactic"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| #cb { |
| position: absolute; |
| width: 400px; |
| height: 400px; |
| border: 1px solid black; |
| } |
| #anchor { |
| position: absolute; |
| left: 150px; |
| top: 150px; |
| width: 100px; |
| height: 50px; |
| background-color: coral; |
| } |
| #target, #ref { |
| position: absolute; |
| left: 450px; /* force fallback */ |
| width: 40px; |
| height: 40px; |
| background-color: skyblue; |
| } |
| #ref { |
| background-color: seagreen; |
| } |
| </style> |
| <style id=style> |
| </style> |
| <div id=cb> |
| <div id=target></div> |
| <div id=ref></div> |
| </div> |
| <script> |
| |
| // Verify that a given try-tactic + untransformed declaration equals |
| // a reference element using `transformed` directly. |
| function test_justify_flip(try_tactic, untransformed, transformed, direction, writing_mode) { |
| if (direction==undefined) { |
| direction = 'ltr'; |
| } |
| if (writing_mode==undefined) { |
| writing_mode = 'horizontal-tb'; |
| } |
| test((t) => { |
| t.add_cleanup(() => { |
| document.documentElement.style = ''; |
| style.textContent = ''; |
| }); |
| document.documentElement.style.direction = direction; |
| document.documentElement.style.writingMode = writing_mode; |
| style.textContent = ` |
| @position-try --pf { |
| inset: 0; |
| ${untransformed} |
| } |
| #target { |
| position-try-fallbacks: --pf ${try_tactic}; |
| } |
| @position-try --ref { |
| inset: 0; |
| ${transformed} |
| } |
| #ref { |
| position-try-fallbacks: --ref; |
| } |
| `; |
| assert_equals(target.offsetLeft, ref.offsetLeft, 'offsetLeft'); |
| assert_equals(target.offsetTop, ref.offsetTop, 'offsetTop'); |
| }, `${try_tactic}, ${untransformed}, ${transformed}, ${direction}, ${writing_mode}`); |
| } |
| |
| test_justify_flip( |
| '', |
| 'justify-self:start;align-self:start', |
| 'justify-self:start;align-self:start'); |
| |
| test_justify_flip( |
| 'flip-inline', |
| 'justify-self:start;align-self:start', |
| 'justify-self:end;align-self:start'); |
| |
| test_justify_flip( |
| 'flip-block', |
| 'justify-self:start;align-self:start', |
| 'justify-self:start;align-self:end'); |
| |
| test_justify_flip( |
| 'flip-block flip-inline', |
| 'justify-self:start;align-self:start', |
| 'justify-self:end;align-self:end'); |
| |
| test_justify_flip( |
| 'flip-start', |
| 'justify-self:start;align-self:end', |
| 'justify-self:end;align-self:start'); |
| |
| test_justify_flip( |
| 'flip-block flip-start', |
| 'justify-self:start;align-self:start', |
| 'justify-self:end;align-self:start'); |
| |
| test_justify_flip( |
| 'flip-inline flip-start', |
| 'justify-self:start;align-self:start', |
| 'justify-self:start;align-self:end'); |
| |
| test_justify_flip( |
| 'flip-block flip-inline flip-start', |
| 'justify-self:start;align-self:start', |
| 'justify-self:end;align-self:end'); |
| |
| // left/right are special cases, because they're supported by |
| // justify-self, but not align-self: |
| |
| test_justify_flip( |
| 'flip-inline', |
| 'justify-self:left;align-self:start', |
| 'justify-self:right;align-self:start'); |
| |
| test_justify_flip( |
| 'flip-start', |
| 'justify-self:left;align-self:end', |
| 'justify-self:end;align-self:self-start'); |
| |
| test_justify_flip( |
| 'flip-start', |
| 'justify-self:right;align-self:start', |
| 'justify-self:start;align-self:self-end'); |
| |
| |
| // That that all relevant computed values can be transformed: |
| |
| function test_computed_value(try_tactic, property, value, expected) { |
| test((t) => { |
| t.add_cleanup(() => { |
| style.textContent = ''; |
| }); |
| style.textContent = ` |
| @position-try --pf { |
| inset: 0; |
| ${property}:${value}; |
| } |
| #target { |
| position-try-fallbacks: --pf ${try_tactic}; |
| } |
| `; |
| assert_equals(getComputedStyle(target).getPropertyValue(property), expected); |
| }, `${try_tactic}, ${property}:${value}`); |
| } |
| |
| // No flip: |
| for (let property of ['justify-self', 'align-self']) { |
| test_computed_value('', property, 'start', 'start'); |
| test_computed_value('', property, 'end', 'end'); |
| test_computed_value('', property, 'self-start', 'self-start'); |
| test_computed_value('', property, 'self-end', 'self-end'); |
| test_computed_value('', property, 'flex-start', 'flex-start'); |
| test_computed_value('', property, 'flex-end', 'flex-end'); |
| } |
| |
| test_computed_value('flip-inline', 'justify-self', 'start', 'end'); |
| test_computed_value('flip-inline', 'justify-self', 'end', 'start'); |
| test_computed_value('flip-inline', 'justify-self', 'self-start', 'self-end'); |
| test_computed_value('flip-inline', 'justify-self', 'self-end', 'self-start'); |
| test_computed_value('flip-inline', 'justify-self', 'flex-start', 'flex-end'); |
| test_computed_value('flip-inline', 'justify-self', 'flex-end', 'flex-start'); |
| test_computed_value('flip-inline', 'justify-self', 'left', 'right'); |
| test_computed_value('flip-inline', 'justify-self', 'right', 'left'); |
| |
| test_computed_value('flip-block', 'align-self', 'start', 'end'); |
| test_computed_value('flip-block', 'align-self', 'end', 'start'); |
| test_computed_value('flip-block', 'align-self', 'self-start', 'self-end'); |
| test_computed_value('flip-block', 'align-self', 'self-end', 'self-start'); |
| test_computed_value('flip-block', 'align-self', 'flex-start', 'flex-end'); |
| test_computed_value('flip-block', 'align-self', 'flex-end', 'flex-start'); |
| |
| test_justify_flip( |
| 'flip-start', |
| 'justify-self:left;align-self:end', |
| 'justify-self:end;align-self:self-start', |
| 'ltr', |
| 'vertical-rl'); |
| |
| test_justify_flip( |
| 'flip-start', |
| 'justify-self:left;align-self:start', |
| 'justify-self:start;align-self:self-end', |
| 'rtl'); |
| |
| </script> |