Reserve the embed slot, use a facade, and stop chasing layout shifts inside the YouTube player.
An article template injects a YouTube iframe. The box starts at zero height, expands when the player paints, and the byline plus related stories jump. Field CLS moves. Lab Lighthouse flags the same pattern when the embed sits in the viewport.
Most of that shift is on the parent page, not inside the player. The iframe loads from youtube.com or youtube-nocookie.com, so you cannot pin captions or related-video rails. What you can fix is the slot: a stable 16:9 wrapper, a facade or lite-youtube pattern that creates the iframe only after a click or consent gate, and lazy load that never expands an unsized box.
Teams that chase player UI inside the cross-origin document waste weeks. Teams that reserve space, wrap oEmbed through one component, and watch CLS on the article URL usually recover the metric.
Wrap every embed in an aspect-ratio box before the iframe exists.
Prefer a facade or lite-youtube for multiple videos so player JS stays off the critical path.
Pair loading="lazy" with a reserved height; lazy alone still jumps.
Keep the video slot height stable across consent states so CMP dismissals do not recreate the shift.
Read more: cross-origin YouTube embeds and CLS