Advertisement
  1. Web Design
  2. UX/UI
  3. Responsive Design

Guida completa: Quando utilizzare Em vs. Rem

Scroll to top
Read Time: 15 min

() translation by (you can also view the original English article)

Potrete essere giunti a patti con l'utilizzo flessibile delle unità di misura, ma potrebbe non ancora esservi chiaro quando utilizzare rem e quando utilizzare em. Questo tutorial vi aiuterà a capirlo!

Sia rem che em sono unità flessibili, scalabili, che vengono tradotte dal browser in valori in pixel, a seconda delle impostazioni di dimensione del carattere nel vostro design. Se utilizzate un valore di 1em o 1rem, ciò potrebbe essere tradotto nel browser come qualcosa tra 16px e 160px o qualsiasi altro valore.

filefilefile
Padding CSS impostato a 1em
filefilefile
Calcolato a 16px
filefilefile
Padding CSS impostato a 1em
filefilefile
Calcolato a 160px

D'altra parte valori in px vengono utilizzati dal browser così come sono, pertanto 1px viene sempre visualizzato come esattamente 1px.

Provate il dispositivo di scorrimento in questo esempio in CodePen per vedere come il valore di unità rem ed em può essere tradotto in valori in pixel differenti, mentre le unità px impostate in modo esplicito rimangono fisse nel formato:

La grande domanda

L'utilizzo delle unità em e rem garantisce flessibilità al nostro design, e la possibilità di aumentare e rimpicciolire gli elementi, invece di rimanere bloccati con misure fisse. Possiamo usare questa flessibilità per rendere i nostri designs più facili da regolare durante lo sviluppo, più responsive e per consentire agli utenti di controllare la scala generale dei siti per la massima leggibilità.

Entrambe le unità em e rem forniscono questa flessibilità e funzionano in modo simile, quindi la grande domanda è, quando dovremmo usare valori em e quando dovremmo usare valori rem?

Differenza cruciale

La differenza tra le unità em e rem consiste in come il browser determina il valore px nel quale vengono tradotte. Comprendere questa differenza è la chiave per determinare quando utilizzare ciascuna unità.

Abbiamo intenzione di iniziare a lavorare con le unità rem ed em dalle basi per assicurarci che conosciate ogni minimo dettaglio. Poi ci sposteremo sul perché si dovrebbero usare le unità em o le unità rem.

Infine vedremo un'applicazione pratica su esattamente quali elementi di un design tipico è necessario utilizzare ogni tipo di unità.

Come le unità rem vengono tradotte in Pixel

Quando si utilizzano unità rem, la dimensione in pixel in cui vengono tradotte dipende dalla dimensione del carattere dell'elemento principale della pagina, ovvero l'elemento html. Quella dimensione di carattere viene moltiplicata per qualsiasi numero stiate usando con le unità rem.

Ad esempio, con una dimensione di carattere dell'elemento principale di 16px, 10rem sarebbe pari a 160px, cioè 10 x 16 = 160.

filefilefile
Padding CSS impostato a 10rem
filefilefile
Calcolato in 160px

Come le unità em vengono tradotte in Pixel

Quando si utilizzano unità em, il valore in pixel finale è una moltiplicazione della dimensione del font sull'elemento cui si applica lo stile.

Ad esempio, se un div ha una dimensione di carattere di 18px, 10em sarebbe pari a 180px, cioè 10 x 18 = 180.

filefilefile
Padding CSS impostato a 10em
filefilefile
Calcolato in 180px (o circa)

Importante da sapere:

Si tratta di un equivoco piuttosto diffuso che le unità em siano relative alla dimensione di carattere dell'elemento padre. Infatti, secondo le specifiche W3, sono relative alla dimensione carattere "dell'elemento su cui vengono utilizzate".

Le dimensioni del carattere dell'elemento padre possono influenzare i valori em, ma quando ciò accade è unicamente a causa dell'ereditarietà. Diamo un'occhiata al perché e vediamolo in azione.

L'effetto dell'ereditarietà sulle unità em

Lavorare con le unità em può risultare complicato quando si tratta di ereditarietà, perché ogni elemento eredita automaticamente la dimensione del carattere dell'elemento padre. L'effetto dell'ereditarietà può essere sottoposto a override solo impostando in modo esplicito una dimensione di carattere con un'unità non soggetta a ereditarietà, ad esempio px o vw.

La dimensione del carattere dell'elemento su cui vengono utilizzate le unità em determina la loro dimensione. Ma tale elemento può avere ereditato una dimensione del carattere da suo padre, che ha ereditato una dimensione del carattere da suo padre e così via. In questo modo è possibile per qualsiasi valore di em essere affetto dalla dimensione del carattere di uno qualsiasi dei suoi genitori.

Diamo un'occhiata a un esempio. Sentitevi liberi di provare in CodePen finché affrontiamo questo argomento. Andando avanti, è possibile utilizzare Chrome Developer Tools o Firebug per Firefox per controllare come vengono calcolati i valori in pixel delle nostre unità em.

Esempio di ereditarietà in em

Se abbiamo una pagina con una dimensione del carattere di 16px (solitamente il valore predefinito) e un div figlio all'interno di esso con padding di 1.5em, quel div erediterà la dimensione del carattere di 16px dall'elemento principale. Quindi il suo padding risulterà di 24px, cioè 1.5 x 16 = 24.

Quindi cosa succede se inseriamo un altro div che include il primo e impostiamo il suo font-size a 1.25em?

Il nostro div erediterà la dimensione del carattere di 16px e lo moltiplicherà per il proprio font-size di 1.25em. Ciò porterà il div ad avere una dimensione pari a 20px, cioè 1,25 x 16 = 20.

Ora il nostro div originale non erediterà direttamente dall'elemento principale, ma erediterà una dimensione pari a 20px dal suo nuovo div padre. Il suo valore in padding di 1.5em ora equivale a 30px, cioè 1,5 x 20 = 30.

Questo effetto di ridimensionamento può essere ulteriormente aggravato se aggiungiamo una dimensione di carattere em basato sul nostro div originale, diciamo 1.2em.

Il div eredita la dimensione del carattere di 20px dal padre, poi lo moltiplica per 1.2em, dandogli una nuova dimensione di 24px, cioè 1,2 x 20 = 24.

Il padding di 1.5em del div ora cambierà dimensioni nuovamente con la nuova dimensione del carattere, questa volta di 36px, cioè 1,5 x 24 = 36.

Infine, per illustrare ulteriormente che l'unità em è relativa alla dimensione di carattere dell'elemento su cui viene usata, (non l'elemento padre), vediamo cosa succede al nostro padding di 1.5em se abbiamo impostato in modo esplicito il div in modo da utilizzare una dimensione pari a 14px, un valore non soggetto a ereditarietà.

Ora, il nostro padding è sceso a 21px, cioè 1.5 x 14 = 21. Non è influenzata dalla dimensione di carattere dell'elemento padre.

Con tutto questo potenziale per la complessità, si può capire perché sia importante saper utilizzare l'unità em in modo gestibile.

L'effetto delle impostazioni del Browser sul font size dell'elemento HTML

Per impostazione predefinita i browsers di solito hanno una dimensione di carattere di 16px, ma può essere modificata dall'utente in qualsiasi valore tra 9px e 72px .

filefilefile

Importante da sapere:

L'elemento html eredita la dimensione del font dalle impostazioni del browser, a meno che non venga sottoposto a override con un valore fisso impostato in modo esplicito.

Quindi mentre la dimensione del carattere nell'elemento html è quello che determina direttamente i valori rem, quella dimensione del carattere può provenire dalle impostazioni del browser.

Così le impostazioni di dimensione di carattere del browser possono influenzare il valore di ogni unità rem utilizzata in un design, come anche ogni unità em tramite ereditarietà.

Effetto delle impostazioni del browser quando nessun Font Size HTML è impostato

A meno che non sottoposto a override, sarà l'elemento html ad ereditare qualunque tipo di impostazione predefinita abbia il browser come dimensione di carattere. Ad esempio, prendiamo un sito dove nessuna proprietà font-size è impostata sull'elemento html.

Se un utente ha il browser impostato alla dimensione di carattere predefinita di 16px, la dimensione di carattere principale sarà 16px. In Chrome Developer Tools si può vedere ciò che ha ereditato un elemento selezionando Show inherited properties nella tab Computed.

filefilefile

In questo caso 10rem equivale a 160px, cioè 10 x 16 = 160.

Se l'utente aumenta la dimensione del font del browser fino a 18px, la dimensione del carattere principale diventerà 18px. Ora 10rem si tradurrà in 180px, cioè 10 x 18 = 180.

filefilefile

Effetto delle impostazioni del browser con le unità em sul Font Size HTML

Quando una dimensione di carattere basata su em è impostata sull'elemento html, il valore in pixel in cui si traduce sarà un multiplo dell'impostazione di dimensione di carattere del browser.

Ad esempio, se l'elemento html del sito avesse una proprietà font-size impostata a 1.25em, la dimensione del carattere principale sarebbe 1,25 volte l'impostazione del font-size del browser.

Se la dimensione del carattere del browser fosse impostata a 16px, la dimensione del carattere principale sarebbe 20px, cioè 1,25 x 16 = 20.

filefilefile

In questo caso 10rem sarebbe uguale a 200px, cioè 10 x 20 = 200.

filefilefile

Tuttavia, se la dimensione del carattere del browser fosse impostata a 20px, la dimensione di carattere principale si tradurrebbe in 25px, cioè 1,25 x 20 = 25.

filefilefile

Ora 10rem sarebbe uguale a 250px, cioè 10 x 25 = 250.

filefilefile

Riassumendo le differenze tra em e rem

Tutto ciò che abbiamo visto porta a ciò che segue:

  • La traduzione di unità rem in valori pixel è determinata dalla dimensione del carattere dell'elemento html. Questa dimensione del carattere è influenzata per ereditarietà dall'impostazione di dimensione di carattere del browser a meno che non sottoposta a override in modo esplicito con un'unità non soggetta ad ereditarietà.

  • La traduzione di unità em in valori in pixel è determinata dalla dimensione del carattere dell'elemento su cui vengono usate. Questa dimensione del carattere è influenzata per ereditarietà da elementi padre a meno che non sottoposta a override in modo esplicito con un'unità non soggetta ad ereditarietà.

Perché usare unità rem:

Il più grande vantaggio che offrono le unità rem non consiste solo nel fatto forniscono un dimensionamento coerente indipendentemente dall'ereditarietà dell'elemento. Piuttosto, ci forniscono un metodo per fare in modo che le impostazioni utente della dimensione di carattere influenzino ogni singolo aspetto del layout di un sito utilizzando unità rem dove eravamo abituati a utilizzare unità px.

Per questo motivo lo scopo principale dell'utilizzo di unità rem dovrebbe essere quello di assicurare che qualsiasi impostazione un utente abbia sul proprio browser, il layout si regolerà per adattare la dimensione del testo all'interno di esso.

Un sito può essere progettato concentrandosi inizialmente sulla dimensione di carattere predefinita e più comune del browser di 16px.

filefilefile
Font Size del Browser a 16px

Ma utilizzando unità rem, se un utente aumenterà la dimensione del carattere, verrà mantenuta l'integrità del layout, e il testo non verrà schiacciato in uno spazio fisso pensato per un testo più piccolo.

filefilefile
Font Size del Browser a 34px

E se l'utente ridurrà la dimensione del carattere, l'intero layout si ridimensionerà, e non si verrà lasciati con una minuscola parte di testo in un deserto di spazi vuoti.

filefilefile
Font Size del Browser a 9px

Gli utenti modificano le impostazioni di dimensione del carattere per ogni tipo di ragione, dalla vista sforzata alla scelta di impostazioni ottimali per i dispositivi che possono essere notevolmente differenti in dimensione e distanza di visione. Scegliere queste impostazioni consente una migliore esperienza utente.

Importante da sapere:

Alcuni progettisti utilizzano layout basati su rem in combinazione con un'impostazione fissa di font-size in unità px sull'elemento html. Ciò avviene generalmente in modo che un cambiamento di dimensione del carattere nell'elemento html possa far aumentare o diminuire complessivamente il design.

Sconsigliamo vivamente questo approccio perché esegue l'override della dimensione di carattere dell'elemento html ereditata dalle impostazioni del browser dell'utente. Quindi ciò impedisce alle impostazioni di avere qualsiasi effetto e rimuove la possibilità dell'utente di ottimizzare la miglior visibilità.

Se si desidera modificare la dimensione del carattere nell'elemento html, fatelo con un valore di em o rem in modo che la dimensione del carattere principale sia un multiplo delle impostazioni di dimensione del carattere del browser dell'utente.

Ciò vi permetterà di ridimensionare il vostro design modificando la dimensione di carattere dell'elemento html, ma manterrete l'effetto delle impostazioni del browser dell'utente.

Perché usare unità em

Il valore aggiunto che offrono le unità em consiste nel fatto che permettono valori di dimensionamento determinati da una dimensione di carattere diversa da quella dell'elemento html.

Per questo motivo, lo scopo principale delle unità em dovrebbe essere quello di consentire scalabilità all'interno del contesto di un elemento di design specifico.

Ad esempio, è possibile impostare padding, margin e line-height intorno a una voce di menu di navigazione per utilizzare valori em.

filefilefile
Menu con font size a 0.9rem

In questo modo se si modifica la dimensione del carattere del menu la spaziatura attorno alle voci di menu verrà ridimensionata proporzionalmente, indipendentemente dal resto del layout.

filefilefile
Menu con font size a 1.2rem

Nella sezione precedente sull'ereditarietà avete visto quanto velocemente tener traccia delle unità em possa sfuggire di mano. Per questo motivo, consigliamo di utilizzare solo unità em se si identifica una ben definita necessità.

Applicazione pratica

Potrebbe esserci qualche dibattito tra web designers e siamo sicuri che persone diverse hanno diversi approcci preferiti, tuttavia la nostra raccomandazione è la seguente.

Usate unità em per:

Qualsiasi ridimensionamento che dovesse scalare a seconda della dimensione del carattere di un elemento diverso dall'elemento principale.

In linea generale, l'unico motivo che avrete per utilizzare unità em sarà per ridimensionare un elemento che non ha ridimensionamento di carattere predefinito.

Secondo il nostro esempio precedente, componenti di design come voci di menu, pulsanti, e intestazioni avranno dimensioni di carattere esplicitamente dichiarato. Se venissero modificate queste dimensioni di carattere, vorrete che l'intero componente scali proporzionalmente.

Questa linea guida si applica alle impostazioni delle proprietà comuni margin, padding, width, height e line-height, quando utilizzata su elementi con font-size non predefinito.

Raccomandiamo, quando si utilizzano unità em, che la dimensione del carattere dell'elemento su cui vengono utilizzate sia impostato in unità rem per preservare la scalabilità, evitando confusione legata all'ereditarietà.

In genere non utilizzate unità em per le dimensioni di carattere

È abbastanza comune vedere unità em utilizzate per il ridimensionamento, in particolare nelle intestazioni, tuttavia vorremmo far presente che i designs sono più gestibili se le unità rem sono utilizzate per la dimensione dei caratteri.

Il motivo per cui le intestazioni spesso utilizzano unità em consiste nel fatto che sono una scelta migliore delle unità px, essendo relative alle dimensioni di testo normale. Tuttavia le unità rem possono raggiungere questo obiettivo altrettanto bene. Se viene apportata qualsiasi regolazione della dimensione del carattere all'elemento html, le dimensioni dell'intestazione scaleranno anch'esse.

Provate a cambiare la dimensione del carattere di em sull'elemento html in questo CodePen per vedere voi stessi:

Più spesso che no, non vogliamo che le dimensioni dei nostri font scalino a seconda di elementi diversi da quello principale, con solo poche eccezioni.

Un esempio dove potremmo desiderare una dimensione di carattere in em potrebbe essere un menu drop down, dove abbiamo voci di secondo livello del menu con dimensioni che dipendono dalle dimensioni del carattere del primo livello. Un altro esempio potrebbe essere un'icona utilizzata all'interno di un pulsante, dove la dimensione dell'icona dovrebbe fare riferimento alla dimensione del testo del pulsante.

Tuttavia la maggior parte di elementi in un web design non tenderanno ad avere questo tipo di requisito, così generalmente vorrete utilizzare unità rem per il font sizing, utilizzando unità em solo dove richiesto.

Utilizzate unità rem per:

Qualsiasi ridimensionamento che non necessita di unità em per i motivi descritti sopra, e che dovrebbe scalare a seconda delle impostazioni di dimensione del carattere del browser.

Ciò conta per quasi tutto in un design standard incluse la maggior parte delle altezze, larghezze, padding, margini, larghezze bordo, dimensioni dei caratteri, ombre, praticamente quasi ogni parte del layout.

In poche parole, tutto ciò che può essere reso scalabile con unità rem, dovrebbe esserlo.

Suggerimento

Durante la creazione di layout è spesso più facile pensare in pixel ma usare unità rem.

È possibile avere automaticamente pixel calcolati in rem tramite un preprocessore come Stylus / Sass / Less, o un postprocessor come PostCSS con il plugin PXtoRem.

In alternativa, è possibile utilizzare PXtoEM per eseguire manualmente le conversioni.

Utilizzate sempre Media Queries rem

Importante, quando si utilizzano unità rem per creare un design scalabile in modo uniforme, le media queries dovrebbero essere in unità rem. Questo farà sì che qualunque misura di font abbia il browser di un utente, le media queries risponderanno e modificheranno il layout.

Ad esempio, se un utente ridimensiona il testo troppo grande, potrebbe essere necessario ridimensionare il layout da due colonne a una singola colonna, proprio come potrebbe essere visualizzato su un più piccolo dispositivo mobile.

Se i breakpoints sono a larghezze in pixel fissi, solo una diversa dimensione del viewport può attivarli. Tuttavia con i breakpoints basati su rem risponderanno a tipi diversi di dimensione di carattere.

Non utilizzate em o rem per:

Larghezze di Layout Multi Colonna

Larghezze di colonne in un layout dovrebbero essere basate su % così potranno adattarsi fluidamente a dimensioni del viewport imprevedibili.

Tuttavia singole colonne dovrebbero ancora incorporare valori rem tramite un'impostazione max-width.

Per esempio:

1
.container {
2
    width: 100%;
3
    max-width: 75rem;
4
}

Ciò mantiene la colonna flessibile e scalabile, ma impedisce di farla diventare troppo ampia per il testo all'interno in modo che rimanga comodamente leggibile.

Quando un elemento dovrebbe essere rigorosamente non scalabile

In un tipico web design non ci saranno molte parti del layout che non possano essere progettate per la scalabilità. Tuttavia occasionalmente si incontrano elementi che realmente necessitano l'utilizzo di valori espliciti fissi ai fini di prevenire il ridimensionamento.

La precondizione per impiegare i valori di ridimensionamento fisso dovrebbe essere che se l'elemento in questione scalasse si spezzerebbe. Ciò non accade spesso, quindi prima di essere tentati dall'utilizzo delle unità px, chiedetevi se non sia assolutamente indispensabile.

Riassumendo

Facciamo un riassunto rapido di ciò che abbiamo visto:

  • Le unità rem ed em sono calcolate in valori in pixel dal browser, basandosi sulle dimensioni di carattere nel vostro design.
  • Le unità em si basano sulla dimensione del carattere dell'elemento su cui vengono usate.
  • Le unità rem si basano sulla dimensione del carattere dell'elemento html.
  • Le unità em possono essere influenzate dall'eredità di dimensioni carattere di elementi padre
  • Le unità rem possono essere influenzate dall'eredità di dimensioni carattere delle impostazioni del browser.

  • Utilizzate unità em per il dimensionamento che dovrebbe scalare a seconda delle dimensioni del carattere di un elemento diverso dal principale.
  • Utilizzate unità rem per il dimensionamento che non ha bisogno di unità em, e che dovrebbe scalare a seconda delle impostazioni di dimensione carattere del browser.
  • Utilizzate unità rem a meno che non siate sicuri di aver bisogno di unità em, anche per le dimensioni dei caratteri.
  • Utilizzate unità rem per le media queries
  • Non utilizzate em o rem in larghezze di layout multi colonna - usate invece %.
  • Non utilizzate em o rem se il ridimensionamento inevitabilmente causerebbe la rottura di un elemento del layout.

Speriamo ora abbiate un quadro completo e concreto su come funzionino le unità em e rem e sappiate come sfruttarle al meglio nei vostri designs.

Vi incoraggiamo a provare le linee guida contenute in questo tutorial per voi stessi e a godere della completa scalabilità e reattività dei layouts che vi consentiranno di creare.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.