Skip to main content
Regras para sections com vídeo rápidas no mobile e desktop. Foco no que o autor do tema controla em React.

Princípios

  1. Poster primeiro — LCP deve ser imagem estática (poster / image), não o stream.
  2. Nunca carregar todos os vídeos — grids e carrosséis iniciam reprodução sob demanda.
  3. Um stream ativo — em carrosséis, reels e grids, só um vídeo tocando por vez.
  4. Reservar espaço — aspect-ratio ou dimensões explícitas (evita CLS).
  5. Destruir ao desmontar — cleanup no useEffect (pause, remover src, load()).

LCP (Largest Contentful Paint)

❌ Hero autoplay sem poster
❌ Vídeo acima da dobra sem altura reservada

CLS (Cumulative Layout Shift)

  • Portrait (Reels): aspectRatio: '9 / 16'.
  • objectFit: 'cover' no vídeo dentro do container com ratio fixo.

Preload


Lazy loading em React

Poster

Vídeo — play no clique

IntersectionObserver


Carrossel e slider

  • Slide ativo: pode reproduzir (muted, loop).
  • Slides ocultos: pause(), preload="none".
  • Na troca: pausar anterior antes de iniciar o próximo.
  • Nunca autoplay em todos os slides.

Carrossel com vídeo (HLS)

Sections com vários <video> da biblioteca (Reels, marquee) exigem regras extras:
  1. Separe efeito de setup do HLS ([src]) do efeito de play/pause ([shouldPlay]). Recriar Hls.js a cada mudança de visibilidade causa loop de requisições seg_*.mp4.
  2. Marquee com autoplay: use playWhenVisible={false} — a animação CSS torna o IntersectionObserver instável.
  3. Um snippet CorvexVideo com useCorvexVideoPlayback — não duplique fetch de /playback em cada block.
  4. Teste na loja publicada, não só no canvas do editor.
Guia completo: Carrossel de vídeos (Reels).

Autoplay


Mobile

  • playsInline em todo <video>.
  • Botões play/mute ≥ 44×44 px.
  • Portrait: testar 9:16 e env(safe-area-inset-bottom).
  • Conexão lenta: poster primeiro; stream só após gesto.

Checklist performance

  • Poster no hero (LCP)
  • aspect-ratio em todo container de vídeo
  • Máximo um vídeo reproduzindo em listas/carrosséis
  • preload="none" em grids
  • Stream iniciado no clique ou quando visível
  • Cleanup no useEffect return
  • prefers-reduced-motion desliga autoplay
  • Testar URL publicada, não só preview do editor
  • Carrossel com vídeo: sem loop HLS — guia

Leitura relacionada