Skip to main content

Dithered Lazy Image: sustainable web design example

A free, animated image placeholder for low-data image galleries, 1-bit dither style. Every colour, text and motion setting is a runtime input.

Updated October 2026

About the Dithered Lazy Image

The Dithered Lazy Image is a image placeholder with a 1-bit dither look, made for low-data image galleries. It animates an ordered-dither landscape with a gently moving ridge, and a tap loads the full image or goes back. It also has keyframes you can edit in the ExodeUI timeline: an entrance and an ambient float.

Runtime inputs for the Dithered Lazy Image

These 23 inputs, plus the replay and tap triggers, can be set from the customizer above, from the ExodeUI studio, or from your code while the element runs.

InputWhat it changesType
captionCaptionText
smallSizeDithered sizeText
fullSizeFull image sizeText
inkColorInkColour
paperColorPaperColour
skyTopFull image skyColour
skyBottomFull image horizonColour
hillColorFull image hillsColour
cellDither cell sizeNumber
radiusCorner radiusNumber
liftHover liftNumber
interactiveMouse interactionOn/off
tiltHover tilt (deg, 0 = off)Number
pressPress squishNumber
floatExtra idle float (px)Number
speedAnimation speedNumber
introEntrance animationOn/off
introStyleExtra entrance styleChoice
introDurationEntrance duration (s)Number
colorTweenColour change fade (s)Number
pageModePage backgroundChoice
pageTopPage colourColour
pageBottomPage gradient endColour

Add the Dithered Lazy Image to React or Next.js

  1. Open an element above and set its text, colours and motion, or keep the defaults.
  2. Download the .bexode file (or the customized .exode) and put it in your public folder.
  3. Install the runtime with npm i exodeui.
  4. Render it with ExodeUICanvas and pass your text, numbers and colours as inputs.
import { ExodeUICanvas } from 'exodeui';

export function DitheredLazyImageWidget({ data }) {
  return (
    <ExodeUICanvas
      src="/ui-trends/files/sustainable/05-dithered-image.bexode"
      autoPlay
      style={{ width: 600, height: 400 }}
      inputs={{
        caption: data.caption,
        smallSize: data.smallSize,
        // every colour is an input too, for example a brand accent
        ...data.theme
      }}
    />
  );
}

Frequently asked questions

Is the Dithered Lazy Image element free?
Yes. You can preview it, customize it and download the .exode and .bexode files without paying. ExodeUI also has a free Community plan for editing it in the studio.
What does the Dithered Lazy Image do when tapped?
It loads the full image or goes back. You can fire the same action from code with the tap input, and replay the entrance with the replay input.
Can I change the colours and text of the Dithered Lazy Image?
Yes. All 7 colours and every label are runtime inputs. Set them in the customizer above or pass them from your code; colour changes cross-fade.
Does it have keyframes I can edit?
Yes. The file has a keyframed entrance and an ambient float on the timeline, which you can edit in the ExodeUI Animate tab. Its own motion and interaction stay live and follow the speed input.
Does it work outside React?
The same file works with the other ExodeUI runtimes, including Vue, Svelte, Angular, Solid, React Native, SwiftUI and Flutter.