Apple-Style Website Animation in Next.js: Der vollständige technische Guide 2026
Apple hat den Standard gesetzt. Linear hat ihn für Produkt-Tools adaptiert. Jetzt bauen wir ihn nach — vollständig, in Next.js, mit Code.
Dieser Guide ist für Entwickler, die wissen, was sie tun, und für Entscheider, die verstehen wollen, warum professionelle Web-Animationen kein Luxus sind.
Was "Apple-Style" technisch bedeutet
Bevor wir Code schreiben, müssen wir verstehen, was Apple tatsächlich macht:
- Scroll-linked animations: Elemente bewegen sich proportional zur Scroll-Position, nicht zeit-basiert
- Parallax depth: Unterschiedliche Ebenen bewegen sich mit unterschiedlicher Geschwindigkeit
- Staggered entrance: Elemente treten zeitversetzt ein — nie alle gleichzeitig
- Physics-based easing: Animationen haben "Gewicht" — sie overshoot leicht und federn zurück
- Performance-first: 60fps, keine Layout-Thrashing, nur
transformundopacityanimiert
Das Ziel ist nicht "viele Animationen". Das Ziel ist, dass die Seite atmet.
Setup: Next.js 15/16 + Framer Motion
npx create-next-app@latest my-premium-site --typescript --tailwind --app
cd my-premium-site
npm install framer-motion
Wichtig: In Next.js mit App Router müssen Framer Motion Komponenten in Client Components ('use client') verwendet werden.
Technik 1: Scroll-linked Fade + Slide (Framer Motion)
Der klassische Apple-Effekt: Elemente gleiten von unten in den Viewport, wenn man daran vorbeiscrollt.
// components/ScrollReveal.tsx
'use client'
import { motion } from 'framer-motion'
import { useInView } from 'framer-motion'
import { useRef } from 'react'
interface ScrollRevealProps {
children: React.ReactNode
delay?: number
direction?: 'up' | 'left' | 'right'
}
export function ScrollReveal({
children,
delay = 0,
direction = 'up'
}: ScrollRevealProps) {
const ref = useRef(null)
const isInView = useInView(ref, { once: true, margin: '-100px' })
const variants = {
hidden: {
opacity: 0,
y: direction === 'up' ? 40 : 0,
x: direction === 'left' ? -40 : direction === 'right' ? 40 : 0,
},
visible: {
opacity: 1,
y: 0,
x: 0,
transition: {
duration: 0.7,
delay,
ease: [0.25, 0.46, 0.45, 0.94], // Apple's easing curve
},
},
}
return (
<motion.div
ref={ref}
variants={variants}
initial="hidden"
animate={isInView ? 'visible' : 'hidden'}
>
{children}
</motion.div>
)
}
Verwendung:
<ScrollReveal delay={0.2}>
<h2>Wir bauen Digital Empires.</h2>
</ScrollReveal>
<ScrollReveal delay={0.4}>
<p>Für B2B-Marktführer mit Ambitionen.</p>
</ScrollReveal>
Der delay-Parameter ist der Schlüssel für Staggered Entrance: Headline kommt zuerst, dann Untertext, dann CTA.
Technik 2: Parallax Scroll mit useScroll + useTransform
// components/ParallaxSection.tsx
'use client'
import { useRef } from 'react'
import { motion, useScroll, useTransform } from 'framer-motion'
export function ParallaxSection({ imageUrl }: { imageUrl: string }) {
const ref = useRef(null)
const { scrollYProgress } = useScroll({
target: ref,
offset: ['start end', 'end start'],
})
// Hintergrund bewegt sich langsamer als der Inhalt
const y = useTransform(scrollYProgress, [0, 1], ['-20%', '20%'])
return (
<div ref={ref} className="relative h-[60vh] overflow-hidden">
<motion.div
style={{ y }}
className="absolute inset-0 scale-110"
>
<img
src={imageUrl}
alt="Parallax background"
className="h-full w-full object-cover"
/>
</motion.div>
<div className="relative z-10 flex h-full items-center justify-center">
<h2 className="text-5xl font-bold text-white">
Ihr Marktauftritt. Neu definiert.
</h2>
</div>
</div>
)
}
useTransform ist das Herzstück: Es mappt den Scroll-Fortschritt (0–1) auf einen Ausgabewert. Das Bild verschiebt sich um 40% der Sektionshöhe — das erzeugt die Tiefenwirkung.
Technik 3: Hexagon Orbit Animation (Fame4You Signatur)
Das spezifischste Element der Fame4You Visual Language: Ein zentrales Hexagon, um das Satelliten-Hexagone orbiten, während Connector-Lines sich aufzeichnen.
// components/HexagonOrbit.tsx
'use client'
import { motion } from 'framer-motion'
const SATELLITES = [
{ angle: 0, label: 'Strategy', delay: 0.3 },
{ angle: 60, label: 'Design', delay: 0.5 },
{ angle: 120, label: 'Development', delay: 0.7 },
{ angle: 180, label: 'SEO', delay: 0.9 },
{ angle: 240, label: 'Motion', delay: 1.1 },
{ angle: 300, label: 'Launch', delay: 1.3 },
]
function polarToCartesian(angle: number, radius: number) {
const rad = ((angle - 90) * Math.PI) / 180
return {
x: Math.cos(rad) * radius,
y: Math.sin(rad) * radius,
}
}
export function HexagonOrbit() {
return (
<div className="relative flex h-[500px] w-[500px] items-center justify-center">
{/* Zentrales Hexagon */}
<motion.div
initial={{ scale: 0, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
transition={{ duration: 0.6, ease: [0.34, 1.56, 0.64, 1] }}
className="absolute z-10 flex h-24 w-24 items-center justify-center"
style={{ clipPath: 'polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%)' }}
>
<div className="h-full w-full bg-[#D4AF37]" />
</motion.div>
{/* Connector Lines + Satelliten */}
{SATELLITES.map(({ angle, label, delay }) => {
const pos = polarToCartesian(angle, 160)
return (
<motion.div
key={label}
initial={{ opacity: 0, scale: 0 }}
animate={{ opacity: 1, scale: 1 }}
transition={{ delay, duration: 0.4, ease: 'backOut' }}
style={{ position: 'absolute', left: `calc(50% + ${pos.x}px)`, top: `calc(50% + ${pos.y}px)`, transform: 'translate(-50%, -50%)' }}
className="flex flex-col items-center gap-1"
>
<div
className="flex h-12 w-12 items-center justify-center border border-[#D4AF37]/40 bg-black/80 text-xs text-[#D4AF37]"
style={{ clipPath: 'polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%)' }}
>
⬡
</div>
<span className="text-xs text-white/60">{label}</span>
</motion.div>
)
})}
</div>
)
}
Technik 4: Mouse-Tracking Spotlight Cards
// components/SpotlightCard.tsx
'use client'
import { useRef, MouseEvent } from 'react'
export function SpotlightCard({ title, description }: { title: string; description: string }) {
const cardRef = useRef<HTMLDivElement>(null)
const handleMouseMove = (e: MouseEvent<HTMLDivElement>) => {
const card = cardRef.current
if (!card) return
const rect = card.getBoundingClientRect()
const x = e.clientX - rect.left
const y = e.clientY - rect.top
card.style.setProperty('--mouse-x', `${x}px`)
card.style.setProperty('--mouse-y', `${y}px`)
}
return (
<div
ref={cardRef}
onMouseMove={handleMouseMove}
className="spotlight-card relative overflow-hidden rounded-lg border border-white/10 bg-black p-6"
style={{
background: `radial-gradient(600px circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(212, 175, 55, 0.08), transparent 40%)`,
}}
>
<h3 className="text-xl font-semibold text-white">{title}</h3>
<p className="mt-2 text-white/60">{description}</p>
</div>
)
}
Der radiale Gradient folgt der Maus und erzeugt einen Spotlight-Effekt — direkt aus dem Linear.app Playbook.
Technik 5: CSS Scroll-Driven Animations (kein JavaScript)
Browser-nativ, 2026 fully supported:
/* globals.css */
@keyframes fade-in-up {
from {
opacity: 0;
transform: translateY(40px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.scroll-reveal {
animation: fade-in-up linear both;
animation-timeline: view();
animation-range: entry 0% entry 40%;
}
// Verwendung — kein Client Component nötig!
<h2 className="scroll-reveal">
Keine JavaScript-Abhängigkeit. Reines CSS. 60fps garantiert.
</h2>
Das ist die performanteste Option. Kein Hydration-Overhead, kein JavaScript-Bundle-Gewicht.
Performance Best Practices
Animationen, die nicht animiert werden sollten:
width,height,margin,padding— triggert Layout-Recalculationbackground-colordirekt (besser:opacityauf einem Pseudo-Element)box-shadow(teuer — besser:filter: drop-shadowoderopacityTrick)
Animationen, die immer safe sind:
transform: translateX/Y/Ztransform: scale/rotateopacity
Diese nutzen die GPU-Compositing-Layer und blockieren nie den Main Thread.
Accessibility: prefers-reduced-motion
Pflicht. Nicht optional.
// hooks/useReducedMotion.ts
import { useReducedMotion } from 'framer-motion'
// Framer Motion hat das built-in:
// Setze reduceMotion: 'user' in motion.config
// Oder manuell:
const prefersReduced = useReducedMotion()
const variants = prefersReduced ? staticVariants : animatedVariants
Oder via CSS:
@media (prefers-reduced-motion: reduce) {
.scroll-reveal {
animation: none;
opacity: 1;
transform: none;
}
}
Das fertige Bild: Was möglich ist
Kombiniert man diese Techniken, entsteht eine Seite, die:
- Beim ersten Scroll ein Video-Hero mit Text-Emergence zeigt
- Beim weiteren Scrollen Hexagone in einem Orbit-System aufbaut
- Features mit Mouse-Tracking Spotlight-Karten präsentiert
- Statistiken mit animierten Zählern unterstützt
- Auf jedem Gerät — von iPhone SE bis 4K-Monitor — flüssig läuft
Das ist kein Showcase-Projekt. Das sind produktionsreife Techniken, die Fame4You in jedem Kundenprojekt einsetzt. Mehr erfahren.
Fazit
Apple-Style Animationen sind keine Magie. Sie sind eine Kombination aus durchdachtem Timing, modernen Browser-APIs und dem Verständnis, dass jede Bewegung einen Zweck haben muss.
Next.js + Framer Motion ist der State-of-the-Art Stack für 2026. CSS Scroll-Driven Animations ergänzen ihn mit nativer Performance.
Wer das verstanden hat, baut keine Websites mehr. Er baut Erlebnisse.
Weiterführend: Cinematic Website Design für Mittelständler · AI Hero Videos: Kie.ai vs. Sora vs. Runway · Fame4You Services
