Porque usar 'em' no seu CSS hoje em dia?

Alura
slopes
slopes

Compartilhe

Talvez você programe pra Web há muitos anos como eu e tenha ouvido falar como em é melhor que pixel. Mais flexível. Mais acessibilidade. Será?

Como os ems funcionam?

A grande diferença de em e px é que em é uma medida relativa. O valor é calculado levando sempre em consideração o font-size do pai. Isso quer dizer que um elemento com font-size: 2em; vai ter o dobro do tamanho da fonte do pai, seja ele qual for.

E assim por diante. O pai do pai do pai do pai... É uma grande multiplicação de valores até chegar na raiz do documento, o <html>. Se não tiver uma fonte definida, a maioria dos navegadores usa 16px como padrão para o <html>.

Isso quer dizer que esse código:

 <html> <body> <main style="font-size: 1.5em"> <h1 style="font-size: 2em">Titulo</h1> <p style="font-size: 0.75em">Texto.</p> </main> </body> </html> 

..acaba sendo equivalente a:

 <html style="font-size: 16px"> <body style="font-size: 16px"> <main style="font-size: 24px"> <h1 style="font-size: 48px">Titulo</h1> <p style="font-size: 18px">Texto.</p> </main> </body> </html> 
Banner promocional da Imersão Cloud DevOps da Alura e Google Cloud com o texto "INSCRIÇÕES ABERTAS PARA A PRIMEIRA EDIÇÃO DA IMERSÃO CLOUD DEVOPS" e a informação de 3 aulas gratuitas com certificado. A imagem mostra um desenvolvedor focado usando fones de ouvido em um computador, com uma colega trabalhando ao fundo, e um botão chamativo com a frase "GARANTA A SUA VAGA".

Mito: em não é mais acessível

A recomendação de que em é melhor para acessibilidade vem da época dos IEs velhos, 6, 5.5. Nesses navegadores, quando o usuário tinha dificuldade de visão, podia aumentar a fonte. Na prática, a fonte base do <html> era aumentada. Ou seja, usava 16px por padrão mas com o zoom isso virava 20px por exemplo.

Assim, todos os elementos que estavam com em tinham seu valor recalculado e a página aumentava de tamanho. Era uma espécie de zoom, essencial para acessibilidade. Os elementos que estavam com px, porém, não aumentavam de tamanho. Péssima acessibilidade. E assim nasceu o modismo do em.

Mas todos os navegadores modernos, IE inclusive, não tratam mais o zoom assim. Na Web moderna, o conceito de pixel é relatevo também. Escrever 1px no CSS não significa necessariamente um pixel físico na tela. Quando o usuário dá um zoom de 200% por exemplo hoje em dia o navegador aumenta todas as medidas, inclusive o pixel. Isso quer dizer que 1px no CSS vai ser desenhado com o dobro de pixels físicos (2px x 2px numa tela comum).

Ou seja, não precisamos de em para acessibilidade.

Onde o em faz sentido então?

A grande vantagem do em é porém no seu aspecto de multiplicar os valores de acordo com os pais. Isso quer dizer que você pode mudar o font-size de um elemento e isso afetar todos os seus filhos. É muito útil para criar seções na página onde os elementos devem aumentar proporcionalmente entre si - um componente, um widget.

Ou seja, usamos em para facilitar a escrita do nosso CSS. E por isso é bom dominar o uso de em e saber aproveitá-lo no seu código.

O em, claro, não é para todos os cenários. Ele vincula as medidas do filho com o font-size do pai. Você mexe no pai e o filho é afetado. Isso às vezes é indesejado. Só usamos em quando existe uma relação estrutural entre o filho e o pai e queremos que um afete o outro. Onde não fizer sentido, continue usando px.

O caso famoso dos designs responsivos

O em teve uma volta triunfante nos designs responsivos. É que é muito frequente você querer uma fonte menor no mobile, que tem menos espaço visível, mas uma fonte maior no Desktop, mais espaçoso. E você quer que a página toda aumente proporcionalmente. Por isso o em.

Fazemos algo assim:

 @media (min-width: 500px) { html { font-size: 1.25em; } } @media (min-width: 800px) { html { font-size: 1.5em; } } @media (min-width: 1000px) { html { font-size: 1.75em; } } @media (min-width: 1200px) { html { font-size: 2em; } } 

Conforme o tamanho da tela aumenta, aumentamos o valor do em base na tag <html>. Isso causa um efeito cascata em todos os elementos filhos se estiverem escritos com em.

É muito bom usar em nos sites responsivos para ajustar, via CSS, o tamanho de todos os elementos proporcionalmente.

Mas em não é uma medida flexível nem mais acessível. Pelo menos não no sentido de outras como a porcentagem, que se adapta automaticamente. O em é fixo, só o valor que é calculado a partir de uma conta mais complicada.

Bônus: o rem e outras medidas verdadeiramente flexíveis

O rem é uma medida nova parecida. A diferença é que a conta não leva em consideração todos os pais, mas apenas a raiz, o <html>. Isso quer dizer que mexer no font-size de algum elemento na página não vai refletir e atrapalhar outros. Só se mexermos no <html> mesmo. É útil para o caso do design responsivo que vimos antes.

Mas lembre que o em multiplicar pelo font-size do pai é uma coisa boa em muitas situações. Várias partes da página podem ser encaradas como pequenos componentes autocontidos. E mexer no pai do componente tem que afetar todos os filhos. O em é excelente pra isso, ao contrário do rem.

E, se você quiser uma medida verdadeiramente flexível e adaptável para fontes, a resposta está nas novas viewport units. Em especial, um código como html { font-size: 2vw; } vai fazer a fonte se adaptar automaticamente a todo tipo de resolução. Mas isso fica para outro artigo.

Se quiser saber mais sobre medidas flexíveis, boas práticas de CSS e também de design responsivo, não perca o curso de Web da Caelum.

E você, gosta de usar em?

Veja outros artigos sobre Front-end