CEVIU Logo
Voltar
Como implementar o modo escuro respeitando as preferências do usuário e os padrões da web

Como implementar o modo escuro respeitando as preferências do usuário e os padrões da web

Aprofundamento CEVIU

Aprofundamento

O light-dark é uma função CSS nativa, não uma biblioteca, nem um framework, introduzida para simplificar a troca de valores entre modos claro e escuro sem recorrer a JavaScript ou múltiplas classes. Ela funciona em cores, gradientes e imagens (desde Chrome/Edge 150, Firefox 150 e Safari Technology Preview), mas ainda tem limitações reais: não substitui media queries para lógica condicional complexa, não afeta box-shadow ou bordas automaticamente, e não resolve o problema de sincronia entre color-scheme e @media (prefers-color-scheme) em todos os contextos, especialmente em SVGs fora do documento principal e em iframes em navegadores anteriores ao Safari 27.

A implementação robusta exige camadas: o meta tag <meta name="color-scheme" content="light dark"> como base para carregamento inicial rápido, seguido de prefers-color-scheme para respeitar o SO, e por fim um controle manual com persistência via localStorage, tudo isso alinhado com variáveis CSS customizadas e style queries para evitar duplicação de regras. Isso é exatamente o que o artigo CEVIU de abril detalhou nos 'Seis Níveis': o nível 5 usa light-dark() com fallbacks manuais, e o nível 6 integra ele com queries de estilo para mudanças além de cor, como bordas no lugar de sombras.

O que mudou

Em abril, o CEVIU listou o light-dark() como recurso emergente, com suporte parcial e dependência de canary builds. Agora, em julho de 2026, ele está estável em todos os três principais motores, Chrome/Edge 150, Firefox 150 e Safari Technology Preview, e já permite uso prático com imagens e gradientes. Também houve avanço real na interoperabilidade: o Safari 27 passou a fazer com que o color-scheme do documento pai sobrescreva prefers-color-scheme dentro de iframes, algo que antes era inconsistente. Mas o bug crítico permanece: light-dark() ainda não ativa @media (prefers-color-scheme) em SVGs externos, conforme relatado no bug report citado no artigo-fonte.

Por que isso importa

Porque o light-dark reduz a necessidade de JS para alternância de tema, melhorando performance, acessibilidade e DX. Ele evita flicker de estilo, elimina dependência de bibliotecas de estado e reduz o risco de inconsistência entre o que o sistema diz e o que a página aplica. Mas só funciona bem quando combinado com boas práticas de contraste (WCAG 2.2 exige 4.5:1 para texto normal) e com fallbacks explícitos para propriedades que ele não controla, como bordas, sombras e tipografia. Ignorar isso gera interfaces que parecem 'escurecidas', mas não são acessíveis nem visualmente coerentes.

Linha do tempo

  1. CEVIU publica guia sobre requisitos de contraste do WCAG 2.2 para modos claro e escuro

  2. CEVIU cobre implementação multiplataforma do modo escuro no Bluesky, com opções Light, Dim, Dark e System

  3. CEVIU detalha os seis níveis de implementação, incluindo light-dark() como nível 5 e style queries como nível 6

  4. Nova orientação prática sobre light-dark(), preferências do usuário e alinhamento com padrões web

Perguntas frequentes

O light-dark() substitui completamente o prefers-color-scheme?

Não. O light-dark() é uma função de valor condicional para CSS; o prefers-color-scheme é uma media query para aplicar blocos inteiros de estilo. Eles servem a propósitos diferentes e são complementares, não concorrentes. O artigo-fonte mostra casos em que ambos são necessários.

Posso usar light-dark() com background-image em produção hoje?

Sim, desde que use navegadores atualizados (Chrome/Edge 150+, Firefox 150+, Safari TP). Mas lembre-se: não há fallback automático para browsers mais antigos. Você precisa de uma estratégia de degradação, como imagem padrão em modo claro com media query como backup.

Como garantir que meu modo escuro seja acessível?

Siga o WCAG 2.2: contraste mínimo de 4.5:1 para texto normal, 3:1 para texto grande, e verifique cores de fundo e texto em ambas as configurações. Não basta inverter, use ferramentas como o axe DevTools ou o Contrast Checker do CEVIU para testar combinações reais, não apenas paletas teóricas.

Por que o color-scheme no HTML não afeta o prefers-color-scheme em todos os lugares?

É uma limitação atual da especificação CSS. O comportamento foi padronizado, mas a implementação é parcial: funciona em iframes (Safari 27+) e em alguns contextos de SVG, mas ainda não em SVGs carregados externamente. O artigo-fonte cita relatórios de bugs abertos nesse sentido.

Fontes

Avalie este artigo:
Compartilhar:
Categoria
CEVIU Web Dev
Publicado
03 de julho de 2026
Editoria
CEVIU Web Dev

Quer receber mais sobre CEVIU Web Dev?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser