Skip to the content

Hover list

A list of projects or services, one row per entry: a number, a title, a category, a year.

Become a member to unlock the full effect today.

Join now

Already a member? Sign in

Documentation

  1. Copy to Webflow

    Add Geist and Geist Mono to your site's fonts (Site settings, Fonts, Google Fonts) before pasting: Webflow removes any font your site has not installed.

  2. Add custom CSS

    The pictures of the rows are in the markup, hidden: the stylesheet takes them out of the layout, and without it they show in the rows. The box that holds the rows keeps overflow: visible, or it clips the picture floating over it.
  3. Add custom JS

  4. Use it on your own elements

    Custom attributes
    Select the element on the canvas and open the Settings panel. Under Custom attributes, add a pair: the name on the left, the value on the right.
    Custom attributeWhat it does
    data-hover-list Marks the box that holds the rows. It takes no value: leave the value field empty. That box is what the picture floats in, what the effect is mounted on and what carries the settings. Without it on any box of the page, the embed marks the parent of the first row it finds next to itself, and says so in the console when there is none.
    data-hover-list-item Marks one row, inside that box. It takes no value. A row is what the pointer runs over and what takes the focus, so in the preview it is the link itself. Without it on any row, nothing is mounted and the console says so. [ Required ]
    data-hover-list-title Marks the title of a row, the words that slide while the row is live. It takes no value. Without it the row still shows its picture and dims the others; only the slide is missing. [ Optional ]
    data-hover-list-image Marks the hidden picture of a row, an Image inside it that the script reads and never shows. It takes no value. Without it the first image of the row is taken; a row with no image shows an empty box and says so once in the console. [ Optional ]
    data-hover-list-state Written by the engine: idle or live on the box, live on the row under the pointer and dim on the others, taken off at rest. Never written by hand; the stylesheet reads it for the colour of the live number. [ Optional ]
    Settings
    Every setting is a custom attribute too, added the same way and on the same element. An attribute always wins over the defaults written in the code.
    AttributeDefaultWhat it is
    data-hover-list-accent #ffab1a Flash colour of the turning squares, the amber #ffab1a by default. Options: any plain CSS colour; taken out of this block, --hover-list-accent on the list then the page's --accent take over.
    data-hover-list-width clamp(170px, 15vw, 300px) Width of the floating picture, any CSS unit.
    data-hover-list-height clamp(222px, 19.6vw, 392px) Height of the floating picture, any CSS unit.
    data-hover-list-shift clamp(28px, 3vw, 56px) How far to the right of the pointer the picture sits, any CSS unit.
    data-hover-list-lag 0.55 How long the picture takes to catch up with the pointer, in seconds.
    data-hover-list-top-speed 1400 Pointer speed, in px per second, at which the lean and the stretch are at their largest.
    data-hover-list-skew 0 Largest lean of the picture, in degrees, reached at top speed.
    data-hover-list-stretch 0.08 Largest stretch along the way of travel, 0 to 1.
    data-hover-list-cell 16 Side of one square of the turn, kept in px so the grain is the same on every screen.
    data-hover-list-swap 0.85 How long a picture takes to turn into the next one, in seconds.
    data-hover-list-ease power2.inOut Pace of the turn across the squares, a GSAP ease name.
    data-hover-list-flash 1 Strength of the accent light on the squares at the front of a turn, 0 to 1.
    data-hover-list-front 0.1 Share of the squares lit at the front of a turn, 0 to 1.
    data-hover-list-flat 1 How solid the lit squares are, 0 to 1.
    data-hover-list-fade 0.6 How long the picture takes to grow in on the first row and to shrink out on leaving, in seconds; on leaving it fades while its squares go out, so never faster than most of a swap.
    data-hover-list-slide clamp(12px, 1.4vw, 24px) How far the title of the live row moves to the right, any CSS unit.
    data-hover-list-dim 0.3 Opacity of the other rows while one is live, 0 to 1.

What it does

Hover list is a cursor animation for Webflow and vanilla JavaScript, built on GSAP 3. Also called hover list image follow cursor, project list hover image or image follow cursor.

A list of projects or services, one row per entry: a number, a title, a category, a year. When the pointer runs over a row, the picture of that row floats beside the pointer and follows it with a lag, so it trails a little behind and settles when the pointer stops. The faster the pointer, the more the picture stretches, lightly, along the way it travels; it does not lean unless a skew is asked for. Moving to another row turns the picture into the next one square by square, with the ink lighting the front of the turn, the same grain as the bank's other pixel effects. The live row slides its title a little and the other rows dim. Leaving the list dissolves the picture and shrinks it out. Built on GSAP 3: quickTo movers for the lag and the lean, a ticker for the speed, one tween for each turn of the squares. On the keyboard, the picture is posed beside the focused row; on touch, beside the tapped row; under reduced motion it is posed, never follows, and only fades.

Updated

Questions

Paste the component, or mark your own rows: data-hover-list on the list, data-hover-list-item on each row, data-hover-list-title on its title and one image per row marked data-hover-list-image. Settings are custom attributes on the list, for instance data-hover-list-lag="0.8", where a higher lag lets the picture trail further behind the pointer.

Yes, GSAP 3 with no plugins. The Webflow embed carries the CDN tag for 3.12.5, and a plain page needs that tag before hover-list.js. The engine waits ten seconds for window.gsap, then says in the console that it never came.

Use data-hover-list-width and data-hover-list-height, in any CSS unit. The defaults are clamp(170px, 15vw, 300px) wide and clamp(222px, 19.6vw, 392px) tall. The size is a setting, not a class, because the floating picture is drawn by the script, and every picture is cropped to that box like object-fit: cover.

Yes. A tap on a row poses the picture beside that row and a tap anywhere else takes it away, while the row's link still does what a link does. On the keyboard, the focused row gets the picture at its right end, and Tab turns it from one row's picture to the next.