| <!DOCTYPE html> | |
| <link rel="help" href="https://drafts.csswg.org/css-align/#distribution-block"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| @import "/fonts/ahem.css"; | |
| body { | |
| font: 10px/1 Ahem; | |
| } | |
| td { | |
| padding: 0; | |
| height: 50px; | |
| } | |
| td:nth-child(2) { | |
| font-size: 20px; | |
| } | |
| .valign-top td { | |
| vertical-align: top; | |
| } | |
| .valign-middle td { | |
| vertical-align: middle; | |
| } | |
| .valign-bottom td { | |
| vertical-align: bottom; | |
| } | |
| .valign-middle-short td { | |
| vertical-align: middle; | |
| height: 10px; | |
| } | |
| .valign-bottom-short td { | |
| vertical-align: bottom; | |
| height: 10px; | |
| } | |
| .valign-baseline td { | |
| vertical-align: baseline; | |
| } | |
| .alignc-start td { | |
| align-content: start; | |
| } | |
| .alignc-center td { | |
| align-content: unsafe center; | |
| } | |
| .alignc-end td { | |
| align-content: unsafe end; | |
| } | |
| .alignc-center-short td { | |
| align-content: unsafe center; | |
| height: 10px; | |
| } | |
| .alignc-end-short td { | |
| align-content: unsafe end; | |
| height: 10px; | |
| } | |
| .alignc-baseline td { | |
| align-content: baseline; | |
| } | |
| .alignc-safe-center td { | |
| align-content: safe center; | |
| } | |
| .alignc-safe-end td { | |
| align-content: safe end; | |
| } | |
| .alignc-safe-center-short td { | |
| align-content: safe center; | |
| height: 10px; | |
| } | |
| .alignc-safe-end-short td { | |
| align-content: safe end; | |
| height: 10px; | |
| } | |
| </style> | |
| <table border="0" id="ref" class="valign-baseline"> | |
| <tr> | |
| <td><div class="content1">first<br>second</div></td> | |
| <td><div class="content2">first<br>second</div></td> | |
| <td><div class="content3">first<br>second<br>third</div></td> | |
| </tr> | |
| </table> | |
| <table border="0" id="target" class="alignc-baseline"> | |
| <tr> | |
| <td><div class="content1">first<br>second</div></td> | |
| <td><div class="content2">first<br>second</div></td> | |
| <td><div class="content3">first<br>second<br>third</div></td> | |
| </tr> | |
| </table> | |
| <script> | |
| function testEquivalence(target, ref) { | |
| assert_equals(target.querySelector('.content1').offsetTop, | |
| ref.querySelector('.content1').offsetTop, 'The first cell content top'); | |
| assert_equals(target.querySelector('.content2').offsetTop, | |
| ref.querySelector('.content2').offsetTop, 'The second cell content top'); | |
| assert_equals(target.querySelector('.content3').offsetTop, | |
| ref.querySelector('.content3').offsetTop, 'The third cell conten topt'); | |
| } | |
| const ref = document.querySelector('#ref'); | |
| const target = document.querySelector('#target'); | |
| const TALL = 50; | |
| // *-short specifies `height: 10px`, but cells ignore it, and the actual height | |
| // is the maximum content height in the row. | |
| const SHORT = 40; | |
| const C1HEIGHT = 10 * 2; | |
| test(() => { | |
| ref.className = 'valign-top'; | |
| target.className = 'alignc-start'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, 0); | |
| }, 'vertical-align:top and align-content:start are equivalent'); | |
| test(() => { | |
| ref.className = 'valign-middle'; | |
| target.className = 'alignc-center'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2); | |
| ref.className = 'valign-middle-short'; | |
| target.className = 'alignc-center-short'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, (SHORT - C1HEIGHT) / 2); | |
| }, 'vertical-align:middle and `align-content:unsafe center` are equivalent'); | |
| test(() => { | |
| ref.className = 'valign-bottom'; | |
| target.className = 'alignc-end'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT); | |
| ref.className = 'valign-bottom-short'; | |
| target.className = 'alignc-end-short'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, SHORT - C1HEIGHT); | |
| }, 'vertical-align:bottom and `align-content:unsafe end` are equivalent'); | |
| test(() => { | |
| ref.className = 'valign-baseline'; | |
| target.className = 'alignc-baseline'; | |
| testEquivalence(target, ref); | |
| }, 'vertical-align:baseline and align-content:baseline are equivalent'); | |
| test(() => { | |
| ref.className = 'valign-middle'; | |
| target.className = 'alignc-safe-center'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, (TALL - C1HEIGHT) / 2); | |
| }, 'vertical-align:middle and `align-content:safe center` are equivalent if the container is tall'); | |
| test(() => { | |
| ref.className = 'valign-bottom'; | |
| target.className = 'alignc-safe-end'; | |
| testEquivalence(target, ref); | |
| assert_equals(target.querySelector('.content1').offsetTop, TALL - C1HEIGHT); | |
| }, 'vertical-align:bottom and `align-content:safe end` are equivalent if the container is tall'); | |
| test(() => { | |
| ref.className = 'alignc-center-short'; | |
| target.className = 'alignc-safe-center-short'; | |
| testEquivalence(target, ref); | |
| }, '`align-content:safe center` is equivalent to `unsafe center` even if the specified `height` is short'); | |
| test(() => { | |
| ref.className = 'alignc-end-short'; | |
| target.className = 'alignc-safe-end-short'; | |
| }, '`align-content:safe end` is equivalent to `unsafe end` even if the specified `height` is short'); | |
| </script> |