Skip to the content

Footer reveal

The footer is not at the end of the page, it is under it.

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

    Three things belong to the page rather than to the component. The page above the footer needs a background of its own: the footer sits behind it the whole way down, and a transparent section is a window onto it. The footer shares its parent with that page. And no ancestor of the footer cuts its overflow with hidden, auto or scroll: use overflow: clip there, or the footer has nowhere to hold and simply follows the page.
  3. Add custom JS

  4. Tune it

    Custom attributes
    Select the section 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-footer-reveal Goes on the footer and takes no value: leave the value field empty. It marks the element that holds under the page while the page lifts off it. The footer has to share its parent with the page above it. Without it on any element of the page, the embed marks the nearest footer itself.
    data-footer-reveal-page Marks the block above the footer, the sheet that lifts. It takes no value. The stylesheet puts it over the footer in the stacking order, and it needs a background of its own, or the footer shows through it. Without it anywhere on the page, the engine marks every block before the footer in their parent itself. [ Optional ]
    data-footer-reveal-wordmark Marks the name that comes out of a mask letter by letter, inside the footer. It takes no value. Plain text is split into one box per letter and keeps its text in an aria-label; a wordmark holding elements, an SVG logo for one, comes out in one piece. Without it nothing is split. [ Optional ]
    data-footer-reveal-columns Marks the block of the footer that trails the page and closes the gap as it leaves. It takes no value, and may be set on more than one block. Without it nothing trails. [ Optional ]
    data-footer-reveal-state Written by the engine on the footer: live within one screen of it, idle further away, still under reduced motion, flat when an ancestor cuts its overflow and the footer cannot hold. The stylesheet lets go of the hold on still and flat. Never written by hand. [ Optional ]
    data-footer-reveal-edge, data-footer-reveal-shade, data-footer-reveal-veil Written by the engine on the three blocks it adds: the edge, a block of no height just before the footer, which moves with the page and is what is watched and measured; the shadow inside it; and the veil, the last child of the footer, the shade it lies in while the page covers it. Never written by hand, and removed by destroy(). [ Optional ]
    data-footer-reveal-split, data-footer-reveal-word, data-footer-reveal-letter Written by the engine on a split wordmark, on the mask around each of its words and on the box around each letter. The stylesheet draws the mask on them. Never written by hand, and removed by destroy(). [ Optional ]
    Settings
    Every setting is a custom attribute too, added the same way and on the same section. An attribute always wins over the defaults written in the code.
    AttributeDefaultWhat it is
    data-footer-reveal-color #15100c Background of the footer, written on the footer itself so it wins over its class. Options: any CSS colour; taken out of the settings and the attributes, --footer-reveal-color on the footer takes over.
    data-footer-reveal-ink #f4ece0 Colour of the footer's text, the wordmark and the links included. Options: any CSS colour; taken out of the settings and the attributes, --footer-reveal-ink on the footer takes over.
    data-footer-reveal-shadow 0.35 Darkest the shadow of the page gets, 0 to 1: the shade over the whole footer while it is covered, which lifts with the page, and the band under the edge of the page, which grows as it lifts.
    data-footer-reveal-scale-from 1 Size the footer starts from while it is covered, in times its own size; it is back to 1 once uncovered.
    data-footer-reveal-parallax 0.12 How far below their place the columns start, as a share of the lift, a screen at most; they close the gap as the page leaves.
    data-footer-reveal-rise 1.3 Time one letter of the wordmark takes to come up from under its line, in seconds, on an expo out.
    data-footer-reveal-stagger 0.07 Delay between two letters of the wordmark, in seconds: each letter starts that much later than the one before.
    data-footer-reveal-smoothing 0.2 Share of the distance to the scroll the motion closes each frame, 0 to 1, counted at 60 frames a second.

What it does

Footer reveal is a scroll animation for Webflow and vanilla JavaScript, with no library. Also called footer reveal on scroll, sticky footer reveal or fixed footer reveal.

The footer is not at the end of the page, it is under it. It holds at the bottom of the window behind the page, and the last screen of the page lifts off it like a sheet: a shadow grows under the edge of the page, the footer comes out of the shade, its columns trail the page and close the gap as it leaves, and the name of the brand comes out of a mask letter by letter, each letter starting a moment after the one before it. The hold itself is CSS, position sticky, so it is drawn by the browser with the scroll and never lags it; the script only adds the motion on top, eased towards the scroll so a mouse wheel never chops it. It listens to the scroll only within one screen of the footer, draws no frame at rest, and needs no library. A footer taller than the window holds by its head, shows its first screen, then scrolls as any page does. With reduced motion, or with no script at all, the footer simply follows the page with its name in place. Not the gravity footer: nothing falls into this one, it is the page that moves.

Updated

Questions

Give the footer the custom attribute data-footer-reveal, with no value, and keep the page above it as its sibling: both in the same parent, the page first. That page block takes data-footer-reveal-page and needs a background of its own, because the footer sits behind it the whole time. Settings are more attributes on the footer, for instance data-footer-reveal-parallax="0.3".

Neither. The hold is CSS position: sticky, drawn by the browser with the scroll, and no library is loaded. The script only adds the motion on top, the shadow, the columns and the wordmark, and listens to the scroll only within one screen of the footer.

Most often an ancestor of the footer has overflow: hidden, auto or scroll, a page wrapper for instance, and a sticky footer cannot hold inside a box that does not scroll. The script then leaves the footer to follow the page, writes the state flat and names that ancestor in the console. Put overflow: clip on it instead, and check the footer is not alone in a wrapper of its own.

It holds by its head instead of its foot: the page uncovers the first screen of the footer, then the rest scrolls up as any page does. This is the usual case on a phone once the columns stack. The stylesheet does it with top: 0 and bottom: 0 together, and nothing is measured.

Set data-footer-reveal-parallax, 0.12 by default: how far below their place the columns marked data-footer-reveal-columns start, as a share of the lift. At 0 the columns do not move, and past 0.4 they run into what sits under them while they travel.