Met blokken in posterstijl waarbij elke regel wordt geschaald zodat deze de hele breedte van de container beslaat, kun je visueel opvallende koppen maken.
Met text-fit schaalt de browser elke regel tijdens de opmaak, zodat deze correct blijft bij formaatwijzigingen, tekstwijzigingen en het laden van lettertypen.
Voor een enkele regel die de container vult (bijvoorbeeld een kop of een citaat), pas je text-fit rechtstreeks toe op dat element. Deze handleiding gaat over lockups met meerdere regels.
Basisimplementatie
Voor geforceerde lijnen:
- Zet elke regel in een
<span>metdisplay: block. - Pas
white-space: nowraptoe op elke geforceerde regel<span>.
Implementatierichtlijnen:
- Gebruik
text-fit: grow per-line-all <percentage>voor de kop zelf. - Gebruik
per-line-all, nietper-line.per-lineslaat de laatste regel en elke regel die eindigt met een gedwongen regeleinde over. Met één blok per regel wordt er dus niets geschaald. growkan niet worden gecombineerd metshrink. Stel de basis-font-sizein op een maximum of een minimum, afhankelijk van wat een betere fallback is of makkelijker te berekenen is, en steltext-fitin opshrinkofgrow. Als je geen reden hebt omshrinkte gebruiken, geef je de voorkeur aangrow+ instellingfont-sizetot een minimum, omdat dit in de meeste gevallen veiliger is.- Beperk groei of krimp altijd met het percentage (bijv.
300%) als bescherming. - De container heeft een bepaalde inline grootte nodig.
text-fitverandert de intrinsieke grootte nooit, dus het doet niets metfit-content/max-content-breedtes of flex-/rasteritems met contentgrootte. - De regelafstand boven de eerste en onder de laatste regel inkorten: zie Nauwkeurige tekstuitlijning.
- Houd
line-heightklein,1of minder, anders worden de gaten tussen regels met verschillende lettergrootten onhandelbaar. - BELANGRIJK: De berekende
font-sizeis ongewijzigd, dus deem-afstand wordt niet geschaald. - Pas
text-wrap: balanceoftext-wrap: prettytoe als er vrije regels zijn om te voorkomen dat weesregels per ongeluk te veel nadruk krijgen.
Spatiëring
Als alle regels worden geforceerd, heb je meer controle over de afstand:
- Pas
text-box: trim-both cap alphabetictoe op elk regelblok, zodat het vak de eigen tekens omvat. De functie knipt de video op basis van de geschaalde statistieken. Ga naar Nauwkeurige tekstuitlijning voor meer informatie. - Gebruik Flexbox of Grid +
gapvoor de kop, nietline-height. De tussenruimtes zijn dan uniform in plaats van dat ze groter worden met de lettergrootte van elke regel.
Als sommige regels vrij zijn, gebruik dan niet text-box: hiermee worden alleen de eerste en laatste regel bijgesneden, zodat de buitenste regels de glyphs omarmen terwijl de binnenste tussenruimtes hun regelafstand behouden. Laat line-height alle tussenruimte bepalen.
Visueel ontwerp
- Lock-ups zien er het beste uit als er een aanzienlijk verschil is in lettergrootte tussen de regels. Maak geen lock-ups van tekst met voornamelijk uniforme regels, omdat dit leidt tot lettergrootten die niet hetzelfde zijn, maar ook niet voldoende verschillen. Dit is in strijd met het ontwerpprincipe van contrast. Je kunt dit doen door korte regels af te dwingen: zet de woorden die je wilt benadrukken in een blok en laat de rest doorlopen, oftewel een gemengde vergrendeling. Dit is vooral belangrijk als u deze combineert met
text-wrap: balance. - Combineer dit bij voorkeur met
text-transform: uppercaseals je het gebruikt met westerse schriften, omdat stokken en staarten vaak ingesloten ruimte creëren en/of aangrenzende regels overlappen, wat een minder esthetisch resultaat oplevert. - Als je korte regels afdwingt, kies je woorden die de boodschap versterken als ze worden benadrukt.
- Beperking: Groeiende tekst neemt ook toe in visueel gewicht en de streken worden als sterker ervaren. Er is op dit moment geen manier om dit te compenseren, bijvoorbeeld door
font-weightte verkleinen voor grotere tekst, omdat er geen eenheid is om te gebruiken in een berekening, omdat de schaling geen invloed heeft op lettertype-gerelateerde eenheden zoalsem.
Reservestrategieën
Voor text-box
text-box heeft geen aparte reserve-optie nodig: houd de kleine line-height ook op vaste vergrendelingen. Het is een no-op onder text-box en houdt de tussenruimtes klein waar dit niet wordt ondersteund, ten koste van tussenruimtes die worden geschaald met de lettergrootte van elke regel.
Voor text-wrap: balance
Voor text-fit
Geforceerde regels hebben een korte, betrouwbare fallback: meet elke regel op de basisgrootte en schaal deze op basis van de verhouding tot de container, met dezelfde limiet.
@supports not (text-fit: grow) {
.lockup > span {
/* Shrink-wrap each line so its width is the text width */
width: fit-content;
/* --text-fit-scale is measured by the script; the cap mirrors the text-fit percentage */
font-size: min(var(--text-fit-scale, 1) * 1em, 300%);
}
}
if (!CSS.supports('text-fit', 'grow per-line-all')) {
const fit = lockup => {
const lines = [...lockup.querySelectorAll(':scope > span')];
// Unscale first: on a refit, offsetWidth would otherwise include the previous scale
for (const line of lines) line.style.removeProperty('--text-fit-scale');
// MANDATORY: all reads, then all writes. Interleaving them (e.g. reading
// lockup.clientWidth inside the write loop) forces one reflow per line.
const scales = lines.map(line => lockup.clientWidth / line.offsetWidth);
lines.forEach((line, i) => line.style.setProperty('--text-fit-scale', scales[i]));
};
// Refit on resize and font load
for (const lockup of document.querySelectorAll('.lockup')) {
new ResizeObserver(() => fit(lockup)).observe(lockup);
}
}
Vrije regels hebben geen betrouwbare fallback (regeleinden zijn onbekend tot de vormgeving): progressive enhancement naar een gebalanceerde kop met een vloeiende basisgrootte zoals clamp(2rem, 1rem + 5cqi, 5rem). In een gemengde vergrendeling past het bovenstaande script nog steeds bij de geforceerde regels. Een terugloopblok is even breed als de container, dus het behoudt schaal 1 en krijgt alleen de vloeiende basisgrootte.
Als tekstaanpassing essentieel is, overweeg dan een JS-bibliotheek te gebruiken (bijvoorbeeld fitty), die alleen voorwaardelijk wordt geladen als text-fit niet wordt ondersteund.