Skip to the content

Greeting loader

A loading screen that says hello. A panel of ink covers the page, and greetings run through its middle, Hello, Bonjour, Hola, Ciao, Hallo, Olá, each one rising out of a one line window letter by letter, leaning and settling on an expo out, then leaving upwards on a power3 in while the next one is already rising under it: the two overlap, never a hard swap.

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 overlay covers the page from the first paint only if it comes first: keep it at the top of the Body, and if you move this code out of the Embed, put the CSS in the head of the page or of the site.
  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-greeting-loader Marks the overlay, an empty block that covers the page while the greetings run. It takes no value: leave the value field empty. Keep it first in the Body, so it covers the page from the first paint. The script builds the panel, the greetings and the dot inside it.
    data-greeting-loader-target On the headline of the page, an h1 or any element that holds text: where the last word lands. Its own text closes the run, in its own face, and the word that flies becomes it. Keep it in the first screen. Without it the last greeting leaves with the panel. [ Optional ]
    data-greeting-loader-state Written by the engine on the overlay: waiting, greeting, handover, then done; fading under reduced motion, skipped on a later page of the session, off once destroyed. Never written by hand. [ 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-greeting-loader-color #15100c Colour of the panel that covers the page. Options: any CSS colour.
    data-greeting-loader-ink #f4ece0 Colour of the greetings on the panel, and of the last word for as long as the panel is behind it. Options: any CSS colour that reads on color.
    data-greeting-loader-dot #ffab1a Colour of the dot before each greeting, the accent. Options: any CSS colour.
    data-greeting-loader-words Hello, Bonjour, Hola, Ciao, Hallo, Olá The greetings, in play order, commas between them (bars, Hello | Hi, you, when a greeting holds a comma). The headline's own text is added at the end unless the list already ends on it. Options: any list of short words; fewer for a short loader, more for a long one.
    data-greeting-loader-size clamp(40px, 6.2vw, 104px) Size of the greetings on the panel, any CSS unit. The last word is shown at this size before it grows to the headline's.
    data-greeting-loader-interval 0.62 Time from the first greeting starting to rise to the second one doing so, in seconds. Every next beat is accel times the one before, never under 0.2 s.
    data-greeting-loader-accel 0.78 Share of the previous beat each next greeting keeps, the ratio of the rhythm.
    data-greeting-loader-enter expo.out Curve a greeting rises in on, a GSAP ease name; the last word rises on it too. Options: expo.out (fast out of the window, long soft landing), power4.out, power3.out (rounder), back.out(1.4) (a slight overshoot).
    data-greeting-loader-leave power3.in Curve a greeting leaves on, a GSAP ease name. Options: power3.in (holds, then goes), expo.in (holds longer, leaves sharper), power2.in (softer).
    data-greeting-loader-stagger 0.022 Delay between two letters of a greeting as it rises, in seconds; the exit uses half of it, and both shrink as the rhythm speeds up.
    data-greeting-loader-tilt 7 Lean of a letter under the window, in degrees, turned from its lower left corner and settled at 0 as it lands.
    data-greeting-loader-hold 0.4 Pause on the last word once it has settled, before it flies, in seconds.
    data-greeting-loader-lift 1.2 How long the panel takes to lift and the last word to reach the headline, in seconds; both share one expo in-out.
    data-greeting-loader-lip clamp(36px, 7vw, 120px) Depth of the curve of the panel's lower edge at its fullest, any CSS unit.
    data-greeting-loader-max 6 Longest time, counted from the start, the last word waits for the page to be loaded before the panel lifts anyway, in seconds.
    data-greeting-loader-once true Whether the loader plays once per browser session and is skipped on the next pages. Options: true (the first page of the session only), false (every load).

What it does

Greeting loader is a page transition for Webflow and vanilla JavaScript, built on GSAP 3. Also called hello preloader, multilingual greeting preloader or words preloader.

A loading screen that says hello. A panel of ink covers the page, and greetings run through its middle, Hello, Bonjour, Hola, Ciao, Hallo, Olá, each one rising out of a one line window letter by letter, leaning and settling on an expo out, then leaving upwards on a power3 in while the next one is already rising under it: the two overlap, never a hard swap. A dot sits before each word and travels to the front of the next one on a curve of its own. The rhythm speeds up, and every greeting still lands and is read. The run closes on the headline of the page itself, set in its own face. That word stays, the dot leaves, and the word flies from the middle of the panel to the place of the headline, growing to its size, while the panel lifts off the page: its lower edge is one SVG curve, pulled taut as it crosses the screen and flat again as it leaves, on an expo in-out. Where the panel still covers it the word is the ink of the panel, where the page shows it is already the colour of the headline, so the lip changes its colour as it passes. On landing the copy is the headline, pixel for pixel, and gives way to it. Once per browser session, and never on the next pages; the last word waits for the page to be loaded, within a longest time. Under reduced motion there are no greetings: the headline is in place and the panel fades out. The whole play is one GSAP timeline.

Updated

Questions

Paste it with the overlay, an empty block marked data-greeting-loader, as the first element of the page, then mark your headline with data-greeting-loader-target: that is where the last word lands. Settings are custom attributes on the overlay, for instance data-greeting-loader-hold="1".

The GSAP 3 core with no plugins; the embed loads 3.12.5 from jsDelivr, and the whole play is one GSAP timeline. On Webflow the engine waits for the copy of GSAP that Webflow injects instead of loading a second one. If GSAP never arrives, the overlay is hidden after max seconds, 6 by default, with a warning in the console.

Write them in data-greeting-loader-words, in play order with commas between them; the default is Hello, Bonjour, Hola, Ciao, Hallo, Olá. The text of the headline is added at the end unless the list already ends on it. Fewer words make a shorter loader, more words a longer one.

Lower data-greeting-loader-interval, the time in seconds between the first greeting and the second, 0.62 by default. Each next beat is data-greeting-loader-accel times the one before, 0.78 by default, and never under 0.2 seconds. At an accel of 1 every greeting keeps the beat of the first.

No. It plays on the first page of a browser session, writes greeting-loader:played in sessionStorage, and is skipped on the next pages. Set data-greeting-loader-once="false" to play it on every load, which helps while you work on a page.