Reviewed November 11, 2026
Video Hero LCP: The Poster-Image Facade That Cut 9 Seconds to 2.7
A video hero is the heaviest thing you can put above the fold, and when it is implemented the usual way, it becomes the LCP element and delays the whole page. Video files are significantly heavier than static images, and a video hero or brand story video can add 2 to 5 megabytes to a homepage if loaded directly. YouTube and Vimeo embeds are lighter but still load 500 kilobytes to 1 megabyte of iframe resources, and Lighthouse routinely flags YouTube embeds as adding over a megabyte of unused JavaScript. The fix is the facade pattern: show a lightweight poster image as the initial visible element, let the browser record it as the LCP, and load the video after the main content has rendered, or when the visitor clicks. In one measured example, a hero video without a poster took over 9 seconds to display the first frame; with a poster, LCP dropped to 2.7 seconds.
The video is the LCP element now
A hero section is the large area at the top of a webpage, right below the header, and it is the first section visitors see. When it contains a video, that video is usually the largest visible element, which makes it the LCP element, and the metric is only recorded once the first frame loads. For an MP4, that requires downloading a chunk of the media file, which takes time. Video files are significantly heavier than static images, and when used above the fold they often become the LCP element, directly affecting load time. A video hero or brand story video can add 2 to 5 megabytes to a homepage if loaded directly. YouTube and Vimeo embeds are lighter but still load 500 kilobytes to 1 megabyte of iframe resources, and a single YouTube iframe loads a substantial amount of third-party JavaScript, CSS, and tracking scripts before the video plays. Lighthouse audits routinely flag YouTube embeds as adding over a megabyte of unused JavaScript, and loading a third-party player pulls in megabytes of JavaScript that must be parsed on the main thread, which blocks page rendering. If a user tries to interact with the menu during player initialization, the interaction fails, and the INP metric fails with it.
The poster is the LCP, not the video
The fix is to make the poster image the LCP element instead of the video. Browsers count the poster image, or the first decoded frame if there is no poster, as the LCP candidate, so the fastest possible hero is one where a well-compressed poster paints immediately and the video quietly takes over a moment later. In one measured example, it took over 9 seconds for the browser to display the first video frame without a poster. With a poster image, LCP dropped to 2.7 seconds. The poster should be a real image, WebP or AVIF at the hero's rendered width, usually 1600 to 1920 pixels, landing around 80 to 150 kilobytes, preloaded in the head with fetchpriority high, so the browser starts fetching it before it finishes parsing the DOM. For a native MP4 hosted on Shopify, use the video_tag filter with the poster attribute, which is mandatory if you want the poster to win the LCP metric. One caveat: the video_tag filter does not currently allow passing fetchpriority high directly to the poster it generates, so preload the poster image separately in the head.
The facade, and the mobile rule
The facade pattern is the stronger version of the same idea. Render a static image with the highest priority to serve as the LCP element, and initialize the actual player only when needed, on click or on hover. The iframe is fetched only when the visitor deliberately interacts with the element, so there is zero impact on INP during page load, and the script is only a few bytes. This saves 500 kilobytes to 5 megabytes on initial page load for visitors who never play the video, which is most of them. For below-the-fold videos, set preload to none, so nothing downloads until it is needed, and let an IntersectionObserver attach the source and play when the element is close to the viewport, and pause it when it leaves. Pausing offscreen videos matters as much as the lazy load: a phone decoding four loops at once gets warm, drops frames, and scrolls badly, and none of that shows up in Lighthouse. It shows up in the bounce rate. And on mobile, replace the background video with a static image entirely. Mobile connections are slower, screens are smaller, and most mobile users have data caps, so the visual impact of a background video on a 375 pixel screen is minimal compared to the performance cost. One autoplaying video at a time, a poster that paints immediately, and a video that loads only when someone asks for it: that is the whole pattern.
Related reading
For the background behind “Video Hero LCP: The Poster-Image Facade That Cut 9 Seconds to 2.7”, these earlier guides help: fetchpriority High on the Hero Image: The One Attribute That Moves LCP, Chat Widgets and the Speed Bill: Measuring Third-Party Weight, and Third-Party Scripts Ranked by LCP Cost: The Audit Order That Finds the Worst Offender First.
Frequently asked questions
Why does a video hero hurt LCP so much?
Because the browser identifies the video as the LCP element, and the metric is only recorded once the first frame loads. For an MP4, that requires downloading a chunk of the media file, which takes time. Video files are significantly heavier than static images, and when they sit above the fold they become the largest visible element by definition. A hero video can add 2 to 5 megabytes to a homepage if loaded directly, and a YouTube embed loads 500 kilobytes to 1 megabyte of iframe resources before the video plays.
What is the facade pattern for video?
Show a static thumbnail image instead of the actual video player, and replace it with the real video only when the visitor clicks, or hovers. The poster image becomes the LCP element, it paints immediately, and the heavy video file never loads for visitors who never play it, which is most of them. The facade saves 500 kilobytes to 5 megabytes on initial page load. For a background video, use a lightweight poster image as the initial visible element, then load the video after the main content has rendered.
Should I use a poster image on mobile?
Yes, and on mobile you should go further: replace the background video with a static image entirely. Mobile connections are slower, screens are smaller, and most mobile users have data caps, so the visual impact of a background video on a 375 pixel screen is minimal compared to the performance cost. Export the poster as WebP or AVIF at the hero's rendered width, usually 1600 to 1920 pixels, at around 80 to 150 kilobytes, and preload it in the head with fetchpriority high.
How should I encode a hero video?
Encode for the web, not the screening room. Keep the loop to 8 to 15 seconds, because nobody watches a hero for 20 seconds. Use H.264 in an MP4 container, which plays everywhere, at CRF 28 to 30 on the slow preset, and aim for under 3 megabytes, under 2 is better. Self-hosted video on Shopify has no adaptive bitrate ladder and no CDN, so every visitor gets the same file at the same bitrate. Below the fold, set preload to none, so nothing downloads until it is needed, and pause offscreen videos, because a phone decoding four loops at once gets warm, drops frames, and scrolls badly.