PageSpeed Matters
    PageSpeed Matters
    Framer Guide

    The Ultimate Guide to Framer Speed Optimization: Faster Site, Better Performance in 2026

    Updated February 28, 2026
    32 min Read
    M
    Matt Suffoletto
    P
    PageSpeed Matters Team

    Framer has rapidly grown from a prototyping tool to a full-fledged website builder, powering portfolios, SaaS marketing sites, and agency landing pages with its distinctive animation-first approach. Under the hood, Framer generates React-based websites with automatic code splitting, global CDN hosting, and responsive image handling.

    Yet the average Framer site scores 40–55 on mobile Lighthouse. The gap comes from Framer's animation-forward philosophy: complex motion design that looks stunning on desktop but overwhelms mobile CPUs, custom code components importing heavy external libraries, autoplaying video backgrounds, and the baseline JavaScript cost of React hydration on every page.

    The business case for optimizing Framer sites is straightforward: Google uses Core Web Vitals as a ranking signal, and most Framer sites fail at least one CWV threshold on mobile. Fixing this directly improves organic search visibility. For SaaS and agency sites, faster pages also mean higher conversion rates — every 100ms of improvement can increase conversions by up to 1%.

    This guide consolidates our experience optimizing Framer sites into a single resource: animation performance tuning, custom code component optimization, image and video pipelines, React rendering efficiency, and passing all three Core Web Vitals.

    Need expert help?

    TL;DR — Quick Summary

    Framer sites are slow because of animation complexity (GPU-accelerated properties are fine, layout properties are not), React hydration overhead (baseline JS cost on every page), custom code components importing heavy libraries, and oversized media assets. Quick wins: 1) Only animate transform and opacity (GPU-composited, 60fps). 2) Limit simultaneous animated elements to 5–8 per viewport. 3) Disable scroll animations on mobile. 4) Keep custom components under 50KB — use React.lazy() for heavy ones. 5) Replace background videos with poster images + deferred video load. 6) Optimize source images before upload (2x display dimensions max). 7) Preload the LCP image on each page. 8) Remove unused custom code components from pages.

    Key Takeaways

    • Framer generates React-based websites — the baseline JavaScript cost of React hydration affects every page.
    • GPU-accelerated animations (transform, opacity) run at 60fps with minimal CPU impact; layout animations (width, height, padding) are expensive.
    • Scroll-triggered animations are the most performance-intensive type — limit to 3–5 per page and disable on mobile.
    • Custom code components are React components — standard React performance rules (memoization, lazy loading, minimal dependencies) apply.
    • Mobile devices have 3–5x less animation processing power — what's smooth on desktop can be janky on a phone.
    • Framer's automatic image optimization handles format conversion but depends on source image quality and dimensions.
    • Reducing animation complexity by 30% often improves perceived quality by focusing user attention on fewer, more impactful motions.

    Why Framer Sites Load Slowly

    Framer's architecture creates beautiful, animated websites — but four factors commonly degrade performance:

    1. Animation JavaScript overhead: Framer uses Framer Motion under the hood for animations. Each animation adds to the JavaScript bundle and requires execution during rendering. Scroll-triggered animations require continuous calculation during scrolling. Mouse-following animations fire on every cursor movement. Complex multi-stage animation sequences compound CPU usage.

    2. React hydration cost: Framer generates React-based pages. Every page load includes React hydration — the process where React attaches event listeners and state management to server-rendered HTML. This baseline JavaScript cost (typically 50–100KB gzipped for React + Framer runtime) executes on every page regardless of complexity.

    3. Custom code component weight: Custom code components in Framer are React components that can import external npm libraries. Each imported library adds to the page bundle. A component importing Chart.js, Three.js, or a map library can add 100KB–1MB of JavaScript.

    4. Media asset decisions: Autoplaying background videos (2–10MB), oversized hero images, and unoptimized media uploads. Framer handles image optimization automatically (WebP, responsive sizing), but source quality and video decisions remain in the creator's control.

    Animation Performance Mastery

    Animation is Framer's core strength — and the primary area where performance optimization matters most.

    GPU vs. CPU animations: Browser rendering has two paths:

    • GPU-accelerated (compositor-only): `transform` and `opacity` — these run at 60fps with minimal CPU impact because they're handled by the GPU compositor thread
    • CPU-dependent (layout/paint): `width`, `height`, `padding`, `margin`, `background-color`, `border-radius` — these trigger layout recalculation and repainting on the main thread

    In Framer, always use variants that animate `transform` (scale, translate, rotate) and `opacity`. Never animate layout properties for smooth performance.

    Scroll animation optimization: Scroll-triggered animations are the most expensive because they execute continuously during scrolling:

    1. 1Limit scroll-animated elements to 3–5 per section
    2. 2Use `Intersection Observer`-based appear animations instead of continuous scroll-position tracking
    3. 3Disable scroll animations on mobile — mobile CPUs have 3–5x less processing power
    4. 4Use CSS `scroll-snap` for scroll-based effects where possible (zero JS cost)
    5. 5Avoid parallax effects on mobile entirely

    Animation complexity budget: Reducing animation complexity by 30% often improves perceived quality. Users can't process 15 simultaneously animating elements — 5–8 well-timed, purposeful animations create more visual impact and perform dramatically better.

    Timing optimization:

    • Use shorter durations on mobile (200–300ms vs. 400–600ms on desktop)
    • Stagger animations by 50–100ms instead of running all simultaneously
    • Use `ease-out` curves for enter animations (fast start, gentle finish — feels responsive)
    • Avoid `spring` animations with low damping values (they oscillate for too long, causing extended GPU usage)

    `willChange` hints: Use `will-change: transform` on elements that will animate, but sparingly. Each `willChange` element creates a new compositor layer, consuming GPU memory. Too many layers (20+) can actually hurt performance.

    Custom Code Component Optimization

    Custom code components in Framer are React components — all standard React performance rules apply.

    Bundle size management:

    • Keep each custom component under 50KB (compressed)
    • Audit external dependencies — each `import` from npm adds to the bundle
    • Use native browser APIs instead of libraries where possible (e.g., `IntersectionObserver` instead of a scroll library)
    • For heavy libraries (Three.js, Chart.js, map libraries), use `React.lazy()` with `Suspense` to load only when the component enters the viewport

    Rendering efficiency:

    • Use `React.memo()` for components that receive the same props frequently
    • Implement `useMemo()` for expensive calculations (data transformations, filtered lists)
    • Use `useCallback()` for event handlers passed to child components
    • Avoid inline object/array creation in JSX — it creates new references on every render, defeating memoization

    Data fetching patterns:

    • Fetch data in `useEffect()`, never during render
    • Cache API responses (use SWR pattern: stale-while-revalidate)
    • Implement loading states so the component doesn't block page rendering
    • Lazy-load data for below-fold components — only fetch when the component enters the viewport
    • Debounce user-input-driven API calls

    Common performance anti-patterns:

    • Importing an entire library for one function: `import _ from 'lodash'` (500KB) vs. `import debounce from 'lodash/debounce'` (2KB)
    • Re-rendering on every scroll event without throttling/debouncing
    • Creating new objects/arrays in render that trigger unnecessary child re-renders
    • Not cleaning up event listeners, intervals, or subscriptions in `useEffect` cleanup

    Struggling with Framer speed?

    Our team optimizes Framer sites for real-world results. Request an audit.

    Image and Video Pipeline

    Framer's automatic image optimization is solid — WebP conversion, responsive sizing, and CDN delivery. But decisions at creation time determine effectiveness.

    Image optimization:

    • Upload source images at 2x maximum display width (for retina), not larger
    • For a full-width hero (max 1440px display): upload at 2880px wide
    • For card thumbnails (max 400px display): upload at 800px wide
    • Framer generates responsive variants automatically — larger sources mean larger variants
    • Preload the LCP image on each page template

    Video optimization (critical for Framer sites): Framer sites frequently use background videos for visual impact. Each autoplaying video adds 2–10MB+ to page weight.

    Optimize with the facade pattern:

    1. 1Display a static poster image initially (preloaded, optimized)
    2. 2Load the video after the page finishes rendering (use `preload="none"` and `poster` attribute)
    3. 3Use WebM format (30–50% smaller than MP4) with MP4 fallback
    4. 4Set maximum video resolution to 1080p (no benefit from 4K on web)
    5. 5Compress videos aggressively — background videos are decorative, quality loss is less noticeable
    6. 6Consider replacing videos with CSS/animation-based effects for simple motion (gradient shifts, particle effects)

    Lazy loading: Framer supports lazy loading for images. Ensure it's enabled for all below-fold images. Never lazy-load the LCP image (hero image on homepage, main visual on landing pages).

    SVG optimization: Framer supports SVG graphics. For icons and illustrations, SVGs are typically lighter than raster images. Clean SVGs of unnecessary metadata, redundant groups, and excessive precision using tools like SVGO.

    Passing Core Web Vitals on Framer

    Google's Core Web Vitals directly affect search rankings. Framer sites have specific optimization patterns for each metric.

    Fixing LCP (target: ≤ 2.5s):

    1. 1Preload the hero image/video poster with `fetchpriority="high"`
    2. 2Reduce the Framer runtime JavaScript that must execute before content renders
    3. 3Replace background videos with static images + deferred video loading
    4. 4Optimize source image dimensions (upload at 2x display, not 4x or larger)
    5. 5Minimize custom code components that block above-fold rendering

    Fixing INP (target: ≤ 200ms):

    1. 1Replace JavaScript-driven animations with CSS transitions where possible
    2. 2Defer heavy custom code components with `React.lazy()`
    3. 3Reduce third-party scripts (analytics, chat, marketing tools)
    4. 4Optimize event handlers in custom components (debounce/throttle)
    5. 5Break Long Tasks with `requestIdleCallback` or `scheduler.yield()`

    Fixing CLS (target: ≤ 0.1):

    1. 1Set explicit dimensions on all images and media elements
    2. 2Use `font-display: swap` with size-adjusted fallback fonts
    3. 3Reserve space for dynamically loaded content (custom components, embeds)
    4. 4Only animate `transform` and `opacity` — never width/height/padding
    5. 5Avoid late-loading content that shifts the page layout

    Monitoring: Use PageSpeed Insights for combined field + lab data. Check Google Search Console CWV report weekly. Allow 28 days for CrUX field data to reflect improvements.

    Ongoing Speed Monitoring

    Framer sites are easy to build and iterate on — which means performance can degrade quickly as animations and components are added.

    Weekly (5 minutes):

    • Check Search Console Core Web Vitals report
    • Quick PageSpeed Insights test on homepage

    Monthly (20 minutes):

    • Profile animations on mobile (Chrome DevTools Performance tab during scroll)
    • Audit custom code components for unused imports
    • Check for new third-party scripts added
    • Verify image optimization on recently published pages

    Quarterly (1–2 hours):

    • Full animation audit — reduce, simplify, or remove underperforming animations
    • Custom code component bundle analysis
    • Video asset review (can any be replaced with image + CSS animation?)
    • Competitive benchmarking against top 3 competitors
    • Performance budget check: < 1.5MB page weight, < 150KB custom JS, < 8 animated elements per viewport

    Performance budgets:

    • Total page weight: < 1.5MB (without background video)
    • Custom component JavaScript: < 50KB per component
    • Animated elements per viewport: < 8
    • Scroll-triggered animations per page: < 5
    • LCP: ≤ 2.5s, INP: ≤ 200ms, CLS: ≤ 0.1

    Thresholds & Benchmarks

    MetricGoodNeeds ImprovementPoor
    LCP (Largest Contentful Paint)≤ 2.5s2.5–4.0s> 4.0s
    INP (Interaction to Next Paint)≤ 200ms200–500ms> 500ms
    CLS (Cumulative Layout Shift)≤ 0.10.1–0.25> 0.25
    Mobile Lighthouse Score80+50–79Below 50
    Total Page Weight< 1.5MB1.5–3MB> 3MB
    Animated Elements Per Viewport< 88–15> 15
    Custom Component Bundle< 50KB50–150KB> 150KB
    Scroll Animations Per Page< 55–12> 12

    Key Measurement Tools

    Both
    PageSpeed Insights

    Field + lab data combined. Test each page template separately — animation-heavy pages perform very differently from content pages.

    Lab
    Chrome DevTools Performance

    Profile during scrolling to identify animation-caused Long Tasks. Look for Framer Motion execution in the flame chart. Rendering tab shows paint regions.

    Lab
    Chrome DevTools Rendering

    Enable 'Paint flashing' to visualize which areas repaint during animations. Green flashes indicate repaints — GPU-composited animations should show no paint flashing.

    Lab
    WebPageTest

    Filmstrip view shows exactly when content appears and animations begin. Test on Moto G Power for realistic mobile animation performance.

    Lab
    Lighthouse Performance Tab

    The 'Avoid excessive DOM size' and 'Reduce JavaScript execution time' audits are most relevant for Framer sites.

    Looking for speed help?

    Step-by-Step Optimization Guide

    1

    Audit animations for GPU properties

    Review every animation in your Framer project. Ensure all animations use only transform and opacity properties (GPU-accelerated). Replace any animations targeting width, height, padding, or margin with transform-based equivalents (e.g., scaleX instead of width).

    2

    Reduce scroll animation count

    Limit scroll-triggered animations to 3–5 per page section. Disable complex scroll animations on mobile breakpoints. Replace continuous scroll-position tracking with Intersection Observer-based appear animations. Remove parallax effects on mobile.

    3

    Optimize custom code components

    Audit each custom component's bundle size. Remove unused npm imports. Use React.lazy() with Suspense for components over 50KB. Implement React.memo() for components with stable props. Cache API responses with SWR patterns.

    4

    Build media pipeline

    Upload images at 2x display dimensions (not larger). Replace autoplaying background videos with poster images + deferred video loading. Use WebM format with MP4 fallback. Compress videos to 1080p max. Preload the LCP image on each page template.

    5

    Optimize font loading

    Use font-display: swap to prevent invisible text. Preload the primary font file. Subset fonts to include only needed character ranges. Use size-adjusted fallback fonts to prevent layout shifts.

    6

    Defer third-party scripts

    Audit all third-party scripts (analytics, chat, marketing tools). Implement facade patterns for chat widgets. Consolidate tracking into GTM with delayed triggers. Remove any unused analytics or marketing scripts.

    7

    Pass Core Web Vitals

    Verify LCP ≤ 2.5s with hero image preloading and video facade patterns. Fix INP ≤ 200ms by reducing animation complexity and deferring custom components. Fix CLS ≤ 0.1 by setting image dimensions and using transform-only animations.

    8

    Set up monitoring and budgets

    Check Search Console CWV weekly. Profile mobile animation performance monthly. Set budgets: < 1.5MB page weight, < 50KB per custom component, < 8 animated elements per viewport. Re-test after every major design change.

    Want us to handle these optimizations?

    Request an audit for your Framer site and see results in days, not months.

    Need help with Framer speed?

    Our team specializes in Framer performance optimization. Request an audit and see exactly how much faster your site could be.

    Frequently Asked Questions

    Ready to Speed Up Your Site?

    Stop reading guides and start seeing results. Request an audit from our team today.

    Speed performance gauge showing optimized score