Recursos de mídia

Um resumo de todas as maneiras como os recursos de mídia permitem que você responda a dispositivos e preferências.

O design responsivo não seria possível sem as consultas de mídia. Antes das consultas de mídia, não havia como saber que tipo de dispositivo as pessoas estavam usando para visitar seu site. Os designers tiveram que fazer suposições. Essas suposições foram codificadas em projetos com largura fixa ou layouts líquidos.

Tudo isso mudou com o lançamento das consultas de mídia. Pela primeira vez, os designers podiam encontrar pessoas na metade do caminho. Os designers podiam ajustar os layouts para responder aos dispositivos das pessoas.

Lembre-se de que uma consulta de mídia compreende um tipo de mídia opcional e um recurso de mídia obrigatório. Não houve muita mudança nos tipos de mídia ao longo dos anos. Ainda há apenas quatro valores possíveis:

@media all
@media screen
@media print
@media speech

Os recursos de mídia, por outro lado, cresceram bastante. Agora, os designers podem atender aos usuários além da metade, adaptando os designs para se adequarem muito mais do que apenas o tamanho da tela.

Compatibilidade com navegadores

  • 1
  • 12
  • 1
  • 3

Origem

Dimensões da janela de visualização

De longe, as consultas de mídia mais populares na Web são aquelas que lidam com a largura da janela de visualização. Mas mesmo assim você tem uma escolha. Você pode usar o recurso de mídia max-width para aplicar estilos abaixo de uma determinada largura ou usar o recurso de mídia min-width para aplicar estilos acima de uma determinada largura.

main {
  display: grid;
  grid-template-columns: 2fr 1fr;
}
@media (max-width: 45em) {
  main {
    display: block;
  }
}
@media (min-width: 45em) {
  main {
    display: grid;
    grid-template-columns: 2fr 1fr;
  }
}

Pessoalmente, gosto de usar o min-width. aplico estilos de layout de maneira aditiva. Apresento novas regras de layout em cada ponto de interrupção em vez de desfazer regras anteriores.

Essa abordagem aditiva também funciona para altura. Usando min-height, você pode introduzir mais regras à medida que mais alturas da janela de visualização são disponibilizadas. Por exemplo, é possível ter um elemento de cabeçalho que você quer fixar na parte de cima da janela do navegador se houver espaço vertical suficiente.

@media (min-height: 30em) {
  header {
    position: fixed;
  }
}

Mas você pode usar o recurso de mídia max-height, se preferir. Aqui, o cabeçalho é ancorado por padrão, mas a adesão é removida se não houver espaço vertical suficiente.

header {
  position: fixed;
}
@media (max-height: 30em) {
  header {
    position: static;
  }
}

A escolha entre os prefixos min- e max- não se aplica apenas a width e height. O recurso de mídia aspect-ratio oferece a mesma opção. Ela também oferece uma versão sem prefixo se você quiser aplicar estilos em uma proporção exata de largura para altura.

@media (min-aspect-ratio: 16/9) {
  // The ratio of width to height is at least 16 by 9.
}
@media (max-aspect-ratio: 16/9) {
  // The ratio of width to height is less than 16 by 9.
}
@media (aspect-ratio: 16/9) {
  // The ratio of width to height is exactly 16 by 9.
}

Fornecer estilos diferentes para proporções distintas pode sair do controle. Se você não precisa desse nível de controle, o recurso de mídia orientation pode atender melhor às suas necessidades. Ela tem dois valores possíveis: portrait ou landscape.

@media (orientation: portrait) {
  // The width is less than the height.
}
@media (orientation: landscape) {
  // The width is greater than the height.
}

Embora os termos "retrato" e "paisagem" sejam usados com mais frequência para se referir à orientação dos dispositivos móveis, o recurso de mídia orientation não é específico do dispositivo. Uma janela do navegador em tela cheia em um laptop comum tem um valor orientation de landscape.

Telas

Telas diferentes têm densidades de pixel distintas, medidas em dpi, pontos por polegada. É possível ajustar os estilos para diferentes densidades de pixel usando o recurso de mídia resolution. Como aspect-ratio, resolution vem em três variedades: mínimo, máximo e exato.

@media (min-resolution: 300dpi) {
  // The display has a pixel density of at least 300 dots per inch.
}
@media (max-resolution: 300dpi) {
  // The display has a pixel density less than 300 dots per inch.
}
@media (resolution: 300dpi) {
  // The display has a pixel density of exactly 300 dots per inch.
}

Talvez nunca seja necessário usar consultas de mídia resolution. A densidade de pixels geralmente é um problema apenas para imagens, e as imagens responsivas são uma forma de lidar com a densidade de pixels diretamente em HTML.

Por outro lado, é no CSS que você define suas animações e transições. É possível ajustar essas animações e transições para responder a diferentes taxas de atualização usando o recurso de mídia update. Esse recurso de mídia informa um destes três valores: none, slow e fast.

O valor none de update significa que não há taxa de atualização. Uma página impressa, por exemplo, não pode ser atualizada.

Um valor update de slow significa que a tela não pode ser atualizada rapidamente. Uma tela de tinta eletrônica é um exemplo de tela com taxa de atualização lenta.

Um valor update de fast significa que a tela é atualizada com rapidez suficiente para processar animações e transições.

@media (update: fast) {
  a {
    transition-duration: 0.4s;
    transition-property: transform;
  }
  a:hover {
    transform: scale(150%);
  }
}

Nem todos os aspectos da tela estão relacionados às capacidades de hardware. No módulo de aplicação de temas, você aprendeu a definir propriedades em um arquivo de manifesto de app da Web. Uma dessas propriedades é chamada de display, e você pode atribuir a ela um valor de fullscreen, standalone, minimum-ui ou browser. Com o recurso de mídia correspondente display-mode, você pode personalizar seus estilos para essas diferentes opções.

Digamos que você enviou um valor display de standalone no manifesto do app da Web. Se alguém adicionar seu site à tela inicial, ele será iniciado sem nenhuma interface do navegador. Você pode exibir um botão "Voltar" para esses usuários.

button.back {
  display: none;
}
@media (display-mode: standalone) {
  button.back {
     display: inline;
  }
}

Cor

Existem vários recursos de mídia para consultar as capacidades de cor de um dispositivo. Se você quiser ajustar os estilos para qualquer tela que gere apenas tons de cinza, use o recurso de mídia monochrome sem nenhum valor.

@media (monochrome) {
  body {
    color: black;
    background-color: white;
  }
}

Há um recurso de mídia correspondente color.

@media (color) {
  body {
    color: maroon;
    background-color: linen;
  }
}

Para telas coloridas, você pode escrever consultas com os recursos de mídia color-gamut, color-index ou dynamic-range. Todos eles relatam detalhes específicos sobre os recursos de cor da tela.

Neste exemplo, os valores de cor são atualizados em resposta ao recurso de mídia dynamic-range, que informa a combinação de brilho máximo, profundidade de cor e taxa de contraste da tela. Os valores possíveis são standard ou high. Uma tela de alta definição que informa um valor dynamic-range de high recebe um espaço de cor diferente usando a nova função CSS color().

.neon-red {
  color: hsl(355 100% 95%);
}
@media (dynamic-range: high) {
  .neon-red {
    color: color(display-p3 1 0 0);
  }
}

Interação

Os recursos de mídia também podem informar o tipo de mecanismo de entrada usado para interagir com seu site: hover, any-hover, pointer e any-pointer. Veja o módulo sobre interação para mais detalhes.

Preferências

Há várias consultas de mídia que permitem responder às preferências do usuário: prefers-color-scheme, prefers-contrast e prefers-reduced-motion. Veja os módulos sobre temas e acessibilidade para mais detalhes.

É possível combinar recursos de mídia em uma consulta de mídia. É possível definir o escopo dos seus estilos de animação para que eles sejam aplicados somente se o dispositivo tiver uma taxa de atualização rápida e o usuário não tiver expressado preferência por movimento reduzido.

@media (update: fast) and (prefers-reduced-motion: no-preference) {
  a {
    transition-duration: 0.4s;
    transition-property: transform;
  }
  a:hover {
    transform: scale(150%);
  }
}

Mais recursos de mídia

Mais recursos de mídia serão lançados em breve.

Os recursos de mídia forced-colors e inverted-colors informam se um dispositivo está usando uma paleta de cores restrita ou invertida.

Um recurso de mídia do scripting permite que você ajuste seu CSS com base na disponibilidade do JavaScript.

Um recurso de mídia chamado prefers-reduced-data permite que os usuários especifiquem que estão em uma conexão limitada para que você possa enviar recursos menores ou menos.

Outras propostas ainda estão sendo formuladas. No próximo e último módulo, você vai aprender sobre a proposta de um recurso de mídia que lida com diferentes configurações de tela.

Teste seu conhecimento

Teste seus conhecimentos sobre recursos de mídia

Uma consulta de mídia pode procurar um dispositivo com uma largura específica, como @media (width: 1024px)?

Verdadeiro
Uma largura específica só pode ser realizada ao verificar simultaneamente larguras acima de 1023px e abaixo de 1025px.
Falso
min-width e max-width são os que estão disponíveis.

Uma consulta de mídia pode procurar um dispositivo em uma aspect-ratio específica, como @media (aspect-ratio: 4/3)?

Verdadeiro
Exclusivo para proporção, uma única proporção pode ser correspondida.
Falso
Essa opção existe para aspect-ratio.

Quais são as consultas de mídia de cores válidas?

@media (color)
Combina com qualquer dispositivo de cor.
@media (monochrome)
Combina com qualquer dispositivo sem funcionalidade de cor.
@media (color-gamut: srgb)
Corresponde a dispositivos com o recurso de cor sRGB.
@media (min-color-index: 15000)
Corresponde a dispositivos com pelo menos 15 mil cores disponíveis.
@media (dynamic-range: high)
Corresponde a dispositivos compatíveis com faixas de cores em alta definição.

Quais das seguintes consultas de mídia de preferência do usuário são válidas?

@media (prefers-color-scheme: dark)
Mostra quando um usuário está com o sistema operacional configurado para o modo escuro.
@media (prefers-colors: high-definition)
Não é real.
@media (prefers-reduced-motion: reduce)
Corresponde a quando um usuário tem o sistema operacional configurado para reduzir o movimento.
@media (prefers-contrast: more)
Corresponde quando um usuário tem o sistema operacional configurado para contrastes mais altos.
@media (prefers-site-speed: fast)
Não é real.