Do Pop-ups Hurt Core Web Vitals? CLS, INP and Overlays Explained
Store owners often hear that pop-ups “hurt Core Web Vitals.” The honest answer is that it depends on how the pop-up is put on the page. A banner that floats over the content behaves very differently from one that pushes the content down, and both are measured differently from the tap on the close button. This guide explains how Cumulative Layout Shift (CLS), Interaction to Next Paint (INP) and Largest Contentful Paint (LCP) treat pop-ups, which formats are risky, and how to check your own pages.
Updated

The short answer
A pop-up drawn on top of the page — a modal, a floating box, or a bar that overlays the header — usually does not cause layout shift, because nothing on the page moves. A pop-up inserted into the page — a bar that pushes the whole site down, or a banner injected between paragraphs — moves content that was already there, and that is exactly what CLS measures. Separately, every tap on a pop-up is an interaction that INP can measure, and a large pop-up image that appears early can become the page’s LCP element.
| Pop-up behavior | CLS | INP | LCP |
|---|---|---|---|
| Overlay (modal, floating box, overlay bar) | Low risk: page content does not move | Taps on it are measured like any other tap | Possible if a large image appears before the visitor interacts |
| Pushes content down (inserted bar, injected banner) | High risk, especially near the top of the page | Same as above | Same as above |
| Animated entrance | Low risk if animated with transform; higher if it changes size or position properties | Heavy animation can delay the next frame | — |
Core Web Vitals in one table
Google’s web.dev defines three Core Web Vitals and a “good” threshold for each. It recommends measuring them at “the 75th percentile of page loads, segmented across mobile and desktop devices” (web.dev, Web Vitals). INP replaced First Input Delay and, per the same page, “became a stable Core Web Vital metric in 2024.”
| Metric | What it measures | Good | Poor |
|---|---|---|---|
| LCP — Largest Contentful Paint | Loading: when the largest image, text block or video in the viewport is rendered | 2.5 seconds or less | Over 4.0 seconds |
| INP — Interaction to Next Paint | Responsiveness: how quickly the page responds to clicks, taps and key presses | 200 milliseconds or less | Over 500 milliseconds |
| CLS — Cumulative Layout Shift | Visual stability: how much visible content moves unexpectedly | 0.1 or less | Over 0.25 |
Thresholds are from web.dev’s articles on LCP, INP and CLS. As for search, Google states that “Core Web Vitals are used by our ranking systems,” and also that good scores do not guarantee “that your pages will rank at the top of Google Search results” (Google Search Central). They are worth getting right mostly because they describe what visitors actually feel.
How CLS is measured, and why it matters for pop-ups
Four details in web.dev’s CLS article decide whether a pop-up counts against you (web.dev, CLS):
- Only existing content moving counts. “Layout shifts only occur when existing elements change their start position.” Adding a new element is not a shift by itself; it becomes one only if it moves other visible elements.
- CLS is the worst burst, not the total. Shifts that happen close together are grouped into a session window, “with less than 1-second in between each shift and a maximum of 5 seconds for the total window duration.” CLS reports the largest window.
- Shifts right after a tap or click are excluded. “Layout shifts that occur within 500 milliseconds of user input will have the hadRecentInput flag set” and are not counted.
- Scrolling is not that kind of input. The article says continuous interactions such as “scrolls, drags, or pinch and zoom gestures are not considered ‘recent input’.” A shift triggered by scrolling still counts.
Put together, these rules explain the whole topic. A modal that appears over the page adds an element but moves nothing, so it is not a layout shift. A bar that slides in at the top and pushes the page down moves everything below it, so it is. And because pop-ups are usually triggered by time or by scrolling — not by a click — that shift does not get the 500-millisecond exemption. A scroll-triggered bar that pushes content down is close to the worst case: it moves content while the visitor is reading, and the trigger itself is excluded from “recent input.”
The opposite case is also useful to know. If a visitor taps a “Show offer” button and a panel opens inline within half a second, that shift is expected and excluded. CLS penalizes surprise, not change.
Overlay versus content-pushing: format by format
| Format | Typical implementation | Layout shift? | Notes |
|---|---|---|---|
| Modal | A fixed layer over the whole page with the box in the middle | No; the page underneath stays where it was | The main risk is user experience and intrusive interstitials, not CLS |
| Floating box | A fixed box in a corner or at an edge | No | Can cover buttons or navigation on small screens |
| Bar, overlay style | A fixed strip on top of the header or at the bottom of the screen | No | Hides whatever is under it while it is open |
| Bar, push style | Inserted at the top of the page, or space added above the content | Yes, if it appears after the page has rendered | The shift covers the whole visible page |
| Inline banner | Injected between existing elements, for example after the first paragraph | Yes, unless space was reserved in advance | Smaller than a top bar, but still moves everything below it |
web.dev’s guide to optimizing CLS describes the same split for notices such as cookie banners: either “reserve sufficient space in the viewport for it in advance (for example, using a placeholder or skeleton UI)” or “ensure the element is not part of the document flow by overlaying the content where this makes sense.” It also warns that “dynamically injected content closer to the top of the viewport usually causes greater layout shifts” (web.dev, Optimize CLS).
If you want a bar that pushes content
There are good reasons to want a push-style bar: an overlay bar covers your logo, menu or cart icon, which can be worse for visitors than a small shift. If you choose to push content, reduce the impact:
- Show it as early as possible. A bar that appears with the page — before anyone starts reading — disturbs far less than one that drops in after several seconds or partway down the page.
- Reserve the space if your site lets you: a fixed-height slot at the top of the layout that the bar fills, so nothing moves when it arrives.
- Keep its height stable. A bar whose text wraps differently after a web font loads, or that grows when a countdown starts, shifts the page a second time.
- Consider the bottom of the screen. A bar fixed to the bottom of the viewport overlays content instead of pushing it, and rarely covers the header.
- Avoid scroll triggers for push bars. Since scrolling is not “recent input,” a push bar triggered by scrolling is counted every time.
When the bar is closed, the page moves back up. A close that follows a tap usually falls within the 500-millisecond window and is excluded, but a bar that disappears on its own after a timer is not, so avoid auto-dismissing push bars.
Animations: transform is safe, layout properties are not
Slide-in and zoom effects are popular for pop-ups. How they are built matters. web.dev’s CLS article recommends using transform: scale() instead of changing height or width, and transform: translate() instead of changing top, right, bottom or left. The optimization guide explains that “composited animations using translate can’t impact other elements, and so don’t count toward CLS” (web.dev, Optimize CLS).
For an overlay pop-up this is mostly about smoothness, since nothing behind it moves anyway. For anything in the document flow — a push bar, an inline banner, an accordion — animating height is a layout shift on every frame. The CLS article also asks you to respect the prefers-reduced-motion setting, which is good practice for any entrance animation.
Pop-ups and INP
INP measures “a page’s overall responsiveness to user interactions,” counting mouse clicks, taps and key presses. web.dev breaks each interaction into three parts: “the input delay,” “the processing duration” and “the presentation delay,” ending when the next frame is shown (web.dev, INP). Scrolling and hovering are not counted.
A pop-up adds interactions to the page: tapping the close button, tapping outside a modal, typing an email address, pressing submit. Each one is measured like any other. Common ways a pop-up makes them slow:
| Problem | Which phase it affects | What helps |
|---|---|---|
| The main thread is busy with other scripts when the visitor taps | Input delay | Fewer and lighter third-party scripts; don’t stack several pop-up or chat tools on one page |
| The click handler does a lot of work before updating the screen | Processing duration | Close or show feedback first, then send data in the background |
| A huge pop-up (large DOM, heavy effects) has to be drawn | Presentation delay | Simple markup and modest effects |
| Validation runs on every keystroke and re-renders the form | Processing and presentation | Validate lightly while typing; do the full check on blur or submit |
web.dev’s INP optimization guide adds that breaking up long tasks — “yielding” to the main thread — keeps work from blocking the next frame, and that large DOMs “require more work to render than small DOMs” (web.dev, Optimize INP). The practical rule for a pop-up: the close button should make the pop-up disappear on the very next frame. If closing feels laggy on a mid-range phone, that is an INP problem worth fixing.
Can a pop-up become the LCP element?
Yes, in some cases. LCP looks for the largest image, text block or video in the viewport, and web.dev explains that when a larger element is rendered later, “a new PerformanceEntry will also be reported.” Crucially, “the browser will stop reporting new entries as soon as the user interacts with the page (via a tap, scroll, or keypress)” (web.dev, LCP).
So a pop-up with a large image that appears immediately on load, before the visitor does anything, can be picked as the largest element. If that image is slow to load, your LCP becomes the pop-up’s load time instead of your hero image’s. The same article notes that Chromium ignores “elements that cover the full viewport, that are likely considered as background rather than content,” so a full-screen dimmed overlay is not the concern — the image inside it may be.
- Delay the pop-up until after a few seconds or some scrolling. Once the visitor has scrolled or tapped, LCP stops updating, so the pop-up can’t replace the LCP element.
- Keep pop-up images small in file size and dimensions, especially on mobile.
- Don’t let the pop-up compete with the page for the first seconds of loading. The content the visitor came for should load first.
Why your lab score may not show the problem
Many people test a page in a lab tool, see a good CLS score, and conclude the pop-up is fine. web.dev explains why that can be misleading: “CLS measured in the lab only considers layout shifts that occur above the fold and during load,” whereas in the field “CLS considers all unexpected layout shifts that occur throughout the lifespan of the page.” Shifts that happen after scrolling “often won’t be caught in a lab test.” For INP, lab tests “cannot accurately predict when users will choose to interact with a page” (web.dev, lab and field data).
A pop-up that appears after 10 seconds or at 50% scroll is exactly the kind of thing a lab load test can miss. Use field data instead. Search Console’s Core Web Vitals report shows “how your pages perform, based on real world usage data,” taken from the Chrome UX Report, with mobile and desktop listed separately and URLs grouped into pages with similar experience (Search Console Help). Low-traffic pages may not have enough data to appear, so expect gaps on a small store.
Testing a pop-up yourself
- Note the trigger and format of each active pop-up: when it appears, where, and whether it overlays or pushes.
- Open the page on a phone and watch for movement when the pop-up appears and when it closes. If the text you were reading jumps, that is a layout shift.
- Repeat the trigger by hand: wait the configured seconds or scroll to the configured depth, since lab tools won’t.
- Tap close on a mid-range phone and check that it disappears immediately.
- Compare field data before and after launching a pop-up in Search Console, keeping in mind that the report needs time and traffic to update.
- Check the rest of the page’s stack. If you run several third-party tools — chat, reviews, pop-ups — each adds script work that can slow interactions.
Core Web Vitals are not the whole story
A pop-up can score perfectly on CLS and still be a poor experience. A full-screen modal over a page someone just arrived on moves nothing, so CLS ignores it, but Google’s separate guidance asks you not to “obscure the entire page with interstitials” and to “use banners that take up only a small fraction of the screen” instead (Google Search Central). Treat CWV and intrusive interstitials as two checks: does the pop-up move the page, and does it block the page?
How marketingLABO inserts pop-up banners
If you use marketingLABO, here is how its banners behave in these terms. The tag you add to the <head> of each page loads the banner after the page has loaded and adds it at the end of the page. Modals, floating boxes and bars are displayed in a fixed layer over the page, so showing them or animating them in does not move your content.
| Setting | Effect on layout | CWV-friendly use |
|---|---|---|
| Modal | Overlays the page | Use a trigger such as after N seconds or at N% scroll, and keep the box small on phones |
| Floating | Overlays the page at the chosen position | Check that it doesn’t cover key buttons on mobile |
| Bar at the bottom | Overlays the bottom of the screen | A low-risk default for announcements |
| Bar at the top, floating | Overlays the header | No layout shift, but covers whatever is under it |
| Bar at the top, inserted as a block | Pushes the header and page down by the bar’s height | Prefer “show immediately”; avoid scroll triggers |
The block option for top bars exists for sites where covering the header is the bigger problem. If you use it, follow the push-bar advice above. Separate desktop and mobile images, device targeting (all, mobile only or desktop only) and the show-immediately / after-N-seconds / scroll-depth triggers help you keep large creatives off small screens and out of the first seconds of loading. The Free plan includes one pop-up banner along with analytics and heatmaps; see pricing for Light and Standard limits, or create a free account.
For what to put inside the pop-up, see Email Sign-up Pop-ups, Free Shipping Banners and Countdown Timer Pop-ups.
Frequently asked questions
Does a modal pop-up count as a layout shift?
Not if it is drawn over the page. A layout shift requires existing elements to change position; adding an overlay doesn’t move anything underneath. It can still be an intrusive interstitial if it covers the page.
Is a sticky announcement bar bad for CLS?
A bar that overlays the screen is not. A bar that is inserted into the page after it renders and pushes content down is, and the later it appears, the worse.
Does closing a pop-up cause a layout shift?
Closing an overlay doesn’t. Closing a push bar moves the page back up, but if it happens within 500 milliseconds of the tap it is excluded. Bars that close on their own are not excluded.
Why does a speed test show a good CLS when my pop-up obviously shifts the page?
A lab test loads the page once and measures during load. A pop-up that appears later or after scrolling is often never triggered. Look at field data, and test the trigger by hand.
Should I remove pop-ups to pass Core Web Vitals?
Usually not. Start by finding out which metric is failing in your field data. If it is CLS, switch push-style bars and injected banners to overlays or reserve their space. If it is INP, look at the total script load and at what happens when people tap. If it is LCP, delay large pop-up images. Removing everything is the last resort, not the first step.
Summary
Pop-ups don’t automatically hurt Core Web Vitals. Overlays — modals, floating boxes and overlay bars — don’t move content, so they don’t add to CLS. Bars and banners that push content down do, especially when they appear late or on scroll. Every tap on a pop-up counts toward INP, so closing should be instant, and a large image shown immediately can become the LCP element. Check field data rather than lab scores, and keep Google’s intrusive interstitial guidance in mind as a separate test.
Sources
- web.dev, “Web Vitals” (last updated October 31, 2024; accessed October 12, 2026): https://web.dev/articles/vitals
- web.dev, “Cumulative Layout Shift (CLS)” (last updated April 12, 2023; accessed October 12, 2026): https://web.dev/articles/cls
- web.dev, “Optimize Cumulative Layout Shift” (last updated February 7, 2025; accessed October 12, 2026): https://web.dev/articles/optimize-cls
- web.dev, “Interaction to Next Paint (INP)” (last updated September 2, 2025; accessed October 12, 2026): https://web.dev/articles/inp
- web.dev, “Optimize Interaction to Next Paint” (last updated September 2, 2025; accessed October 12, 2026): https://web.dev/articles/optimize-inp
- web.dev, “Largest Contentful Paint (LCP)” (last updated September 4, 2025; accessed October 12, 2026): https://web.dev/articles/lcp
- web.dev, “Why lab and field data can be different (and what to do about it)” (last updated July 18, 2022; accessed October 12, 2026): https://web.dev/articles/lab-and-field-data-differences
- Search Console Help, “Core Web Vitals report” (accessed October 12, 2026): https://support.google.com/webmasters/answer/9205520
- Google Search Central, “Understanding Google Page Experience” (last updated September 22, 2026; accessed October 12, 2026): https://developers.google.com/search/docs/appearance/page-experience
- Google Search Central, “Avoid intrusive interstitials and dialogs” (last updated December 10, 2025; accessed October 12, 2026): https://developers.google.com/search/docs/appearance/avoid-intrusive-interstitials
Start free — no credit card needed
Sign up freeMore articles

Accessible Pop-ups: Focus, Keyboard and Screen Reader Basics
How to make accessible pop-ups: the W3C modal dialog pattern, focus handling, Escape to close, close button labels, form labels and contrast, with a test checklist.
Read the article →
Coupon Pop-up or Free Shipping Offer? Choosing the Right Incentive
Coupon pop-up or free shipping? What each offer really costs per order, the break-even math, and which visitors should see which incentive.
Read the article →
Campaign Landing Pages for Small Stores: Structure and Checklist
Landing page best practices for small stores: one goal per page, matching the ad, a section order that works, speed basics from web.dev and a launch checklist.
Read the article →
What Is a Customer Journey? From First Visit to Repeat Purchase
What a customer journey is, the stages from first visit to repeat purchase, the signals you can see at each stage, and which follow-ups are worth automating.
Read the article →
Lead Nurturing for E-commerce: Turning Sign-ups into First Orders
How a small store can nurture new sign-ups toward a first order: stages, objection-handling emails, branches on clicks and return visits, and when to stop.
Read the article →
Newsletters vs. Automated Emails: When to Use Each
Newsletters go out when you decide; automated emails go out when a customer does something. How to choose, combine them, measure each and stay compliant.
Read the article →