Het probleem
Browsers voegen automatisch extra witruimte toe boven en onder teksttekens om rekening te houden met regelhoogte en lettertypespecifieke statistieken, zoals stok- en staartletters. Door deze 'spookruimte' is het onmogelijk om een pixel-perfecte verticale uitlijning te bereiken met standaard css.
Veelvoorkomende problemen zijn:
- Niet-uitgelijnde iconen: Tekst verschijnt visueel lager of hoger dan een aangrenzend icoon, zelfs als je
align-items: centergebruikt. - Onjuiste opvulling: Een knop met
padding: 12pxlijkt visueel meer ruimte aan de boven- of onderkant te hebben vanwege de interne regelafstand van het lettertype. - Uitlijning: Je kunt de bovenkant van een hoofdletter niet precies uitlijnen met de bovenkant van een container of een aangrenzende afbeelding zonder negatieve marges met een 'magisch getal' te gebruiken.
De oplossing
Met de property's text-box-trim en text-box-edge (afkorting text-box) kun je deze interne regelafstand inkorten op basis van specifieke lettertypestatistieken. Door het tekstvak bij te snijden tot de hoofdletterhoogte (bovenkant van hoofdletters) en de alfabetische basislijn (onderkant van de meeste letters), zorg je dat het begrenzingsvak van het element overeenkomt met de visuele content.
Implementatiestrategie
- VERPLICHT: Pas
text-box-trim: trim-both(of de afkortingtext-box) toe op het element dat de tekst bevat. - VERPLICHT: Geef aan welke statistieken je wilt gebruiken voor inkorten met
text-box-edge. Gebruikcap alphabeticvoor de meeste UI-uitlijning. - Gebruik dit WEL om visuele verticale centrering te bereiken in flex- of rastercontainers.
- Gebruik deze functie WEL om te zorgen dat je CSS-waarden voor
paddingovereenkomen met de visuele ruimte tussen de tekst en de rand van de container. - Gebruik de functie NIET voor lange hoofdtekst waarvoor traditionele regelafstand nodig is voor de leesbaarheid. Het is het meest geschikt voor koppen, knoppen en UI-labels.
Implementatiehandleiding
Use case 1: Interne regelafstand inkorten voor badges
Verschillende lettertypen hebben verschillende hoeveelheden ingebouwde ruimte boven en onder de tekst. Dit kan problemen opleveren bij het matchen van een ontwerp of bij het visueel centreren van tekst in een badge. Als je wilt dat de opvulling van een container precies om de tekst past, gebruik je text-box: trim-both cap alphabetic. Dit is vooral handig voor compacte UI-componenten zoals badges of tags. Zo kan de opvulling aan alle kanten direct aan de tekstrand beginnen.
.badge {
padding: 10px;
background: hotpink;
border-radius: 10px;
/*
Trims the top to the cap-height and
the bottom to the alphabetic baseline.
*/
text-box: trim-both cap alphabetic;
}
Use case 2: Tekst centreren met iconen
Als je Flexbox gebruikt om tekst en iconen uit te lijnen, zorgt de 'spookruimte' er vaak voor dat de tekst iets uit het midden lijkt te staan. Als je het vak inkort, gebruikt de vormgevingsengine de werkelijke zichtbare letterhoogte voor uitlijning.
.button {
display: inline-flex;
align-items: center;
gap: 8px;
}
/*
text-box does NOT inherit, and must be applied directly to the text element.
*/
.button-text{
/*
The flex container now centers against the
visible letters, not the invisible font box.
*/
text-box: trim-both cap alphabetic;
}
Use case 3: Tekst uitlijnen met de bovenranden
Gebruik trim-start cap alphabetic om een kop perfect uit te lijnen met de bovenkant van een aangrenzende afbeelding of decoratief element. Hoewel het einde niet wordt ingekort, moet de eindrand worden gedefinieerd.
.hero {
display: flex;
align-items: flex-start;
}
h1 {
/* MANDATORY: The bottom edge must also be defined, even though only the top is trimmed. */
text-box: trim-start cap alphabetic;
}
Praktische tips
- WEL: Gebruik de afkorting
text-boxom de tekst beknopt te houden:text-box: <trim-direction> <edges>. - WEL: Geef altijd beide randen op, zelfs als er maar één rand wordt bijgesneden (tenzij je de standaardrand
textgebruikt). - WEL combineren met
line-heightvoor gecontroleerde tussenruimte. Als je de regelafstand inkort, wordt de regelafstand vóór de eerste en laatste regel tekst verwijderd, maar heeftline-heightnog steeds invloed op de afstand tussen regels in tekst met meerdere regels. - Pas ze NIET toe op elk element. Gebruik deze alleen als een nauwkeurige uitlijning vereist is.
Reservestrategieën
text-box is een progressive enhancement. In browsers die dit niet ondersteunen, wordt de tekst weergegeven met de standaard regelafstand. Je indeling werkt nog steeds, maar is iets minder nauwkeurig. Er is geen speciale reservecode vereist, omdat de eigenschappen veilig worden genegeerd door oudere browsers.
Andere overwegingen
- Lettertypestatistieken: Verschillende lettertypen hebben verschillende interne statistieken.
cap alphabeticis een betrouwbare standaard, maar voor sommige lettertypen of toepassingen isex(x-hoogte) misschien beter voor een betere uitlijning van kleine letters. - Tekst met meerdere regels: De inkorting wordt toegepast op de eerste en laatste regel van het blok. Dit heeft geen invloed op interne lijnen.