Open demo

CSS code

HTML
<div class="heroes">
<div><span class="lbl">Mouse</span>
<section class="hero hero-ink" aria-labelledby="h-mouse"><h2 id="h-mouse">Lumen Kitchen spring menu</h2>
<p>Seven courses built around asparagus, wild garlic and the first rhubarb.</p>
<a class="sd sd-mouse" href="#next-section" aria-label="Scroll to the menu"><i aria-hidden="true"></i>Scroll</a></section></div>
<div><span class="lbl">Cascading chevrons</span>
<section class="hero hero-violet" aria-labelledby="h-chevs"><h2 id="h-chevs">Northwind Dev Summit 2027</h2>
<p>Two days, three stages and forty talks on shipping software in small teams.</p>
<a class="sd sd-chevs" href="#next-section"><span class="sr-only">Skip to the programme</span><i aria-hidden="true"><b></b><b></b><b></b></i></a></section></div>
<div><span class="lbl">Ringed arrow</span>
<section class="hero hero-clay" aria-labelledby="h-ring"><h2 id="h-ring">Casa Olmo, Matera</h2>
<p>Nine cave rooms carved into the Sassi, with a terrace over the gorge.</p>
<a class="sd sd-ring" href="#next-section"><i aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M12 5v14M6 13l6 6 6-6"/></svg></i>Explore the rooms</a></section></div>
<div><span class="lbl">Falling line</span>
<section class="hero hero-paper" aria-labelledby="h-line"><h2 id="h-line">Field notes, issue 14</h2>
<p>A photo essay on the salt marshes of the Camargue, in eleven pictures.</p>
<a class="sd sd-line" href="#next-section"><i aria-hidden="true"></i>Read on</a></section></div>
</div>
CSS
/* Scroll-down indicators. Each is a link to the next section; the drawing is aria-hidden.
   The motion plays three times and stops, moves again on hover or keyboard focus, and is off under reduced motion. */
.heroes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.hero{display:flex;flex-direction:column;align-items:center;min-height:270px;padding:30px 24px 22px;border-radius:18px;text-align:center}
.hero h2{font-size:1.3rem;letter-spacing:-.01em;line-height:1.25}
.hero p{margin-top:8px;font-size:.88rem;line-height:1.5;max-width:30ch}
.hero-ink{background:#17142b;color:#fff}
.hero-ink p{color:#c9c6da}
.hero-violet{background:linear-gradient(140deg,#4c3fd6,#6d36c4);color:#fff}
.hero-clay{background:linear-gradient(160deg,#94401f,#5f2a16);color:#fff}
.hero-paper{background:#fff;border:1px solid #e4e2ef;color:#17142b}
.hero-paper p{color:#4a4660}
.sd{display:inline-flex;flex-direction:column;align-items:center;gap:10px;margin-top:auto;padding:6px 10px;border-radius:12px;
  color:inherit;text-decoration:none;font-size:.7rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase}
.sd:focus-visible{outline:2px solid currentColor;outline-offset:3px}
.sd i,.sd b{display:block;font-style:normal}
.sd:hover *,.sd:focus-visible *,.sd:hover *::before,.sd:focus-visible *::before{animation-iteration-count:infinite}
/* 1. Mouse with a scrolling wheel */
.sd-mouse i{position:relative;width:26px;height:40px;border:2px solid currentColor;border-radius:14px}
.sd-mouse i::before{content:"";position:absolute;left:50%;top:7px;width:4px;height:8px;margin-left:-2px;border-radius:2px;
  background:currentColor;animation:sd-wheel 1.6s ease-in-out 3}
@keyframes sd-wheel{0%{transform:translateY(0);opacity:1}70%{transform:translateY(12px);opacity:0}100%{transform:translateY(0);opacity:0}}
/* 2. Cascading chevrons */
.sd-chevs i{display:grid;justify-items:center;padding-top:4px}
.sd-chevs b{width:18px;height:18px;margin-top:-8px;border-right:2.5px solid currentColor;border-bottom:2.5px solid currentColor;
  rotate:45deg;opacity:.3;animation:sd-glow 1.5s ease-in-out 3}
.sd-chevs b:nth-child(2){animation-delay:.18s}
.sd-chevs b:nth-child(3){animation-delay:.36s}
@keyframes sd-glow{0%,100%{opacity:.3}40%{opacity:1}}
/* 3. Ringed button with a bouncing arrow */
.sd-ring i{display:grid;place-items:center;width:52px;height:52px;border:1.5px solid currentColor;border-radius:50%;transition:background-color .2s,color .2s}
.sd-ring svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;animation:sd-bob 1.6s ease-in-out 3}
.sd-ring:hover i{background:#fff;color:#5f2a16}
@keyframes sd-bob{0%,100%{transform:translateY(-3px)}50%{transform:translateY(4px)}}
/* 4. Line with a falling segment */
.sd-line{flex-direction:column-reverse}
.sd-line i{position:relative;width:2px;height:64px;overflow:hidden;background:#d6d3e4;border-radius:2px}
.sd-line i::before{content:"";position:absolute;inset:0 0 auto;height:40%;background:currentColor;animation:sd-drop 1.8s cubic-bezier(.6,0,.4,1) 3}
@keyframes sd-drop{0%{transform:translateY(-100%)}100%{transform:translateY(250%)}}
.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
@media (max-width:640px){.heroes{grid-template-columns:1fr}}
@media (prefers-reduced-motion:reduce){.sd *,.sd *::before{animation:none!important;transition:none!important}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div class="row row-cols-1 row-cols-md-2 g-3">
<div class="col"><span class="lbl">Mouse</span>
<section class="hero hero-ink d-flex flex-column align-items-center text-center" aria-labelledby="h-mouse"><h2 id="h-mouse" class="fw-bold mb-2">Lumen Kitchen spring menu</h2>
<p class="mb-0">Seven courses built around asparagus, wild garlic and the first rhubarb.</p>
<a class="sd sd-mouse d-inline-flex flex-column align-items-center gap-2 mt-auto text-decoration-none text-uppercase fw-bold" href="#next-section" aria-label="Scroll to the menu"><i aria-hidden="true"></i>Scroll</a></section></div>
<div class="col"><span class="lbl">Cascading chevrons</span>
<section class="hero hero-violet d-flex flex-column align-items-center text-center" aria-labelledby="h-chevs"><h2 id="h-chevs" class="fw-bold mb-2">Northwind Dev Summit 2027</h2>
<p class="mb-0">Two days, three stages and forty talks on shipping software in small teams.</p>
<a class="sd sd-chevs d-inline-flex flex-column align-items-center gap-2 mt-auto text-decoration-none text-uppercase fw-bold" href="#next-section"><span class="visually-hidden">Skip to the programme</span><i aria-hidden="true"><b></b><b></b><b></b></i></a></section></div>
<div class="col"><span class="lbl">Ringed arrow</span>
<section class="hero hero-clay d-flex flex-column align-items-center text-center" aria-labelledby="h-ring"><h2 id="h-ring" class="fw-bold mb-2">Casa Olmo, Matera</h2>
<p class="mb-0">Nine cave rooms carved into the Sassi, with a terrace over the gorge.</p>
<a class="sd sd-ring d-inline-flex flex-column align-items-center gap-2 mt-auto text-decoration-none text-uppercase fw-bold" href="#next-section"><i aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M12 5v14M6 13l6 6 6-6"/></svg></i>Explore the rooms</a></section></div>
<div class="col"><span class="lbl">Falling line</span>
<section class="hero hero-paper d-flex flex-column align-items-center text-center" aria-labelledby="h-line"><h2 id="h-line" class="fw-bold mb-2">Field notes, issue 14</h2>
<p class="mb-0">A photo essay on the salt marshes of the Camargue, in eleven pictures.</p>
<a class="sd sd-line d-inline-flex flex-column-reverse align-items-center gap-2 mt-auto text-decoration-none text-uppercase fw-bold" href="#next-section"><i aria-hidden="true"></i>Read on</a></section></div>
</div>
CSS
/* Bootstrap grid, spacing and text utilities for the layout; .sd draws the indicators.
   The motion plays three times and stops, moves again on hover or keyboard focus, and is off under reduced motion. */
.hero{min-height:270px;padding:30px 24px 22px;border-radius:18px}
.hero h2{font-size:1.3rem;letter-spacing:-.01em;line-height:1.25}
.hero p{font-size:.88rem;line-height:1.5;max-width:30ch}
.hero-ink{background:#17142b;color:#fff}
.hero-ink p{color:#c9c6da}
.hero-violet{background:linear-gradient(140deg,#4c3fd6,#6d36c4);color:#fff}
.hero-clay{background:linear-gradient(160deg,#94401f,#5f2a16);color:#fff}
.hero-paper{background:#fff;border:1px solid #e4e2ef;color:#17142b}
.hero-paper p{color:#4a4660}
.sd{padding:6px 10px;border-radius:12px;color:inherit;font-size:.7rem;letter-spacing:.16em}
.sd:focus-visible{outline:2px solid currentColor;outline-offset:3px}
.sd i,.sd b{display:block;font-style:normal}
.sd:hover *,.sd:focus-visible *,.sd:hover *::before,.sd:focus-visible *::before{animation-iteration-count:infinite}
.sd-mouse i{position:relative;width:26px;height:40px;border:2px solid currentColor;border-radius:14px}
.sd-mouse i::before{content:"";position:absolute;left:50%;top:7px;width:4px;height:8px;margin-left:-2px;border-radius:2px;
  background:currentColor;animation:sd-wheel 1.6s ease-in-out 3}
@keyframes sd-wheel{0%{transform:translateY(0);opacity:1}70%{transform:translateY(12px);opacity:0}100%{transform:translateY(0);opacity:0}}
.sd-chevs i{display:grid;justify-items:center;padding-top:4px}
.sd-chevs b{width:18px;height:18px;margin-top:-8px;border-right:2.5px solid currentColor;border-bottom:2.5px solid currentColor;
  rotate:45deg;opacity:.3;animation:sd-glow 1.5s ease-in-out 3}
.sd-chevs b:nth-child(2){animation-delay:.18s}
.sd-chevs b:nth-child(3){animation-delay:.36s}
@keyframes sd-glow{0%,100%{opacity:.3}40%{opacity:1}}
.sd-ring i{display:grid;place-items:center;width:52px;height:52px;border:1.5px solid currentColor;border-radius:50%;transition:background-color .2s,color .2s}
.sd-ring svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;animation:sd-bob 1.6s ease-in-out 3}
.sd-ring:hover i{background:#fff;color:#5f2a16}
@keyframes sd-bob{0%,100%{transform:translateY(-3px)}50%{transform:translateY(4px)}}
.sd-line i{position:relative;width:2px;height:64px;overflow:hidden;background:#d6d3e4;border-radius:2px}
.sd-line i::before{content:"";position:absolute;inset:0 0 auto;height:40%;background:currentColor;animation:sd-drop 1.8s cubic-bezier(.6,0,.4,1) 3}
@keyframes sd-drop{0%{transform:translateY(-100%)}100%{transform:translateY(250%)}}
@media (prefers-reduced-motion:reduce){.sd *,.sd *::before{animation:none!important;transition:none!important}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2">
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Mouse</span>
<section class="flex min-h-[270px] flex-col items-center rounded-[18px] bg-[#17142b] px-6 pt-[30px] pb-[22px] text-center text-white" aria-labelledby="h-mouse"><h2 id="h-mouse" class="text-[1.3rem] leading-tight font-bold tracking-[-.01em]">Lumen Kitchen spring menu</h2>
<p class="mt-2 max-w-[30ch] text-[.88rem] leading-normal text-[#c9c6da]">Seven courses built around asparagus, wild garlic and the first rhubarb.</p>
<a class="group mt-auto inline-flex flex-col items-center gap-2.5 rounded-xl px-2.5 py-1.5 text-[.7rem] font-bold tracking-[.16em] uppercase focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current" href="#next-section" aria-label="Scroll to the menu"><span aria-hidden="true" class="relative block h-10 w-[26px] rounded-[14px] border-2 border-current before:absolute before:top-[7px] before:left-1/2 before:-ml-0.5 before:h-2 before:w-1 before:rounded-sm before:bg-current before:content-[''] before:animate-sd-wheel loop:before:[animation-iteration-count:infinite] motion-reduce:before:animate-none"></span>Scroll</a></section></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Cascading chevrons</span>
<section class="flex min-h-[270px] flex-col items-center rounded-[18px] bg-linear-[140deg] from-[#4c3fd6] to-[#6d36c4] px-6 pt-[30px] pb-[22px] text-center text-white" aria-labelledby="h-chevs"><h2 id="h-chevs" class="text-[1.3rem] leading-tight font-bold tracking-[-.01em]">Northwind Dev Summit 2027</h2>
<p class="mt-2 max-w-[30ch] text-[.88rem] leading-normal">Two days, three stages and forty talks on shipping software in small teams.</p>
<a class="group mt-auto inline-flex flex-col items-center gap-2.5 rounded-xl px-2.5 py-1.5 focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current" href="#next-section"><span class="sr-only">Skip to the programme</span><span aria-hidden="true" class="grid justify-items-center pt-1"><span class="-mt-2 block size-[18px] rotate-45 border-r-[2.5px] border-b-[2.5px] border-current opacity-30 animate-sd-glow loop:[animation-iteration-count:infinite] motion-reduce:animate-none"></span><span class="-mt-2 block size-[18px] rotate-45 border-r-[2.5px] border-b-[2.5px] border-current opacity-30 animate-sd-glow [animation-delay:.18s] loop:[animation-iteration-count:infinite] motion-reduce:animate-none"></span><span class="-mt-2 block size-[18px] rotate-45 border-r-[2.5px] border-b-[2.5px] border-current opacity-30 animate-sd-glow [animation-delay:.36s] loop:[animation-iteration-count:infinite] motion-reduce:animate-none"></span></span></a></section></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Ringed arrow</span>
<section class="flex min-h-[270px] flex-col items-center rounded-[18px] bg-linear-[160deg] from-[#94401f] to-[#5f2a16] px-6 pt-[30px] pb-[22px] text-center text-white" aria-labelledby="h-ring"><h2 id="h-ring" class="text-[1.3rem] leading-tight font-bold tracking-[-.01em]">Casa Olmo, Matera</h2>
<p class="mt-2 max-w-[30ch] text-[.88rem] leading-normal">Nine cave rooms carved into the Sassi, with a terrace over the gorge.</p>
<a class="group mt-auto inline-flex flex-col items-center gap-2.5 rounded-xl px-2.5 py-1.5 text-[.7rem] font-bold tracking-[.16em] uppercase focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current" href="#next-section"><span aria-hidden="true" class="grid size-[52px] place-items-center rounded-full border-[1.5px] border-current transition-colors duration-200 group-hover:bg-white group-hover:text-[#5f2a16] motion-reduce:transition-none"><svg viewBox="0 0 24 24" class="size-5 fill-none stroke-current stroke-2 animate-sd-bob loop:[animation-iteration-count:infinite] motion-reduce:animate-none" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M6 13l6 6 6-6"/></svg></span>Explore the rooms</a></section></div>
<div><span class="mb-3.5 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Falling line</span>
<section class="flex min-h-[270px] flex-col items-center rounded-[18px] border border-[#e4e2ef] bg-white px-6 pt-[30px] pb-[22px] text-center text-[#17142b]" aria-labelledby="h-line"><h2 id="h-line" class="text-[1.3rem] leading-tight font-bold tracking-[-.01em]">Field notes, issue 14</h2>
<p class="mt-2 max-w-[30ch] text-[.88rem] leading-normal text-[#4a4660]">A photo essay on the salt marshes of the Camargue, in eleven pictures.</p>
<a class="group mt-auto inline-flex flex-col-reverse items-center gap-2.5 rounded-xl px-2.5 py-1.5 text-[.7rem] font-bold tracking-[.16em] uppercase focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current" href="#next-section"><span aria-hidden="true" class="relative block h-16 w-0.5 overflow-hidden rounded-sm bg-[#d6d3e4] before:absolute before:inset-x-0 before:top-0 before:h-2/5 before:bg-current before:content-[''] before:animate-sd-drop loop:before:[animation-iteration-count:infinite] motion-reduce:before:animate-none"></span>Read on</a></section></div>
</div>
CSS
/* Keyframes for the indicators. Each plays three times; group-hover / group-focus-visible make it loop,
   and motion-reduce:animate-none switches it off. */
@theme {
  --animate-sd-wheel: sd-wheel 1.6s ease-in-out 3;
  --animate-sd-glow: sd-glow 1.5s ease-in-out 3;
  --animate-sd-bob: sd-bob 1.6s ease-in-out 3;
  --animate-sd-drop: sd-drop 1.8s cubic-bezier(.6,0,.4,1) 3;
  @keyframes sd-wheel{0%{transform:translateY(0);opacity:1}70%{transform:translateY(12px);opacity:0}100%{transform:translateY(0);opacity:0}}
  @keyframes sd-glow{0%,100%{opacity:.3}40%{opacity:1}}
  @keyframes sd-bob{0%,100%{transform:translateY(-3px)}50%{transform:translateY(4px)}}
  @keyframes sd-drop{0%{transform:translateY(-100%)}100%{transform:translateY(250%)}}
}
@custom-variant loop (&:is(.group:hover *, .group:focus-visible *));

About this set

Four animated scroll-down indicators, each placed at the foot of a hero panel the way they are used on landing pages. The mouse is an outlined mouse whose wheel dot slides down and fades, with a Scroll label underneath. The cascading chevrons are three stacked chevrons that light up one after another, for heroes that should stay wordless. The ringed arrow is a circle with a bouncing arrow and a visible Explore the rooms label, which fills on hover. The falling line is a thin vertical track with a segment that drops through it, a quiet choice for editorial pages. Each indicator is a real link to the next section, so it works with a keyboard and a screen reader instead of being a decorative animation. The drawing is aria-hidden; the link is named by its visible text, an aria-label that starts with the visible word, or visually hidden text. The animation plays three times and stops, so nothing on the page moves for longer than five seconds, and it moves again while the link is hovered or focused. Under prefers-reduced-motion the indicators are still.

What’s included

  • Mouse, cascading chevrons, ringed arrow and falling line indicators
  • Each indicator is a link to the next section
  • Animation plays three times, then stops; hover or focus restarts the loop
  • Still under prefers-reduced-motion
  • Text checked for contrast on dark, gradient and light panels

Accessibility

Every indicator is an anchor to the next section with an accessible name: visible text, an aria-label that contains the visible word, or visually hidden text for the wordless chevrons. The drawings are aria-hidden. Links show a 2px outline in the text colour on keyboard focus. Motion stops after three cycles and is removed entirely under prefers-reduced-motion.

Customise it

The indicators take currentColor, so set color on the hero or the .sd link. Change the timing in the sd-wheel, sd-glow, sd-bob and sd-drop keyframes; in Tailwind the same animations are --animate-sd-* entries in @theme.