Estou criando um novo site e quero que ele seja compatível com o máximo possível de navegadores e configurações do navegador. Estou tentando decidir qual unidade de medida devo usar para o tamanho das minhas fontes e elementos, mas não consigo encontrar uma resposta conclusiva.
Minha pergunta é: devo usar px
ou rem
no meu CSS?
- Até agora eu sei que o uso
px
não é compatível com usuários que ajustam o tamanho da fonte base no navegador. - Eu desconsiderei
em
s porque eles são mais difíceis de manter, em comparação comrem
s, à medida que se conectam em cascata. - Alguns dizem que
rem
s são independentes da resolução e, portanto, mais desejáveis. Mas outros dizem que a maioria dos navegadores modernos amplia todos os elementos da mesma forma, portanto, o usopx
não é um problema.
Estou perguntando isso porque há muitas opiniões diferentes sobre qual é a medida de distância mais desejável em CSS, e não tenho certeza qual é a melhor.
html
css
distance
units-of-measurement
TylerH
fonte
fonte
Respostas:
TL; DR: uso
px
.Os fatos
Primeiro, é extremamente importante saber que, por especificação , a
px
unidade CSS não é igual a um pixel de exibição físico. Isso sempre foi verdade - mesmo na especificação CSS 1 de 1996 .O CSS define o pixel de referência , que mede o tamanho de um pixel em uma tela de 96 dpi. Em uma tela com um dpi substancialmente diferente de 96 dpi (como telas Retina), o agente do usuário redimensiona a
px
unidade para que seu tamanho corresponda ao tamanho de um pixel de referência. Em outras palavras, esse redimensionamento é exatamente o motivo pelo qual 1 pixel CSS é igual a 2 pixels físicos da tela Retina.Dito isto, até 2010 (e não obstante a situação do zoom móvel), o
px
quase sempre era igual a um pixel físico, porque todos os monitores amplamente disponíveis estavam em torno de 96dpi.Os tamanhos especificados em
em
s são relativos ao elemento pai . Isso leva aoem
"problema de composição" no qual elementos aninhados ficam progressivamente maiores ou menores. Por exemplo:Nos dá:
O CSS3
rem
, que sempre é relativo apenas aohtml
elemento raiz , agora é suportado em 96% de todos os navegadores em uso .A opinião
Acho que todos concordam que é bom projetar suas páginas para acomodar a todos e considerar os deficientes visuais. Uma dessas considerações (mas não a única!) É permitir que os usuários aumentem o texto do seu site, para facilitar a leitura.
No começo, a única maneira de fornecer aos usuários uma maneira de dimensionar o tamanho do texto era usando unidades de tamanho relativo (como
em
s). Isso ocorre porque o menu de tamanho da fonte do navegador simplesmente mudou o tamanho da fonte raiz. Portanto, se você especificasse o tamanho da fontepx
, eles não seriam redimensionados ao alterar a opção de tamanho da fonte do navegador.Navegadores modernos (e até o IE7 não tão moderno) alteraram o método de dimensionamento padrão para simplesmente ampliar tudo, incluindo imagens e tamanhos de caixa. Essencialmente, eles tornam o pixel de referência maior ou menor.
Sim, alguém ainda poderia mudar seu estilo padrão do navegador para ajustar o tamanho da fonte padrão (o equivalente à opção de tamanho de fonte de estilo antigo), mas isso é uma maneira muito esotérico de fazer isso e eu aposto ninguém 1 faz. (No Chrome, ele está oculto nas configurações avançadas, conteúdo da Web, tamanhos de fonte. No IE9, é ainda mais oculto. Você precisa pressionar Alt e ir para Exibir, Tamanho do texto.) É muito mais fácil selecionar a opção Zoom em o menu principal do navegador (ou use Ctrl+ +/ -/ roda do mouse).
1 - dentro de erro estatístico, naturalmente
Se assumirmos que a maioria dos usuários dimensiona páginas usando a opção de zoom, considero as unidades relativas principalmente irrelevantes. É muito mais fácil desenvolver sua página quando tudo é especificado na mesma unidade (as imagens são tratadas em pixels) e você não precisa se preocupar com composição. ( "Disseram-me que não haveria matemática" - é preciso calcular o que o 1,5em realmente funciona.)
Um outro problema em potencial de usar apenas unidades relativas para tamanhos de fonte é que fontes redimensionadas pelo usuário podem quebrar as suposições feitas pelo seu layout. Por exemplo, isso pode fazer com que o texto seja cortado ou executado por muito tempo. Se você usar unidades absolutas, não precisará se preocupar com tamanhos de fonte inesperados para quebrar seu layout.
Então, minha resposta é usar unidades de pixel. Eu uso
px
para tudo. Obviamente, sua situação pode variar e, se você precisar dar suporte ao IE6 (que os deuses dos RFCs tenham piedade de você), terá que usarem
s de qualquer maneira.fonte
Gostaria de elogiar a resposta de josh3736 por fornecer um excelente contexto histórico. Embora seja bem articulado, o cenário do CSS mudou nos quase cinco anos desde que essa pergunta foi feita. Quando essa pergunta foi feita,
px
foi a resposta correta, mas isso não é mais verdade hoje.tl; dr: use
rem
Visão geral da unidade
Historicamente, as
px
unidades geralmente representavam um pixel do dispositivo. Com dispositivos com densidade de pixels cada vez maior, isso não vale mais para muitos dispositivos, como o Retina Display da Apple.rem
unidades representam a r oot em tamanho. É o quefont-size
quer que seja:root
. No caso do HTML, é o<html>
elemento; para SVG, é o<svg>
elemento O padrãofont-size
em todos os navegadores * é16px
.No momento da redação deste artigo,
rem
é suportado por aproximadamente 98% dos usuários . Se você estiver preocupado com esses outros 2%, lembrarei que as consultas de mídia também são suportadas por aproximadamente 98% dos usuários .Sobre o uso
px
A maioria dos exemplos de CSS na Internet usa
px
valores porque eles eram o padrão de fato.pt
,in
e várias outras unidades poderiam ter sido usadas na teoria, mas elas não lidavam bem com valores pequenos, pois você rapidamente precisava recorrer a frações, que eram mais longas para digitar e mais difíceis de raciocinar.Se você queria uma borda fina, com a qual
px
você poderia usar1px
,pt
precisaria usar0.75pt
para obter resultados consistentes, e isso não é muito conveniente.Sobre o uso
rem
rem
O valor padrão de16px
não é um argumento muito forte para seu uso. Escrever0.0625rem
é pior do que escrever0.75pt
, então por que alguém usariarem
?Há duas partes em
rem
vantagem sobre outras unidades.px
valor aparenterem
para o que quiserRespeitando as preferências do usuário
O zoom do navegador mudou muito ao longo dos anos. Historicamente, muitos navegadores apenas aumentavam de tamanho
font-size
, mas isso mudou muito rapidamente quando os sites perceberam que seus belos designs perfeitos em pixels estavam quebrando sempre que alguém aumentava ou diminuía o zoom. Nesse ponto, os navegadores escalam a página inteira, para que o zoom baseado em fonte fique fora de cena.Respeitar os desejos de um usuário não está fora de cena. Só porque um navegador está definido como
16px
padrão, não significa que nenhum usuário possa alterar suas preferências24px
ou32px
corrigir uma visão subnormal ou baixa visibilidade (brilho da tela). Se você basear suas unidadesrem
, qualquer usuário com tamanho de fonte mais alto verá um site proporcionalmente maior. As bordas serão maiores, o preenchimento será maior, as margens serão maiores, tudo aumentará fluidamente.Se você basear suas consultas de mídia
rem
, também poderá garantir que o site que seus usuários visualizem se encaixa na tela deles. Um usuáriofont-size
definido como32px
em um640px
navegador amplo, efetivamente verá seu site como mostrado a um usuário16px
em um320px
navegador amplo. Não há absolutamente nenhuma perda para o RWD no usorem
.Alteração do
px
valor aparentePorque
rem
é baseado nofont-size
do:root
nó, se você quiser mudar o que1rem
representa, tudo que você tem a fazer é mudar ofont-size
:Faça o que fizer, não defina o
:root
elemento defont-size
umpx
valor.Se você definir o
font-size
sobrehtml
a umpx
valor, você desintegradas as preferências do usuário sem uma maneira de recuperá-los.Se você deseja alterar o valor aparente de
rem
, use%
unidades.A matemática para isso é razoavelmente direta.
O tamanho aparente da fonte de
:root
é16px
, mas digamos que queremos alterá-lo para20px
. Tudo o que precisamos fazer é multiplicar16
por algum valor para obter20
.Configure sua equação:
E resolva para
X
:Fazer tudo em múltiplos de
20
não é tão bom assim, mas uma sugestão comum é tornar o tamanho aparenterem
igual a10px
. O número mágico para isso é10/16
qual é0.625
, ou62.5%
.O problema agora é que o padrão
font-size
para o resto da página é conjunto muito pequeno, mas há uma correção simples para isso: Definir umfont-size
embody
usarrem
:É importante observar que, com esse ajuste, o valor aparente de
rem
é o10px
que significa que qualquer valor no qual você possa ter escritopx
pode ser convertido diretamente aorem
inserir uma casa decimal.torna-se em
O tamanho aparente da fonte que você escolher depende de você; portanto, se você quiser, não há motivo para não usá-lo:
e tem
1rem
igual1px
.Então, aí está, uma solução simples para respeitar os desejos do usuário, evitando também complicar demais o seu CSS.
Espere, então qual é o problema?
Eu tinha medo que você pudesse perguntar isso. Por mais que eu queira fingir que
rem
é mágico e resolve tudo, ainda existem alguns problemas a serem observados. Nada de acordo na minha opinião , mas vou chamá-los para que você não possa dizer que não avisei.Consultas de mídia (uso
em
)Um dos primeiros problemas com os quais você se depara
rem
envolve consultas de mídia. Considere o seguinte código:Aqui, o valor das
rem
alterações depende da aplicação da consulta à mídia, e a consulta à mídia depende do valor derem
, então o que está acontecendo?rem
nas consultas de mídia, usa o valor inicial defont-size
e não deve (consulte a seção Safari) levar em consideração as alterações que possam ter ocorridofont-size
no:root
elemento. Em outras palavras, seu valor aparente é sempre16px
.Isso é um pouco chato, porque significa que você precisa fazer alguns cálculos fracionários, mas eu descobri que as consultas de mídia mais comuns já usam valores múltiplos de 16.
Além disso, se você estiver usando um pré-processador CSS, poderá usar mixins ou variáveis para gerenciar suas consultas de mídia, o que ocultará completamente o problema.
SafáriInfelizmente, existe um bug conhecido no Safari, em que alterações no
:root
tamanho da fonte realmente alteram osrem
valores calculados para os intervalos de consulta de mídia. Isso pode causar um comportamento muito estranho se o tamanho da fonte do:root
elemento for alterado em uma consulta de mídia. Felizmente, a correção é simples: useem
unidades para consultas de mídia .Troca de Contexto
Se você alternar entre vários projetos diferentes, é bem possível que o tamanho aparente da fonte
rem
tenha valores diferentes. Em um projeto, você pode estar usando um tamanho aparente de10px
onde, em outro projeto, o tamanho aparente pode estar1px
. Isso pode ser confuso e causar problemas.Minha única recomendação aqui é manter
62.5%
a conversãorem
para um tamanho aparente de10px
, porque isso tem sido mais comum em minha experiência.Bibliotecas CSS compartilhadas
Se você estiver escrevendo CSS que será usado em um site que você não controla, como para um widget incorporado, não há realmente uma boa maneira de saber qual tamanho aparente
rem
terá. Se for esse o caso, fique à vontade para continuar usandopx
.Se você ainda deseja usar
rem
, considere liberar uma versão Sass ou LESS da folha de estilo com uma variável para substituir a escala pelo tamanho aparente derem
.* Não quero assustar ninguém
rem
, mas não pude confirmar oficialmente que todos os navegadores usam16px
por padrão. Veja bem, existem muitos navegadores e não seria tão difícil para um navegador divergir um pouco, digamos15px
ou assim18px
. Nos testes, no entanto, eu não vi um único exemplo em que um navegador usando configurações padrão em um sistema usando configurações padrão tivesse outro valor além de16px
. Se você encontrar um exemplo, compartilhe comigo.fonte
matrix()
com javascript, que é o valor de conversão da matriz que está usandopx
(corrija-me se estiver errado) e estou tão confuso com isso .getComputedStyle()
mas o resultado está sempre no pixel, então tenho que dividir o resultado pelorem
valor (como 16). CMIIWrem
valor, se já tiver opx
valor correto , não há necessidade de mudar pararem
unidades para itens que já são computados para o contexto especificado.Este artigo descreve muito bem os prós e contras de
px
,em
erem
.O autor finalmente conclui que o melhor método é provavelmente usar ambos
px
erem
, declarandopx
primeiro para navegadores mais antigos e declarando novamenterem
para navegadores mais novos:fonte
px
. Quanto à unidade de elementos, a aderênciapx
seria melhor, pois normalmente você deseja dimensionar os elementos com precisão.px
é permitir o redimensionamento. Agora, se usarmosrem
, ainda precisamos fornecerpx
fallback (em navegadores mais antigos). Essencialmente, o que isso significa épx
redimensionar o suporterem
. Navegadores mais novos suportam opx
redimensionamento e, para navegadores mais antigos, de qualquer maneira que vamos usar o recursopx
. Agora, com base nessa conclusão, estou muito interessado em saber, por que usarrem
? Se eu posso ver a luz no fim do túnel.Como resposta reflexa, eu recomendaria o uso de rem, pois permite alterar o "nível de zoom" de todo o documento de uma só vez, se necessário. Em alguns casos, quando você quiser que o tamanho seja relativo ao elemento pai, use em.
Mas o suporte rem é irregular, o IE8 precisa de um polyfill e o Webkit está exibindo um bug. Além disso, o cálculo de subpixels pode fazer com que coisas como linhas de um pixel às vezes desapareçam. O remédio é codificar em pixels para elementos muito pequenos. Isso introduz ainda mais complexidade.
Portanto, no geral, pergunte a si mesmo se vale a pena - quão importante e provável é que você altere o "nível de zoom" de todo o documento no CSS?
Em alguns casos, é sim; em alguns casos, será não.
Portanto, isso depende de suas necessidades e você deve ponderar prós e contras, porque o uso de rem e em introduz algumas considerações adicionais em comparação com o fluxo de trabalho "normal" baseado em pixel.
Lembre-se de que é fácil alternar (ou melhor converter) seu CSS de px para rem (JavaScript é outra história), porque os dois blocos seguintes de código CSS produziriam o mesmo resultado:
fonte
Sim, o REM e o PX são relativos, mas outras respostas sugeriram o REM sobre o PX. Também gostaria de fazer backup usando um exemplo de acessibilidade.
Quando o usuário define um tamanho de fonte diferente no navegador, o REM automaticamente aumenta e diminui elementos como fontes, imagens etc. na página da Web, o que não é o caso do PX.
No gif abaixo, o texto do lado esquerdo é definido usando o tamanho da fonte da unidade REM, enquanto a fonte do lado direito é definida pela unidade PX.
O tamanho da fonte padrão de uma página da web é 16px, que é igual a 1 rem (somente para a página html padrão
html{font-size:100%}
, por exemplo), portanto, 1,25rem é igual a 20px.PS: quem mais está usando o REM? Frameworks CSS! como o Bootstrap 4, o Bulma CSS etc., então é melhor se dar bem com isso.
fonte
A resposta de josh3736 é boa, mas para fornecer um contraponto três anos depois:
Eu recomendo usar
rem
unidades para fontes, mesmo que isso facilite a alteração do tamanho para você , desenvolvedor. É verdade que os usuários raramente alteram o tamanho da fonte padrão em seus navegadores e que o zoom moderno do navegador aumenta aspx
unidades. Mas e se o seu chefe vier até você e disser "não amplie as imagens ou os ícones, mas aumente todas as fontes". É muito mais fácil alterar o tamanho da fonte raiz e deixar que todas as outras fontes sejam dimensionadas em relação a isso, e depois alterar ospx
tamanhos em dezenas ou centenas de regras de CSS.Acho que ainda faz sentido usar
px
unidades para algumas imagens ou para certos elementos de layout que sempre devem ter o mesmo tamanho, independentemente da escala do design.O Caniuse.com pode ter dito que apenas 75% dos navegadores quando josh3736 postaram sua resposta em 2012, mas em 27 de março eles reivindicam suporte a 93,78% . Somente o IE8 não o suporta entre os navegadores que eles rastreiam.
fonte
Only IE8 doesn't support it among the browsers they track.
Hã? A página vinculada afirma que “IE9 e IE10 não suportam unidades rem quando usadas na propriedade abreviada de fonte ou quando usadas em pseudo-elementos. IE9, 10 e 11 não suportam unidades rem quando usadas na propriedade altura da linha quando usadas em pseudo-elementos antes e depois. As bordas com tamanho real desaparecem quando a página é reduzida no Chrome. Não funciona no navegador Samsung Note II Android 4.3 e no Samsung Galaxy Tab 2 no Android 4.2. O Chrome 31-34 e o Android baseado no Chrome (como 4.4) têm um erro no tamanho da fonte quando o elemento raiz tem tamanho percentual. ”as of March 27 they claim 93.78% support.
No momento da redação deste comentário, o caniuse mostra apenas 91,79% do suporte total ao navegador. Olhando para a sua porcentagem, tenho certeza de que você também incluiu o suporte ao navegador de buggy (atualmente em 2,8%, o que poderia ser interpretado como uma cobertura geral otimista de 94,6% - mas o fato é que esses 2,8% vêm com buggy, incompleto ou mesmo completamente não apoio ... como mencionado no meu comentário anterior: cada bug sendo o resultado de diferente versão do navegador e operando combinações de sistema) Você pode querer corrigir a sua resposta em conformidade ....Eu descobri que a melhor maneira de programar os tamanhos de fonte de um site é definir um tamanho de fonte base para
body
e depois usar em's (ou rem's) para todos os outrosfont-size
que declaro depois disso. Essa é uma preferência pessoal, suponho, mas me serviu bem e também facilitou a incorporação de um design mais responsivo .Quanto ao uso de unidades rem, acho bom encontrar um equilíbrio entre ser progressivo no seu código, mas também oferecer suporte para navegadores mais antigos. Confira este link sobre o suporte ao navegador para unidades rem , que deve ajudar bastante na sua decisão.
fonte
body
tamanho da fonte e tudo muda com ela.pt
é semelhanterem
, na medida em que é relativamente fixo, mas quase sempre independente de DPI, mesmo quando navegadores não compatíveis tratampx
de maneira dependente do dispositivo.rem
varia de acordo com o tamanho da fonte do elemento raiz, mas você pode usar algo como Sass / Compass para fazer isso automaticamentept
.Se você tivesse isso:
então
1rem
sempre seria12pt
.rem
eem
são tão independentes de dispositivos quanto os elementos em que se baseiam; alguns navegadores não se comportam de acordo com as especificações e tratampx
literalmente. Mesmo nos velhos tempos da Web, 1 ponto era consistentemente considerado como 1/72 de polegada - ou seja, existem 72 pontos em uma polegada.Se você possui um navegador antigo não compatível e possui:
então
1rem
vai depender do dispositivo. Para elementos que herdariam dehtml
por padrão,1em
também seriam dependentes do dispositivo.12pt
seria o equivalente independente do dispositivo garantidamente garantido :,16px / 96px * 72pt = 12pt
where96px = 72pt = 1in
.Pode ser bastante complicado fazer as contas se você quiser se ater a unidades específicas. Por exemplo,,
.75em of html = .75rem = 9pt
e.66em of .75em of html = .5rem = 6pt
. Uma boa regra de ouro:pt
para tamanhos absolutos. Se você realmente precisa que isso seja dinâmico em relação ao elemento raiz, você está solicitando muito CSS; você precisa de uma linguagem que seja compilada para CSS, como Sass / SCSS.em
para tamanhos relativos. É bastante útil poder dizer: "Quero que a margem esquerda tenha a largura máxima de uma letra" ou "Torne o texto desse elemento um pouco maior que o ambiente".<h1>
é um bom elemento para usar um tamanho de fonte no ems, pois pode aparecer em vários lugares, mas sempre deve ser maior que o texto próximo. Dessa forma, você não precisa ter um tamanho de fonte separado para cada classe aplicadah1
: o tamanho da fonte se adaptará automaticamente.px
para tamanhos muito pequenos. Em tamanhos muito pequenos,pt
pode ficar embaçada em alguns navegadores em 96 DPI, uma vezpt
epx
não bastante alinhar. Se você deseja apenas criar uma borda fina de um pixel, diga-o. Se você tiver uma tela de alto DPI, isso não será óbvio para você durante o teste, portanto, teste-a em uma tela genérica de 96 DPI em algum momento.fonte
Metade (mas apenas metade) da resposta sarcástica (a outra metade é um desdém amargo da realidade da burocracia):
Use vh
Tudo é sempre dimensionado para a janela do navegador.
Sempre permita rolar para baixo, nunca para o lado.
Defina a largura do corpo como 50vh estático e nada flutua ou interrompe a div principal. E estilize apenas usando tabelas para que tudo seja mantido rigidamente no lugar, conforme o esperado. Inclua uma função javascript para desfazer qualquer atividade ctrl +/- que o usuário possa fazer.
Todo mundo vai te odiar, exceto as pessoas que dizem para você fazer as coisas combinarem com a sua maquete, e elas ficam em êxtase. E todo mundo sabe que sua opinião é a única que importa.
fonte
Sim. Ou melhor, não.
Quer dizer, isso não importa. Use o que faz sentido para o seu projeto em particular. PX e EM ou ambos igualmente válidos, mas se comportarão um pouco diferente, dependendo da arquitetura CSS da página em geral.
ATUALIZAR:
Para esclarecer, afirmo que geralmente não importa qual você use. Às vezes, você pode querer escolher um especificamente sobre o outro. Os EMs são bons se você pode começar do zero e quiser usar um tamanho de fonte base e tornar tudo relativo a isso.
Os PXs geralmente são necessários quando você está adaptando uma reformulação em uma base de código existente e precisa da especificidade de px para evitar problemas de aninhamento incorretos.
fonte
os são o caminho a seguir, não apenas para fontes, mas você pode usá-los com caixas, espessura de linha e outras coisas também, por que?
Simplificando, os em são os únicos que são escalonados em uníssono com as teclas alt + e alt- no navegador para aplicar zoom.
Outras medidas são dimensionadas, mas não tão limpas quanto um em.
Em uma nota lateral, se você quiser o melhor em escala, também converta seus gráficos em SVG com base em vetor sempre que possível, pois eles também serão redimensionados com a taxa de zoom do navegador.
fonte
Os EMs são a única coisa que pode ser dimensionada para consultas de mídia que lidam com +/- escala, o que as pessoas fazem o tempo todo, não apenas as cegas. Aqui está outra demonstração profissional muito bem escrita de por que isso importa.
A propósito, é por isso que o Zurb Foundation usa o ems , enquanto o Bootstrap 3 inferior ainda usa pixels.
fonte