Imagem post: Qual unidade utilizar – Pixel, EM ou REM
Acessibilidade

Qual unidade utilizar – Pixel, EM ou REM

Entenda mais sobre as duas unidades prediletas pelos desenvolvedores.

Por
19

Aqui no Brasil é muito comum usarmos pixels para definição de tamanho de textos. Lá fora a galera gosta muito de usar EM. Mas qual a diferença? Por que usar um ou outro?

Pixels

Unidade em pixels é mais velho que andar para trás. Você utiliza pixels para definir a largura de um elemento, o tamanho do texto, a espessura da borda e outras coisas.

Os pixels são utilizados para definir o tamanho dos textos por que é a medida mais exata que você pode encontrar. Por não ser uma medida variável, Pixels são fáceis de controlar. Fáceis de usar. Você abre seu Photoshop, mede e pronto, passa os valores para CSS facilmente. É tudo muito eficiente. É por isso que todo mundo prefere utilizar pixels nos projetos, principalmente aqui no Brasil onde a preguiça impera.

Antigamente definir unidades de texto em pixels trazia uma desvantagem por causa do Internet Explorer. Quando o usuário tentava mudar o tamanho do texto pelo browser, por algum motivo bizarro o IE não aumentava esse texto pelo simples motivo de que o texto estava definido em pixels. Um problema sério de acessibilidade. É por isso que muitos devs preferiram durante um tempo definir o tamanho do texto utilizando % (porcentagem) em vez de trabalhar com pixels. O problema é que trabalhar com porcentagem é algo muito instável. Havia diferenças de tamanhos de textos entre os browsers e por causa disso o layout nunca ficava igual.

body {
  font: normal 16px verdana, arial, tahoma, sans-serif;
}

Agora, definindo a mesma font com um tamanho variável em porcentagem:

body {
  font: normal 100% verdana, arial, tahoma, sans-serif;
}

A diferença de um e para outro é um pouco óbvia. O tamanho padrão das font dos browsers geralmente é de 16px. Logo, se você define que a fonte terá 100% do seu tamanho, você está dizendo que a font terá 16px. Claro, se algum dia o browser mudar o tamanho padrão de sua font, ela terá um novo fator de base.

Unidades em EM

EM é uma unidade de medida tipográfica. Seu nome está relacionada com a letra “M”, onde o tamanho base dessa unidade deriva da largura da letra M em maiúscula. Dizem que 1em equivale aproximadamente 16 pontos.

Não sou eu que estou falando isso, é a Wikipedia. ;-)

O problema de utilizar fonts em EM é que elas são variáveis como a porcentagem. Diferentemente da utilização de pixels, temos que fazer um pouco de matemática para planejar nossas unidades no projeto. Não é nada de outro mundo, então pare de preguiça.

Calculando o EM

A fórmula é fácil de entender. Vou manter os termos em inglês para você entender melhor quando for procurar mais informações sobre este assunto:

target ÷ context = result

Um exemplo: imagine um título, H1, cujo seu tamanho de texto seja 20px.

h1 {
  font: 20px verdana, arial, tahoma, sans-serif;
}

Então o target (que é o elemento que queremos modificar) é 20px. Nesse caso o BODY é o pai do nosso H1. Logo, valor da font do body é o context (contexto), que como já dissemos tem o valor padrão de 16px. Logo 20 ÷ 16 = 1.25.

h1 {
  font: 1.25em verdana, arial, tahoma, sans-serif;
}

Se este H1 estiver dentro de um outro elemento, tipo um div, o valor de context agora é o tamanho da font do div. Tenha como exemplo esse HTML:

Um título bacana

Um texto grande e bacana para fazermos parágrafos.

O CSS:

div {
    font: 30px verdana, arial, tahoma, sans-serif;
}

h1 {
    font-size: 20px;
}

p {
    font-size: 12px;
}

Vamos passar tudo isso para EM. Primeiro o parágrafo:
12px (target) ÷ 30px (context [div]) = 0.4em

Título:
20px (target) ÷ 30px (context [div]) = 0.67em

Div:
30px (target) ÷ 16px (context [body]) = 1.88em

Simples, ahn?

Isso é útil por quê?
Imagine que você faça um site mobile ou um site para grandes telas. Em vez de você mudar as fonts de cada elemento, você pode simplesmente muda o valor da font do target, ou seja, do body!

body {font: 100% verdana, arial, tahoma, sans-serif;}

div {
    font-size: 1.88em;
}

h1 {
    font-size: 0.67em;
}

p {
    font-size: 0.4em;
}

Mudando o valor de porcentagem da font do body, você consegue mudar proporcionalmente a font de todos os outros elementos.

Mas dá trabalho

Realmente… ficar calculando target e context para cada um dos elementos é muito chato. Seria interessante se o valor do context fosse sempre o mesmo, não é? Pois é… Já pensaram nisso e fizeram uma unidade chamada REM.

A REM sempre terá o valor de contexto do ROOT (é isso que significa o R do REM), ou seja, sempre o body… Os valores do nosso exemplo acima ficaria assim se referenciando pelo body e não pelo DIV. Logo os valores ficam como abaixo:

body {font: 100% verdana, arial, tahoma, sans-serif;}

div {
    font-size: 1.88rem;
}

h1 {
    font-size: 1.25rem;
}

p {
    font-size: 0.75rem;
}

Infelizmente isso não é para todos os browsers… Firefox 3.6+, Chrome, Safari 5, e IE9 suportam a unidade REM. Mas e os caras que não suportam? Bom, use a font em PX. Cá entre nós, dessa lista de browsers só faltou o IE8, já que o IE7 e 6 já foram embora. Se você não suportar em seus projetos o IE8, pode ignorar essa técnica.

Basta definir os dois valores, tanto em REM quanto em PIXELS. Lembre-se de sempre colocar a linha de PIXELS antes da REM. Assim, os browsers que entendem REM vão sobreescrever o valor em PIXELS e os browsers que não conhecem REM vão ignorar essa linha.

body {font: 100% verdana, arial, tahoma, sans-serif;}

div {
    font-size: 30px;
    font-size: 1.88rem;
}

h1 {
    font-size: 20px;
    font-size: 1.25rem;
}

p {
    font-size: 12px;
    font-size: 0.75rem;
}

Decidir qual dessas unidades usar não pode ser caso de dúvidas e atrasos. Saiba que pixels são mais precisos entre os browsers, mas menos flexíveis. Enquanto o REM/EM são mais flexíveis, nos dá a vantagem da acessibilidade, mas envolve um pouco de matemática. Mesmo assim utilizar REM tem sido uma ótima prática e não está trazendo tantos problemas crossbrowser.

19

Por Diego Eis

Diego Eis criou o Tableless para disseminar os padrões web no Brasil. Como consultor já treinou equipes de empresas como Nokia, Globo.com, Yahoo! e iG. É palestrante e empreendedor.

http://about.me/diegoeis/

Mais posts do autor

  • Gorzoni

    Adorei o artigo.. sempre uso em pixel, mas preciso me acostumar a usar o “em” ou em “rem”.

  • http://twitter.com/kilianolopes Kiliano Lopes

    Demorei um pouquinho pra pegar a relação da div com o EM, agora que caiu a ficha isso vai ser ótimo! Estou desenvolvendo um responsivo aqui, vai ser bem útil. Valeu a dica.

  • Diogo Souza

    Muito bom, explicado com humor e clareza. valeu!

  • Pingback: Qual unidade utilizar – Pixel, EM ou REM « Lucas Pinheiro

  • http://twitter.com/LFeh Felipe

    Por enquanto prefiro continuar usando PX.

    EM acaba causando uma perda desnecessária de tempo no desenvolvimento e infelizmente REM não é aceito por navegadores mais antigos. 

    Demoro menos tempo adaptando PX para designs resposivos do que fazendo site todo usando EM. 

  • Lol

    não era pra ser um problema, um site não pode ter uma grande disparidade de tamanhos tanto quanto de familias de fontes.

  • http://da2k.com.br/ Fernando Daciuk

    Bem legal.. Já tenho usado o EM em meus projetos, mas não conhecia o REM. Vou começar a usar pra testar ;)

  • José Augusto Viana

    Uma maneira rápida de usar o em, sem realizar várias contas seria assim:
    body {font: 62.5% /*onde 62.5% equivale a 12px*/ verdana, arial, tahoma, sans-serif;}

    div {

        font-size: 3.0em/* para não ficar “chutando” valores, basta deslocar uma casa decimal quando quiser colocar em, por exemplo, se quiser colocar 30px, substitua para 3.0em. Lembrando que a regra só funcionará se o número de 62.5% estiver no body*/;
    }

    h1 {

        font-size: 2.0em/*2.0em equivale a 20 px*/;

    }

    p {

        font-size: 1.2em;
    }

  • João Gontijo

    Seria errado se no body eu setasse o valor em pixels?

    exemplo:
    body{ font-size:10px }

    sendo assim, o meu contexto sempre seria 10, o que fica mais facil calcular os valores

    h1{
    font-size:24px;
    font-size:2.4rem;
    }

  • WTFC

    LOOL

  • Daniel
  • http://twitter.com/willian Willian Fernandes

    Eu tenho utilizado e prefiro muito o EM. Tente fazer um layout responsivo e terá problemas com PX.
    Agora, se você trabalha com desenvolvimento e tem preguiça de fazer simples contas de divisão para encontrar o valor EM, então é melhor repensar sua profissão.
    Para facilitar a vida, use ferramentas como o SASS (por favor, use o .scss e se for fazer isso). Com ele vc cria um mixin para fazer a conta para vc ;)

  • http://neuroniodigital.com.br/ Adriano Ribeiro

    Lembrando que existem várias ferramentas que ajudam a fazer essa conversão entre PX e EM. Ex.: http://pxtoem.com/

  • http://twitter.com/cahemendes Cahê Scarcela Mendes

    José, o valor 62.5% equivale a 10px, não a 12px, o resto está correto!

  • Vini

    px é para os fracos….=P

  • Pingback: Tipografia & design responsivo | // blog

  • jhow

    posso trabalhar o site todo em porcentagens? para facilitar o media queries.

  • http://www.facebook.com/cezarluizc Cezar Luiz

    Creio que um jeito fácil para ficar multiplicando ou dividindo os valores seria colocando o valor no body para valores mais fáceis, por exemplo, 10px, assim se eu quero uma fonte com 16px eu coloco 1.6em, 20px = 2em, 48px = 4.8em, e assim por diante…

  • http://www.facebook.com/carlossnogueira Carlos Nogueira

    Muito bom esse Post, até hoje me deparo com muitos desenvolvedores de Front-End que não conhecem a diferença entre PX e EM.

    Eu uso muito EM pois posso trabalhar melhor questões de equivalência tipográfica em dispositivos distintos usando media queries.

    Um abraço

Mais artigos