U bent misschien wel eens geraakt met het gebruik van flexibele maateenheden, maar u begrijpt nog steeds niet volledig wanneer u het moet gebruiken rem
en wanneer te gebruiken em
. Deze tutorial helpt je erachter te komen!
Beide em
en rem
zijn flexibele, schaalbare eenheden die door de browser worden omgezet in pixelwaarden, afhankelijk van de instellingen van de tekengrootte in uw ontwerp. Als u een waarde van gebruikt 1em
of 1rem
, het zou in de browser kunnen vertalen als iets van 16px
naar 160px
of enige andere waarde.
Anderzijds px
waarden worden door de browser gebruikt zoals deze is, dus 1px
zal altijd precies zo weergeven 1px
.
Probeer de schuifregelaar uit dit CodePen-voorbeeld om te zien hoe de waarde van rem
en em
eenheden kunnen worden vertaald in verschillende pixelwaarden, terwijl ze expliciet worden ingesteld px
eenheden blijven vast in grootte:
Gebruik makend van em
en rem
units geeft ons flexibiliteit in onze ontwerpen en de mogelijkheid om elementen op en neer te schalen, in plaats van vast te zitten met vaste maten. We kunnen deze flexibiliteit gebruiken om onze ontwerpen tijdens de ontwikkeling gemakkelijker aan te passen, reageren sneller en stellen browsergebruikers in staat om de algehele schaal van sites te regelen voor maximale leesbaarheid.
Beide em
en rem
eenheden bieden deze flexibiliteit en werken op vergelijkbare manieren, dus de grote vraag is, wanneer moeten we gebruiken em
waarden en wanneer moeten we gebruiken rem
waarden?
Het verschil tussen em
en rem
eenheden bepaalt de manier waarop de browser de px
waarde waar ze naar vertalen. Inzicht in dit verschil is de sleutel tot het bepalen wanneer elke eenheid moet worden gebruikt.
We zullen beginnen door erover na te gaan rem
en em
eenheden werken vanaf de grond om ervoor te zorgen dat u elk detail kent. Daarna gaan we verder waarom je zou ... moeten gebruiken em
of rem
units.
Ten slotte bekijken we de praktische toepassing van precies welke elementen van een standaardontwerp u elk type eenheid moet gebruiken.
rem
Eenheden Vertalen naar PixelwaardenTijdens gebruik rem
eenheden, de pixelgrootte die ze vertalen, hangt af van de lettergrootte van het rootelement van de pagina, d.w.z. de html
element. Die basislettergrootte wordt vermenigvuldigd met het nummer dat u gebruikt met uw rem
eenheid.
Bijvoorbeeld met een lettertype van het hoofdelement van 16px
, 10rem
zou gelijkstellen 160px
, d.w.z. 10 x 16 = 160.
em
Eenheden Vertalen naar PixelwaardenTijdens gebruik em
eenheden, de pixelwaarde waarmee u eindigt, is een vermenigvuldiging van de tekengrootte op het element dat wordt opgemaakt.
Als een div bijvoorbeeld een lettergrootte heeft van 18px
, 10em
zou gelijkstellen 180px
, d.w.z. 10 x 18 = 180.
Het is een enigszins wijdverspreide misvatting dat em
eenheden zijn relatief ten opzichte van de tekengrootte van het bovenliggende element. In feite zijn deze volgens de W3-specificatie relatief ten opzichte van de lettergrootte "van het element waarop ze worden gebruikt".
Lettergrootte van ouderbestanddelen kan effect em
waarden, maar wanneer dat gebeurt, is het alleen vanwege overerving. Laten we eens kijken waarom, en kijken hoe dit in actie werkt.
em
eenhedenWerken met em
eenheden kunnen lastig worden als het gaat om overerving, omdat elk element automatisch de lettertypegrootte van het bovenliggende element erft. Het effect van overerving kan alleen worden opgeheven door expliciet een lettergrootte in te stellen met een eenheid die niet wordt overgeërfd, zoals px
of vw
.
De lettergrootte van het element waarop em
eenheden worden gebruikt bepaalt hun grootte. Maar dat element heeft mogelijk een lettertypegrootte geërfd van het bovenliggende element, dat een tekengrootte heeft overgenomen van het bovenliggende element, enzovoort. Als zodanig is het mogelijk voor iedereen em
waarde die moet worden bereikt door de tekengrootte van een van de ouders.
Laten we een voorbeeld bekijken. Voel je vrij om dit uit te proberen in CodePen als je er doorheen stapt. Terwijl u verdergaat, gebruikt u de Chrome-ontwikkelaarstools of Firebug voor Firefox om de pixelwaarden te inspecteren em
eenheden worden berekend.
em
ErfenisAls we een pagina hebben met een rootlettergrootte van 16px
(meestal de standaardwaarde) en een onderliggende div erin met opvulling van 1.5em
, die div zal de lettergrootte van erven 16px
van het wortelelement. Vandaar zijn vulling zal vertalen naar 24px
, d.w.z. 1,5 x 16 = 24.
Wat gebeurt er als we een andere div om de eerste wikkelen en die instellen lettertypegrootte
naar 1.25em
?
Onze wrapper div erft de rootlettergrootte van 16px
en vermenigvuldigt dat met zijn eigen lettertypegrootte
instelling van 1.25em
. Dit stelt de div in op een lettergrootte van 20px
, d.w.z. 1,25 x 16 = 20.
Nu neemt onze oorspronkelijke div niet direct meer over van het rootelement, maar erft een lettergrootte van 20px
van zijn nieuwe parent div. De opvulwaarde van 1.5em
komt nu overeen met 30px
, d.w.z. 1,5 x 20 = 30.
Dit schaaleffect kan nog worden verergerd als we een toevoegen em
gebaseerd lettertype op onze originele div, laten we zeggen 1.2em
.
De div erft de 20px
lettertypegrootte van zijn ouder, vermenigvuldigt dat met zijn eigen 1.2em
instelling, waardoor het een nieuwe lettergrootte krijgt van 24px
, d.w.z. 1,2 x 20 = 24.
De 1.5em
padding op onze div verandert nu weer in grootte met de nieuwe lettergrootte, deze keer naar 36px
, d.w.z. 1,5 x 24 = 36.
Tot slot, om dat verder te illustreren em
eenheden zijn relatief ten opzichte van de lettergrootte van het element waarop ze worden gebruikt, (niet het bovenliggende element), laten we eens kijken wat er gebeurt met onze opvulling van 1.5em
als we expliciet de div instellen om een lettergrootte van te gebruiken 14px
, een waarde die niet onderhevig is aan overerving.
Nu is onze opvulling gezakt naar 21px, d.w.z. 1.5 x 14 = 21. Het wordt niet beïnvloed door de lettergrootte van het bovenliggende element.
Met al dit potentieel voor complicaties, kunt u zien waarom het belangrijk is om te weten hoe te gebruiken em
eenheden op een beheersbare manier.
Standaard hebben browsers meestal een lettergrootte van 16px, maar dit kan door de gebruiker van 9 naar 72 px worden gewijzigd.
De wortel html
element neemt de lettergrootte over van de instellingen in de browser, tenzij deze wordt overschreven met een expliciet ingestelde vaste waarde.
Dus terwijl de lettergrootte op de html
element is wat direct bepaalt rem
waarden, die lettergrootte mogelijk het eerst afkomstig is van browserinstellingen.
De instellingen van de browserlettergrootte kunnen dus de waarde van elke effect beïnvloeden rem
eenheid gebruikt in een ontwerp, evenals elke em
eenheid via overerving.
Tenzij ze worden overschreven, de html
element het zal erven ongeacht de standaardinstelling van de tekengrootte in de browser is. Laten we bijvoorbeeld een site nemen waar nee lettertypegrootte
eigenschap is ingesteld op de html
element.
Als een gebruiker zijn browser heeft met de standaardlettergrootte 16px, is de rootlettertypegrootte 16px. In Chrome-ontwikkelaarstools kun je zien wat een element heeft geërfd door te controleren Overgenomen eigenschappen weergeven onder de berekende tab.
In dit geval 10rem
komt overeen met 160px
, d.w.z. 10 x 16 = 160.
Als de gebruiker de lettertypegrootte van de browser tot 18px ongedaan maakt, wordt de rootlettergrootte 18px. Nu 10rem
vertaald naar 180px
, d.w.z. 10 x 18 = 180.
em
Eenheid HTML-lettertypegrootteWanneer een em
op basis van de lettergrootte wordt ingesteld op de html
element, de pixelwaarde die het vertaalt, is een veelvoud van de instelling van de lettergrootte van de browser.
Bijvoorbeeld als de site is html
element had een lettertypegrootte
eigenschap ingesteld op 1.25em
, de hoofdlettergrootte zou 1,25 keer de instelling van de lettergrootte van de browser zijn.
Als de lettergrootte van de browser is ingesteld op 16px
, de root-lettergrootte zou eruit zien als 20px
, d.w.z. 1,25 x 16 = 20.
In dit geval 10rem
zou gelijk zijn 200px
, d.w.z. 10 x 20 = 200.
Als de lettergrootte van de browser echter is ingesteld op 20px
, de root-lettergrootte zou in plaats daarvan naar vertalen 25px
, d.w.z. 1,25 x 20 = 25.
Nu 10rem
zou gelijk zijn 250px
, d.w.z. 10 x 25 = 250.
em
vs. rem
VerschilWaar het allemaal op neer komt is dit:
Vertaling van rem
eenheden naar pixelwaarde wordt bepaald door de lettergrootte van de html
element. Deze lettergrootte wordt beïnvloed door overname van de instelling van de lettergrootte van de browser, tenzij deze expliciet wordt overschreven door een eenheid die niet wordt overgeërfd.
Vertaling van em
eenheden tot pixelwaarden wordt bepaald door de lettergrootte van het element waarop ze worden gebruikt. Deze lettergrootte wordt beïnvloed door overerving van bovenliggende elementen, tenzij deze expliciet wordt overschreven door een eenheid die niet wordt overgeërfd.
rem
units:De grootste kracht die rem
Eenheidsaanbieding is niet alleen dat ze een consistente dimensionering geven, ongeacht het overerven van elementen. Het is eerder zo dat ze ons een manier geven om de instellingen van de gebruikerslettertypegrootte elk aspect van de lay-out van een site te laten beïnvloeden door te gebruiken rem
eenheden waar we vroeger gebruik van maakten px
units.
Om deze reden is het primaire doel van het gebruik rem
eenheden moeten ervoor zorgen dat, ongeacht de standaardlettergrootte waar een gebruiker zijn browser op heeft ingesteld, de lay-out wordt aangepast aan de grootte van de tekst erin.
Een site kan in eerste instantie worden ontworpen met de focus op de standaardbrowser-lettertypegrootte van 16px.
Browser lettertype 16pxMaar door te gebruiken rem
eenheden, als een gebruiker de lettergrootte verhoogt, blijft de integriteit van de lay-out behouden en wordt de tekst niet samengedrukt in een stijve ruimte bedoeld voor kleinere tekst.
En als de gebruiker de lettergrootte verkleint, wordt de hele lay-out verkleind en blijven ze niet achter met een klein beetje tekst in een woestenij van witte ruimte.
Browser lettertype 9pxGebruikers veranderen de instellingen voor lettertypegrootte om allerlei redenen, van gespannen gezichtsvermogen tot het kiezen van optimale instellingen voor apparaten die enorm verschillen in grootte en kijkafstand. Het aanpassen van deze instellingen zorgt voor veel betere gebruikerservaringen.
Sommige ontwerpers gebruiken rem
op basis van lay-outs in combinatie met een vaste px
eenheid lettertypegrootte
instellen op de html
element. Dit wordt meestal gedaan zodat een verandering van lettergrootte op de html
element kan globaal het ontwerp naar boven of beneden schalen.
Ik raad dit ten zeerste af omdat het de lettergrootte overschrijdt html
element erft van de browserinstellingen van de gebruiker. Dit voorkomt dus dat de instellingen enig effect hebben en verwijdert de mogelijkheid van de gebruiker om te optimaliseren voor de beste weergave.
Als u de lettergrootte wilt wijzigen op de html
element, doe dit met een em
of rem
waarde als de root-lettergrootte zal dan nog steeds een veelvoud zijn van de browser lettertype-instelling van de gebruiker.
Hiermee kunt u uw ontwerp nog steeds naar boven of naar beneden schalen door uw html
de lettergrootte van het element, maar u behoudt het effect van de browserinstellingen van de gebruiker.
em
eenhedenDe sleutelwaarde em
Eenheidsaanbieding is dat ze de maatwaarden kunnen bepalen door een andere lettergrootte dan die van de html
element.
Om deze reden is het primaire doel van em
eenheden moeten schaalbaarheid mogelijk maken in de context van een specifiek ontwerpelement.
U kunt bijvoorbeeld de vulling
, marge
en lijnhoogte
rond een navigatiemenu-item om te gebruiken em
waarden.
Op deze manier, als u de lettergrootte van het menu wijzigt, wordt de afstand tussen de menu-items verhoudingsgewijs geschaald, onafhankelijk van de rest van de lay-out.
Menu met 1.2rem lettergrootteIn het eerdere gedeelte over erfenis zag je hoe snel het bijhouden van em
eenheden kunnen uit de hand lopen. Om deze reden, adviseer ik enkel en alleen gebruik makend van em
eenheden als u een duidelijke behoefte aan hen vaststelt.
Er is misschien een discussie tussen webontwerpers en ik weet zeker dat verschillende mensen verschillende voorkeursbenaderingen hebben, maar mijn aanbeveling is als volgt.
em
Eenheden voor:Elke maat die zou moeten schaal, afhankelijk van de lettergrootte van een ander element dan de root.
Over het algemeen is de enige reden dat u dit moet gebruiken em
eenheden is om een element te schalen dat niet standaard de lettergrootte heeft.
Zoals in ons voorbeeld hierboven, kunnen ontwerpcomponenten zoals menu-items, knoppen en koppen hun eigen expliciet vermelde lettergroottes hebben. Als u deze lettergroottes wijzigt, wilt u dat het volledige onderdeel proportioneel wordt geschaald.
Gemeenschappelijke eigenschappen waarop deze richtlijn van toepassing is, zijn marge
, vulling
, breedte
, hoogte
en lijnhoogte
instellingen, indien gebruikt op elementen met niet standaard lettertypegrootte.
Ik raad aan dat als je in dienst hebt em
eenheden, moet de lettergrootte van het element waarop ze worden gebruikt worden ingesteld rem
eenheden om de schaalbaarheid te behouden, maar overervingsverwarring te voorkomen.
em
Eenheden voor lettergrootteHet is heel gewoon om te zien em
eenheden die worden gebruikt voor lettertype-opmaak, met name in rubrieken, maar ik zou willen voorstellen dat ontwerpen beter hanteerbaar zijn als rem
eenheden worden meestal gebruikt voor lettertypen.
De reden waarom rubrieken vaak worden gebruikt em
eenheden is dat ze een betere keuze zijn dan px
eenheden, in verhouding tot de normale tekstgrootte. Echter rem
eenheden kunnen dit doel even goed bereiken. Als er een aanpassing van de lettertypegrootte op de html
Er wordt een element gemaakt, de kopgroottes worden nog steeds geschaald.
Probeer de em
lettergrootte op de html
element in deze CodePen om het zelf te zien:
Vaker wel dan niet, willen we niet dat onze lettergroottes worden geschaald op basis van een ander element dan de root, met slechts enkele uitzonderingen.
Een voorbeeld waar we misschien willen em
op basis van lettertypen kan een vervolgkeuzemenu zijn, waarbij de grootte van het tekstvak op het tweede niveau is afhankelijk van de lettergrootte van het eerste niveau. Een ander voorbeeld is een lettertypepictogram dat in een knop wordt gebruikt, waarbij de grootte van het pictogram gerelateerd moet zijn aan de tekstgrootte van de knop.
De meeste elementen in een webontwerp hebben echter de neiging om dit type vereiste niet te hebben, dus u wilt dit over het algemeen gebruiken rem
eenheden voor lettergrootte, met em
eenheden alleen waar specifiek nodig.
rem
eenheden voor:Elke maat die niet nodig is em
eenheden om de hierboven beschreven redenen, en dat zou moeten schaal, afhankelijk van de instellingen van de lettertype van de browser.
Dit is goed voor bijna alles in een standaardontwerp, inclusief de meeste hoogten, de meeste breedten, de meeste opvulling, de meeste marges, randbreedten, de meeste lettergroottes, schaduwen, eigenlijk bijna elk deel van uw lay-out.
In een notendop alles wat schaalbaar gemaakt kan worden rem
eenheden zouden moeten zijn.
Bij het maken van lay-outs is het vaak gemakkelijker om in pixels te denken, maar om in te geven rem
units.
Je kunt pixel naar hebben rem
berekeningen worden automatisch uitgevoerd via een preprocessor zoals Stylus / Sass / Less of een postprocessor zoals PostCSS met de PXtoRem-plug-in.
U kunt ook PXtoEM gebruiken om uw conversies handmatig uit te voeren.
rem
Media QueriesBelangrijk, bij gebruik rem
om een uniform schaalbaar ontwerp te maken, moeten uw mediaquery's ook aanwezig zijn rem
units. Dit zorgt ervoor dat ongeacht de browserdiktergrootte van een gebruiker, uw mediaquery's erop reageren en uw lay-out aanpassen.
Als een gebruiker bijvoorbeeld tekst erg hoog schaalt, moet uw lay-out mogelijk van twee kolommen naar één kolom snappen, net als op een kleiner afgeschermd mobiel apparaat.
Als uw onderbrekingspunten vaste pixelbreedten hebben, kan alleen een andere viewportgrootte ze activeren. Echter met rem
op basis van breekpunten zullen ze ook reageren op verschillende lettertypen.
em
of rem
Voor:Kolombreedten in een lay-out moeten kenmerkend zijn %
zodat ze vloeiend kunnen passen op onvoorspelbare viewports.
Echter, enkele kolommen moeten over het algemeen nog steeds worden opgenomen rem
waarden via een Maximale wijdte
omgeving.
Bijvoorbeeld:
css .container width: 100%; maximale breedte: 75rem;
Hierdoor blijft de kolom flexibel en schaalbaar, maar wordt voorkomen dat deze te breed wordt zodat de tekst daarin gemakkelijk leesbaar is.
In een typisch webontwerp zullen er niet veel delen van uw lay-out zijn die niet kunnen worden ontworpen voor schaalbaarheid. Maar af en toe kom je elementen tegen die echt expliciete vaste waarden moeten gebruiken om schaalvergroting te voorkomen.
De voorwaarde voor het hanteren van vaste groottewaarden moet zijn dat als het betreffende element geschaald zou zijn, het zou breken. Dit komt echt niet vaak voor, dus voordat je in de verleiding komt om die uit te schakelen px
eenheden, stel jezelf de vraag of het gebruik ervan een absolute noodzaak is.
Laten we een korte samenvatting geven van wat we hebben behandeld:
rem
en em
eenheden worden door de browser omgezet in pixelwaarden, op basis van lettergroottes in uw ontwerp.em
eenheden zijn gebaseerd op de lettergrootte van het element waarop ze worden gebruikt.rem
eenheden zijn gebaseerd op de lettergrootte van de html
element.em
eenheden kunnen worden beïnvloed door overerving van lettertypen van elk bovenliggend elementrem
eenheden kunnen worden beïnvloed door de overerving van lettertypen van de instellingen van het browserlettertype.
em
eenheden voor de grootte die moeten worden geschaald afhankelijk van de tekengrootte van een ander element dan de hoofdmap.rem
eenheden voor dimensionering die niet nodig zijn em
eenheden, en dat zou moeten worden geschaald afhankelijk van de instellingen van de lettertype van de browser.rem
eenheden, tenzij je zeker weet dat je nodig hebt em
eenheden, inclusief lettergrootte.rem
eenheden op mediaquery'sem
of rem
in breedtegraden met meerdere kolommen - gebruik %
in plaats daarvan.em
of rem
als schalen onvermijdelijk zou leiden tot het breken van een lay-outelement.Ik hoop dat je nu een robuust en compleet beeld hebt opgebouwd van hoe em
en rem
eenheden werken, en via die knowhow hoe ze het beste kunnen worden gebruikt in uw ontwerpen.
Ik raad u aan om de gebruiksrichtlijnen in deze tutorial zelf te proberen en te genieten van de volwaardige schaalbaarheid en responsiviteit van de lay-outs die ze u zullen toelaten te creëren.