Temas

Até mesmo a marca pode ser responsiva. É possível ajustar a apresentação do seu site para corresponder à preferência do usuário. Mas, primeiro, veja como estender a marca do seu site para incluir o próprio navegador.

Personalizar a interface do navegador

Alguns navegadores permitem sugerir uma cor de tema com base na paleta do seu site. A interface do navegador se adapta à cor sugerida. Adicione a cor em um elemento meta chamado theme-color no head das suas páginas.

<meta name="theme-color" content="#00D494">
O site Clearleft.com. O site Resilient Web Design dot com. O site Session.org.
Três sites são visualizados no navegador Safari. Cada um tem uma cor de tema própria que se estende à interface do navegador.

É possível atualizar o valor de theme-color usando JavaScript. Mas use esse poder com sabedoria. Pode ser confuso para os usuários se o esquema de cores do navegador mudar com muita frequência. Pense em maneiras sutis de ajustar a cor do tema. Se as mudanças forem muito drásticas, os usuários vão sair irritados.

Também é possível especificar uma cor de tema em um arquivo de manifesto do app da Web. Esse é um arquivo JSON com metadados sobre seu site.

Vincule o arquivo de manifesto ao head dos seus documentos. Use um elemento link com um valor rel de manifest.

<link rel="manifest" href="/manifest.json">

No arquivo de manifesto, liste os metadados usando pares de chave/valor.

{
  "short_name": "Clearleft",
  "name": "Clearleft design agency",
  "start_url": "/",
  "background_color": "#00D494",
  "theme_color": "#00D494",
  "display": "standalone"
}

Se um visitante decidir adicionar seu site à tela inicial, o navegador vai usar as informações no arquivo de manifesto para mostrar um atalho adequado.

Oferecer um modo escuro

Muitos sistemas operacionais permitem que os usuários especifiquem uma preferência por uma paleta de cores clara ou escura, o que é uma boa ideia para otimizar seu site de acordo com as preferências de tema do usuário. É possível acessar essa preferência em um recurso de mídia chamado prefers-color-scheme.

@media (prefers-color-scheme: dark) {
  // Styles for a dark theme.
}

Especifique as cores do tema com o recurso de mídia prefers-color-scheme no elemento meta.

<meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#000000" media="(prefers-color-scheme: dark)">

Também é possível usar o recurso de mídia prefers-color-scheme dentro do SVG. Se você usar um arquivo SVG para o favicon, ele poderá ser ajustado para o modo escuro. Thomas Steiner escreveu sobre prefers-color-scheme em Favicons SVG para ícones do modo escuro.

Temas com propriedades personalizadas

Se você usar os mesmos valores de cor em vários lugares no CSS, pode ser bastante tedioso repetir todos os seletores em uma consulta de mídia prefers-color-scheme.

body {
  background-color: white;
  color: black;
}
input {
  background-color: white;
  color: black;
  border-color: black;
}
button {
  background-color: black;
  color: white;
}
@media (prefers-color-scheme: dark) {
  body {
    background-color: black;
    color: white;
  }
  input {
    background-color: black;
    color: white;
    border-color: white;
  }
  button {
    background-color: white;
    color: black;
  }
}

Use propriedades personalizadas do CSS para armazenar os valores de cor. As propriedades personalizadas funcionam como variáveis em uma linguagem de programação. É possível atualizar o valor de uma variável sem atualizar o nome dela.

Se você atualizar os valores das propriedades personalizadas em uma consulta de mídia prefers-color-scheme, não será necessário escrever todos os seletores duas vezes.

html {
  --page-color: white;
  --ink-color: black;
}
@media (prefers-color-scheme: dark) {
  html {
    --page-color: black;
    --ink-color: white;
  }
}
body {
  background-color: var(--page-color);
  color: var(--ink-color);
}
input {
  background-color: var(--page-color);
  color: var(--ink-color);
  border-color: var(--ink-color);
}
button {
  background-color: var(--ink-color);
  color: var(--page-color);
}

Consulte Criar um esquema de cores para exemplos mais avançados de temas com propriedades personalizadas.

Imagens

Se você estiver usando SVGs no HTML, também poderá aplicar propriedades personalizadas.

svg {
  stroke: var(--ink-color);
  fill: var(--page-color);
}

Agora, os ícones vão mudar de cor junto com os outros elementos da página.

Se você quiser diminuir o brilho das imagens fotográficas quando elas forem exibidas no modo escuro, aplique um filtro no CSS.

@media (prefers-color-scheme: dark) {
  img {
    filter: brightness(.8) contrast(1.2);
  }
}
Três fotos com brilho normal. Três fotos com um pouco menos de brilho.
O efeito é sutil, mas é possível diminuir o brilho das imagens no modo escuro.

Para algumas imagens, talvez seja necessário trocá-las completamente no modo escuro. Por exemplo, talvez você queira mostrar um mapa com um esquema de cores mais escuro. Use o elemento <picture> que contém um elemento <source> com a consulta de mídia prefers-color-scheme.

<picture>
  <source srcset="darkimage.png" media="(prefers-color-scheme: dark)">
  <img src="lightimage.png" alt="A description of the image.">
</picture>
Dois mapas do Brooklyn, um usando cores claras e o outro usando cores escuras.
Duas versões do mesmo mapa, uma para o modo claro e outra para o modo escuro.

Formulários

Os navegadores oferecem uma paleta de cores padrão para campos de formulário. Informe ao navegador que seu site oferece um modo escuro e um modo claro. Dessa forma, o navegador pode fornecer o estilo padrão adequado para formulários.

Adicione isso ao seu CSS:

html {
  color-scheme: light;
}
@media (prefers-color-scheme: dark) {
  html {
    color-scheme: dark;
  }
}

Também é possível usar HTML. Adicione isso no head dos seus documentos:

<meta name="supported-color-schemes" content="light dark">

Use a propriedade accent-color no CSS para estilizar caixas de seleção, botões de opção e alguns outros campos de formulário.

html {
  accent-color: red;
}

É comum que os temas escuros tenham cores de marca suaves. É possível atualizar o valor accent-color para o modo escuro.

html {
  accent-color: red;
}
@media (prefers-color-scheme: dark) {
  html {
    accent-color: pink;
  }
}

É recomendável usar uma propriedade personalizada para isso, para que você possa manter todas as declarações de cor em um só lugar.

html {
  color-scheme: light;
  --page-color: white;
  --ink-color: black;
  --highlight-color: red;
}
@media (prefers-color-scheme: dark) {
  html {
    color-scheme: dark;
    --page-color: black;
    --ink-color: white;
    --highlight-color: pink;
  }
}
html {
  accent-color: var(--highlight-color);
}
body {
  background-color: var(--page-color);
  color: var(--ink-color);
}

Oferecer um modo escuro é apenas um exemplo de como adaptar seu site às preferências do usuário. Em seguida, você vai aprender a tornar seu site adaptável a todos os tipos de considerações de acessibilidade.

Teste seu conhecimento

Teste seus conhecimentos sobre temas

Para fornecer cores de tema que afetam o navegador fora da página da Web, use:

CSS
As informações de tema do CSS provavelmente causariam um flash de cor normal, o que é uma experiência do usuário indesejável.
JavaScript
Somente se você o usar para atualizar uma tag "theme-color" <meta>.
Um manifesto de app da Web
O manifest.json pode ser fornecido e inclui campos para especificar cores de tema para colorir a aparência do app quando aberto em uma tela inicial de dispositivos móveis.
Uma tag 'theme-color' <meta>
Assim que possível, um navegador pode notar essa cor de tema na tag <head>, evitando flashes de cor indesejados.

Para se conectar à preferência do sistema de um usuário em relação a um tema claro ou escuro, use:

A consulta de mídia (prefers-color-scheme)
Transmita o valor que você quer verificar, como claro ou escuro, e pronto.
JavaScript
Que usa a sintaxe de consulta de mídia CSS para pedir o estado atual da preferência.

Você oferece suporte ao tema escuro, mas todas as entradas de formulário ainda são claras. O que você pode fazer?

Adicione html { color-scheme: light dark; } ao seu CSS.
Isso indica do CSS que as entradas de formulário precisam corresponder ao esquema de cores do sistema.
Adicione <meta name="supported-color-schemes" content="light dark"> à tag <head> do HTML.
Isso indica do HTML que as entradas de formulário precisam corresponder ao esquema de cores do sistema.
Escreva um monte de CSS para mudar todos os padrões da entrada.
Isso também funciona, mas é um pouco mais difícil.