Kodza

Direction-Aware Hover

Tiles whose caption, or a second photo, slides in from the edge the pointer comes from and leaves by the edge it goes out. The keyboard opens it from the bottom; on touch the caption sits under the photo.

Image effects No dependencies imagehoverdirectionportfolioproductgrid Images mixed Added Nov 2026
/anim/direction-aware-hover/ GitHub Fullscreen

With your AI

Just ask.

Say it to your AI. It gets the exact code below, not its best guess, and knows where it goes.

Add the Kodza Direction-Aware Hover to my page.

Not plugged in yet?
claude mcp add -t http kodza https://kodza.dev/api/mcp
Also in Codex, Cursor and VS Code.
kodza-direction-aware-hover.html
<div class="kodza-direction-hover" style="--kz-direction-hover-ratio: 4 / 3; --kz-direction-hover-columns: 3; --kz-direction-hover-columns-narrow: 1">
  <ul class="kodza-direction-hover__grid">
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-overflow-1400.webp" width="1400" height="1400" alt="A two-storey concrete house, its upper floor cantilevered over the ground" loading="lazy">
        </span>
        <span class="kodza-direction-hover__caption">
          <span class="kodza-direction-hover__top"><span class="kodza-direction-hover__meta">House · 2025</span><svg class="kodza-direction-hover__arrow" viewBox="0 0 16 16" aria-hidden="true"><path d="M4.5 11.5l7-7M5.5 4.5h6v6" /></svg></span>
          <span class="kodza-direction-hover__words"><span class="kodza-direction-hover__title">Falaise House</span><span class="kodza-direction-hover__place">Étretat</span></span>
        </span>
      </a>
    </li>
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-steps-1400.webp" width="1400" height="933" alt="Wide concrete steps climbing a slope, each one casting a sharp shadow" loading="lazy">
        </span>
        <span class="kodza-direction-hover__caption">
          <span class="kodza-direction-hover__top"><span class="kodza-direction-hover__meta">Public space · 2024</span><svg class="kodza-direction-hover__arrow" viewBox="0 0 16 16" aria-hidden="true"><path d="M4.5 11.5l7-7M5.5 4.5h6v6" /></svg></span>
          <span class="kodza-direction-hover__words"><span class="kodza-direction-hover__title">The Steps</span><span class="kodza-direction-hover__place">Le Havre</span></span>
        </span>
      </a>
    </li>
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-float-1400.webp" width="1400" height="933" alt="A flat concrete pavilion that seems to float above a pool of still water" loading="lazy">
        </span>
        <span class="kodza-direction-hover__caption">
          <span class="kodza-direction-hover__top"><span class="kodza-direction-hover__meta">Pavilion · 2024</span><svg class="kodza-direction-hover__arrow" viewBox="0 0 16 16" aria-hidden="true"><path d="M4.5 11.5l7-7M5.5 4.5h6v6" /></svg></span>
          <span class="kodza-direction-hover__words"><span class="kodza-direction-hover__title">Low Water</span><span class="kodza-direction-hover__place">Honfleur</span></span>
        </span>
      </a>
    </li>
  </ul>
</div>

<div class="kodza-direction-hover">
  <ul class="kodza-direction-hover__grid">
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-arch-1400.webp" width="1400" height="1400" alt="Print of a concrete wall with a round-topped opening" loading="lazy">
          <img class="kodza-direction-hover__photo" src="https://kodza.dev/media/kz-arch-dark-1400.webp" width="1400" height="1400" alt="" loading="lazy">
        </span>
        <span class="kodza-direction-hover__info"><span class="kodza-direction-hover__name">Arch</span><span class="kodza-direction-hover__price">€48</span><span class="kodza-direction-hover__note">Day and night print, 40&nbsp;×&nbsp;50&nbsp;cm</span></span>
      </a>
    </li>
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-columns-1400.webp" width="1120" height="1400" alt="Print of a row of square concrete pillars under a flat roof" loading="lazy">
          <img class="kodza-direction-hover__photo" src="https://kodza.dev/media/kz-columns-dark-1400.webp" width="1120" height="1400" alt="" loading="lazy">
        </span>
        <span class="kodza-direction-hover__info"><span class="kodza-direction-hover__name">Columns</span><span class="kodza-direction-hover__price">€48</span><span class="kodza-direction-hover__note">Day and night print, 40&nbsp;×&nbsp;50&nbsp;cm</span></span>
      </a>
    </li>
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-block-1400.webp" width="1120" height="1400" alt="Print of a tall concrete slab standing alone, its long shadow stretching forward" loading="lazy">
          <img class="kodza-direction-hover__photo" src="https://kodza.dev/media/kz-block-dark-1400.webp" width="1120" height="1400" alt="" loading="lazy">
        </span>
        <span class="kodza-direction-hover__info"><span class="kodza-direction-hover__name">Block</span><span class="kodza-direction-hover__price">€36</span><span class="kodza-direction-hover__note">Day and night print, 30&nbsp;×&nbsp;40&nbsp;cm</span></span>
      </a>
    </li>
    <li class="kodza-direction-hover__item">
      <a class="kodza-direction-hover__link" href="#">
        <span class="kodza-direction-hover__media">
          <img class="kodza-direction-hover__image" src="https://kodza.dev/media/kz-table-1400.webp" width="1400" height="1050" alt="Print of a white table set with two glasses, facing a misty sea" loading="lazy">
          <img class="kodza-direction-hover__photo" src="https://kodza.dev/media/kz-table-dark-1400.webp" width="1400" height="1050" alt="" loading="lazy">
        </span>
        <span class="kodza-direction-hover__info"><span class="kodza-direction-hover__name">Table</span><span class="kodza-direction-hover__price">€42</span><span class="kodza-direction-hover__note">Day and night print, 40&nbsp;×&nbsp;50&nbsp;cm</span></span>
      </a>
    </li>
  </ul>
</div>

Checked

Checked before you paste.

Robots poked at it before you did. Every component goes through the same checks, and again each time it changes.

What ranLast run
Accessibilityaxe-core 4.10.2: the WCAG 2.1 A and AA rules, plus best practices. 0 issues
KeyboardThe Tab key gets there, and the focus ring shows when it does. Passed
Reduced motionTurn on reduced motion and what moved just appears. Nothing loops. Passed
Light and darkThe same checks on both themes, contrast included. Passed
WordPressPasted into Twenty Twenty-Five, Twenty Twenty-One, Astra, Blocksy, GeneratePress, Hello Elementor, Kadence and OceanWP. Nothing to flag. 8 / 8 themes
Robots checked this. A human with VoiceOver hasn't yet.
KeyboardPress them in the preview
On a tile
  • Next tile: its caption or second photo rises from the bottomTab

More like this

More in Image effects