Anchored Auto Layout
npm

Hover or focus a box to measure it. Click its tag, or press ] and [, to pin one. Esc unpins.

    Legend
    • Anchor: a box with data-⚓️-name
    • Placed by anchors: out of flow
    • Gap from the anchor's edge, in px
    • Edges of the box you're inspecting

    Every tag, line and number here is itself placed by data-⚓️-* attributes. JS only measures.

    Masonry that glides

    A CSS multi-column masonry board whose cards glide to their new column when the column width changes or the board is resized.

    Full page
    <header class="intro">
      <h1>Masonry that glides</h1>
      <p>
        The columns are plain CSS multi-column: invisible <code>.cell</code>s reflow
        <em>instantly</em> when the column width changes or you drag the board's edge.
        Each card is anchored to its cell with <code>data-⚓️-fill</code> and
        <code>data-⚓️-transition="glide"</code>, so it travels to its new column instead of teleporting.
        Every cell reuses the name <code>--card</code>, fenced by <code>data-⚓️-scope-name</code>.
        Zero JavaScript.
      </p>
      <form class="controls" aria-label="Board controls">
        <fieldset class="segmented">
          <legend>Column width</legend>
          <label><input type="radio" name="col" value="s"> Narrow</label>
          <label><input type="radio" name="col" value="m" checked> Medium</label>
          <label><input type="radio" name="col" value="l"> Wide</label>
        </fieldset>
        <label class="xray-toggle"><input type="checkbox" name="xray"> X-ray</label>
      </form>
    </header>
    
    <main class="board" data-⚓️-root>
    <div class="columns">
      <div class="cell" style="--h: 15rem; --hue: 30" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Salt flats at dusk</strong><span>Bonneville, UT</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 9rem; --hue: 320" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Neon alley</strong><span>Osaka</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 12rem; --hue: 170" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Kelp forest</strong><span>Monterey</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 8rem; --hue: 40" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Paper lanterns</strong><span>Hội An</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 14rem; --hue: 210" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Glacier melt</strong><span>Svalbard</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 10rem; --hue: 20" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Rust & rivets</strong><span>Pittsburgh</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 11rem; --hue: 350" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Night market</strong><span>Taipei</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 16rem; --hue: 240" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Fog bank</strong><span>Big Sur</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 9rem; --hue: 140" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Tea terraces</strong><span>Munnar</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 13rem; --hue: 50" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Sandstone arch</strong><span>Moab</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 10rem; --hue: 160" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Aurora</strong><span>Tromsø</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 15rem; --hue: 130" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Pine & moss</strong><span>Olympic NP</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 8rem; --hue: 260" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Tile mosaic</strong><span>Lisbon</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 12rem; --hue: 10" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Lava field</strong><span>Reykjanes</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 14rem; --hue: 110" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Bamboo grove</strong><span>Arashiyama</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 9rem; --hue: 280" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Harbour lights</strong><span>Hobart</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 11rem; --hue: 60" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Dune sea</strong><span>Namib</span></p>
        </article>
      </div>
      <div class="cell" style="--h: 13rem; --hue: 230" data-⚓️-name="--card" data-⚓️-scope-name="--card">
        <article class="card" data-⚓️-to="--card" data-⚓️-fill data-⚓️-transition="glide">
          <div class="art" aria-hidden="true"></div>
          <p class="caption"><strong>Rain window</strong><span>Seattle</span></p>
        </article>
      </div>
    </div>
    </main>

    data-⚓️-filldata-⚓️-namedata-⚓️-rootdata-⚓️-scope-namedata-⚓️-todata-⚓️-transition

    Copied