
You’re scrolling a landing page and comparing rows in a pricing table when the whole section suddenly shifts down. An image above finishes loading, and now you’re looking at the wrong row.
That jump happens when your layout doesn’t reserve space for an image upfront. The browser renders the page first, then has to reflow once the image appears — nudging everything below it.
In Framer, you can prevent this with locked aspect ratios, wrapper Frames that define image space ahead of time, and a simple CSS rule for tricky spots like CMS Formatted Text. This guide walks through each method (including CMS images and hero cover layouts) so your pages stay steady while images load.

Unexpected content movement creates real problems for visitors. Here's what actually happens when your layout shifts:
Google tracks this behavior through a metric called Cumulative Layout Shift (CLS) — one of the Core Web Vitals that affects search rankings and user experience scores.
Not every layout shift comes from images. Fonts, third-party embeds, and async scripts can cause similar problems. Here's how to isolate the culprit.
Simulate what visitors on slower networks actually experience:
Focus on hero sections and anything visible without scrolling. If the jump lines up with images popping in, you've found the first thing to fix.
Run your published URL through PageSpeed Insights and look for "unsized image" or CLS warnings. Treat it as a pointer, not a verdict: it can miss obvious shifts, and it can also flag issues that aren't actually noticeable.
Browsers need to know element dimensions before painting the page. Text, buttons, and containers have predictable sizes. Images don't — unless your layout explicitly declares them.
This is the pattern behind most image-driven shifts:
In Framer specifically, you control image dimensions through Fill settings on Frames, the lock icon for aspect ratios, wrapper containers with fixed proportions, and Fit Image for CMS-driven content. Your job is to make the image area predictable before the pixels show up, so the layout never has to resize mid-scroll.
Two primary approaches work in Framer:
Choose based on your layout needs. Both prevent that late resize that pushes everything below.
If you're working with regular image layers (not CMS or Formatted Text), locking the aspect ratio is the fastest path to a shift-free layout. Once you define the ratio, the browser knows exactly how much vertical space to hold — no surprises when the image finishes loading.
Most images in Framer live inside Frames as a Fill layer (Fill → Image in the right panel). You can also drag an image directly onto the canvas, which creates its own layer. Either way, selecting the element reveals sizing controls, fit options (Fill, Fit, Stretch, Tile), and resolution settings. Framer handles optimization behind the scenes — generating responsive srcset/sizes attributes automatically.

When the ratio is locked and Width is set to Fill, Framer adjusts the height automatically to maintain the locked ratio.
This single step — locking the ratio — tells the browser how much room to reserve from the very first paint.
Some designers worry that defining dimensions will make images rigid and break fluid layouts. That's not how it works in Framer. Locking the ratio keeps the proportions fixed while still allowing the width to stretch or shrink with its container — height simply follows along.
What you're aiming for is simple:
When building repeatable components — blog cards, team grids, product tiles — it's often smarter to let a parent Frame control the image area. You define the wrapper's shape once, and every image inside automatically inherits those proportions.
Set the box first (locked ratio), then let the image fill that box. The box is what keeps the layout steady.
This keeps the wrapper's proportion stable across breakpoints.
Because the wrapper's shape is fixed from the first paint, loading the image can't push content around.

Hero sections are where shifts hurt the most, because people are about to click, scroll, or read the headline.
As long as the hero Frame has a real height (min-height or a locked ratio), the image loading won't change the section's footprint.

On CMS pages, content can fight your layout: editors will upload whatever looks good to them. One editor uploads a wide landscape shot; another adds a tall portrait. Without intervention, your carefully designed grid turns into a shifting mess where cards expand unpredictably.
Framer doesn't rely on strict enforcement for every workflow, so the practical move is to document recommended image sizes/ratios right inside your CMS setup, so editors upload images that match your layout. Framer explicitly suggests adding guidelines like recommended image sizes when structuring CMS collections.
If your list/grid must look uniform:
A locked aspect ratio in a collection list makes all CMS images inherit the same ratio, keeping layout consistent.
If you actually want each CMS image to keep its natural proportions (and avoid "manual ratio matching"), use Fit Image.
Fit Image is a sizing option that adapts automatically to the width or height of uploaded images, designed specifically for dynamic content like CMS.
Use it when:
When you have multiple images per item, you typically want one of these strategies:
For clean, aligned galleries, stick with uniform wrappers — every image gets the same dimensions. If you prefer a more organic, Pinterest-style arrangement where images vary in height, go with Fit Image instead. Just know that variable-height layouts won't feel as "locked in" visually, which is fine if that's the aesthetic you're after.
When your posts use CMS Formatted Text, the most reliable way to keep the layout steady is to treat “layout-critical” images as structured content — not inline editorial content. Instead of inserting key visuals inside Formatted Text, place them in a dedicated CMS Image field (for example, Featured Image) and render them in your template inside a wrapper Frame with a locked aspect ratio. This way, the wrapper reserves space from the first paint, and the content below won’t move when the image finishes loading.
If you need advanced rules for inline images inside Formatted Text (consistent sizing, custom behavior, and per-post control), our team can implement a tailored solution at BRIX Templates.
Automated scores only tell part of the story. Run these three quick checks to confirm your fix actually works:
If your layout holds steady through all three, your implementation is solid.
Once manual testing looks good, run PageSpeed Insights to check whether CLS warnings have decreased. Look for reduced "unsized image" flags in the diagnostics. But remember: what matters most is what users actually see, not the score itself.
Here's how to fix the most common problems:
"Avoid large layout shifts" still appears:
Images stopped behaving responsively:
Hero cover image still causes layout shift:
CMS images still jump because of varying upload ratios:
On first paint, the browser lays out your page without knowing the final size of each image. When the image appears, it recalculates the space — which can push anything below it. In Framer, you solve this by locking aspect ratios on image layers (using the lock icon), creating wrapper Frames with fixed proportions, or applying CSS to CMS Formatted Text images. Each method tells the browser exactly how much room to hold.
Layout shift is what you see — content jumping around as elements load or resize. Cumulative Layout Shift (CLS) is Google's way of measuring that movement for Core Web Vitals. They're related but not identical: a page might have a low CLS score but still show annoying micro-shifts, or vice versa. Prioritize fixing what users actually notice, then check your CLS metrics as a secondary indicator.
Lock the ratio directly on an image layer when that image has a consistent, predictable size in your design — like a product photo that's always 1:1. Use a wrapper Frame when you're building components that need to accommodate different images with the same layout footprint, such as blog cards or portfolio grids where you want uniform appearance regardless of source dimensions. For CMS-heavy projects, wrappers tend to be more reliable.
You have two options: use locked-ratio wrappers with Fill mode to force consistency (some cropping will occur), or use Fit Image to let each image keep its natural proportions. If uniform grids matter more than showing full images, go with wrappers. If showing complete images matters more, use Fit Image and accept variable heights.
Not by default. The supported path for styling images in CMS Formatted Text is custom CSS in the head. See Framer's guide on centering Formatted Text images. A code component/override is mainly relevant if you need to enable lazy loading for Formatted Text images (since they're an exception to Framer's automatic lazy loading). Learn more about lazy loading in Framer.
There's no single "best" ratio — it depends on your design. 16:9 works well for hero images and video thumbnails. 4:3 is great for blog featured images. 1:1 (square) is ideal for profile photos and product grids. The key is consistency: pick a ratio that works for your layout and stick with it across your site.
Yes, for most cases. Setting locked aspect ratios on image layers or wrapper Frames is entirely visual — no code required. The only scenario that requires CSS is CMS Formatted Text images, where you can't wrap individual images from the canvas. For everything else, Framer's built-in controls handle it.
The most reliable test is visual: publish your site, open it in an incognito window with network throttling set to Slow 3G, and watch if content jumps as images load. If nothing moves, your fix works. PageSpeed Insights and Lighthouse can provide additional data, but real-world observation is more reliable than automated scores.
The most common cause is that the hero container doesn't have a defined height before the image loads. Make sure your hero Frame has either a min height or a locked aspect ratio set. Then apply the image as a Fill on that Frame with Fill type selected. This ensures the container reserves space regardless of image load timing.
Framer optimizes images and generates responsive srcset attributes, but it doesn't automatically prevent layout shift. You need to define stable dimensions through locked aspect ratios or wrapper Frames. The optimization Framer provides helps with loading speed and file size — you're responsible for layout stability.
The fastest way to kill layout shift in Framer is to make image space predictable from the start — before any image finishes loading.
Here's the quick breakdown by image type:
Stable pages aren't about chasing metrics — they're about giving visitors a smooth experience where nothing moves unexpectedly. Nail that, and better performance scores come as a side effect.
For complex implementations requiring custom conditional logic, advanced CMS configurations, or performance optimization across your entire Framer site, our Framer development team can create sophisticated solutions tailored to your specific requirements.

Click-to-load embeds in Framer with a Code Override: load Calendly/Google Maps only on click, with code, setup, and DevTools checks.

Fix invisible text during font loading in Webflow using font-display for custom fonts, Google Fonts, and icon fonts.

Step-by-step guide to fix image layout shift in Webflow, covering hero sections, CMS content, and Rich Text blocks to stop jumps.