Tipografia com PX, EM e REM

Tipografia com PX, EM e REM

As unidades de medidas pra definir a tipografia em css podem ser classificadas em dois grupos: Relativas e Absolutas.

O mais conhecido, sem dúvidas, é o px. Mas em um mundo onde temos vários dispositivos de tamanhos e telas diferentes, o ideal é não trabalhar com valores absolutos, ou seja, nossas medidas devem ser flexíveis pra funcionar da melhor forma possível em qualquer tamanho de tela. Aí é onde entram as unidades relativas “em” e “rem”.

PX

Pixels são unidades fixas no documento. Não são relativas a nenhum outro elemento e não dependem de nenhuma outra unidade ou variação. Vai ser sempre do tamanho definido.

.heading {
	font-size: 22px;
}

Nesse caso, nosso .heading vai ter o font-size de 22px independente do tamanho da tela, do elemento pai ou do documento, já que está usando uma unidade absoluta.

A maioria dos navegadores modernos têm como padrão 16px para o tamanho do font-size.

REM

São as unidades relativas ao elemento raiz do documento html, que é a tag <html>.

Sabendo que o valor padrão do nosso elemento raiz é 16px (se não for alterado), podemos trabalhar com a ideia de que 1rem = 16px.

Nosso .heading ficaria assim:

.heading {
	font-size: 2rem ; /* 2 * 16px = 32px */
}

/* Outro valor */
.heading {
	font-size: 1.5rem; /* 1.5 * 16px = 24px */
}

Pra não ter que ficar calculando os valores de REM toda hora, existe um hackzinho que facilita muito no uso dele.

html {
	font-size: 62.5%; /* Muda o default de 16px pra 10px */
}

body {
	font-size: 1.4rem; /* 14px */
}

h1 {
	font-size: 1.6rem; /* 16px */
}

Existem ferramentas pra ajudar na conversão, como essa calculadora e até uma extensão para VS Code.

EM

Unidade também relativa, mas nesse caso, ao elemento pai e não ao elemento raíz.

<article>
	<h1>Heading</h1> <!-- 2 * 28px = 56px -->

	<section>
		<h1>Subheading</h1> <!-- 2 * 22px = 44px -->
	</section>

</article>

<style>

/* Elementos pais */
article {
	font-size: 28px;
}

section {
	font-size: 22px;
}

/* Elemento filho */
h1 {
	font-size: 2em;
}

</style>

Se tivéssemos mais elementos agrupados um dentro do outro, o elemento filho segue o pai do level acima. Aqui fica mais confuso, por isso em é mais fácil de se perder.

Acessibilidade

Se o usuário der zoom no navegador, os elementos com REM e PX continuarão do mesmo tamanho.

Agora, se o usuário alterar as configurações do navegador e mudar o tamanho padrão dele de 16px pra qualquer outro valor, o elemento que for definido com REM começa com o padrão que o usuário definiu e irá mudar proporcionalmente conforme o zoom que ele der, e o elemento que estiver com px só irá mudar quando ele der o zoom.

Concluindo

Use REM para interfaces escaláveis. REM e PX escalam o zoom da mesma forma, mas o REM se baseia nas preferências do usuário primeiro. Use EM somente quando um elemento deve ser escalado conforme o seu pai. REM é acessibilidade.