Fluid typografie ist die Idee, dass sich font-size (und vielleicht andere Attribute von Schriftarten wie line-height) je nach Bildschirmgröße (oder vielleicht Container Queries, wenn wir welche hätten) ändern.
Der eigentliche Trick kommt von Viewport-Einheiten. Man kann Schriftgrößen buchstäblich in Viewport-Einheiten festlegen (z. B. font-size: 4vw), aber die Größenänderungen sind so extrem, dass es normalerweise unerwünscht ist. Dies wird gemildert, indem man etwas wie font-size: calc(16px + 1vw) verwendet. Aber da wir sowieso mit Berechnungen aufwendig werden, entwickelte sich die gängigste Implementierung zu einer Formel zur Berechnung in einfachem Englisch
Ich möchte, dass die Schriftgröße von 16px auf einem 320px breiten Bildschirm auf 22px auf einem 1000px breiten Bildschirm ansteigt.
Was dann so aussah
html {
font-size: 16px;
}
@media screen and (min-width: 320px) {
html {
font-size: calc(16px + 6 * ((100vw - 320px) / 680));
}
}
@media screen and (min-width: 1000px) {
html {
font-size: 22px;
}
}
Das legt im Wesentlichen eine minimale und maximale Schriftgröße fest, damit die Schriftgröße nicht zu extrem schrumpft oder wächst. „CSS-Locks“ ist ein Begriff, der von Tim Brown geprägt wurde.
Minimum und Maximum, sagen Sie?! Nun, es stellt sich heraus, dass Funktionen dafür ihren Weg in die CSS-Spezifikation gefunden haben in Form von min() und max().
So können wir unser schickes obiges Setup mit einer einzigen Zeile vereinfachen und die Locks beibehalten
html {
font-size: min(max(1rem, 4vw), 22px);
}
Wir sollten hier eigentlich aufhören, denn obwohl sowohl Safari (11.1+) als auch Chrome (79+) dies derzeit unterstützen, ist das die größte Verbreitung, die wir heute erreichen können. Apropos, Sie möchten wahrscheinlich eine font-size-Deklaration davor einfügen, um einen akzeptablen Fallback-Wert ohne schicke Funktionen festzulegen.
Aber solange wir die Grenzen ausloten, gibt es eine weitere Funktion, um die Dinge noch weiter zu vereinfachen: clamp()! Clamp nimmt drei Werte entgegen: ein Minimum, ein Maximum und eine flexible Einheit (oder eine Berechnung oder was auch immer) in der Mitte, die verwendet wird, falls der Wert zwischen dem Minimum und dem Maximum liegt. Unsere Einzeiler wird also noch kürzer
body {
font-size: clamp(100%, 1rem + 2vw, 24px);
}
Das wird Chrome 79+ sein (das noch nicht stabil ist, aber bald sein wird).
Onkel Dave ist sehr glücklich, dass FitText jetzt nur noch ein paar Bytes statt des gesamten jQuery plus 40 weiteren Zeilen benötigt. Hier ist Dave, der CSS-Custom-Properties darauf anwendet
Habe gerade diese nette Erklärung gesehen
Guten Morgen Devsheet: CSS `clamp` kann für fluide Typografie verwendet werden. 🎉
— Stefan Judis (@stefanjudis) 20. April 2020
🔗 `clamp` auf MDN: https://#/4xZpDfYoqB
Video-Alternative: Beispiel, das zeigt, wie `clamp` für fluide/responsive Typografie für ein h1-Element verwendet wird pic.twitter.com/9iiCxxXJO7
Brillant! Bitte erstellt jemand einen Polyfill für den Clamp-Trick in ES6.
Aber 4vw erreichen 22px bei einer Bildschirmbreite von nur 550px, daher ist die Berechnung besser geeignet.
@Matt, ist das nicht der Sinn der Sache, oder ist das nicht beabsichtigt?
Die Schriftgröße beträgt 4vw bis zu einer Bildschirmbreite von 550px. Alles darüber hinaus ist auf 22px begrenzt.
Ich stimme zu, ich bevorzuge es, definieren zu können, wann die Skalierung enden soll, unter Verwendung der Viewport-Breite, was die lange
calc()-Formel ermöglicht. Ich habe einen benutzerdefinierten Sass-Mixin erstellt, um die Generierung dieser Formeln zu erleichtern https://threespot.github.io/frontline-sass/documentation/#main-function-fs-scale Hoffentlich finden andere ihn nützlich!Passen Sie es einfach auf 2,2vw an
Das ist ein toller Tipp/Trick. Das kann mir wirklich viel Kopfzerbrechen ersparen, wenn ich meine Website mobilfreundlich mache. Danke!
Gute Sache da
Ich frage mich, was das für die Verwendung von rem-Einheiten in einem Projekt bedeutet. Wenn Sie fluide Typografie verwenden, dann müssten meiner Meinung nach alle anderen Elemente mit PX skaliert werden. Andernfalls, wenn der Benutzer die Basis-Schriftgröße ändert, werden alle Elemente skaliert, außer dem Text.
Funktioniert das noch richtig, wenn die Standardschriftgröße des Browser des Benutzers außerhalb dieses Min-Max-Bereichs liegt? Ich habe meine auf 24 px eingestellt, da meine Augen schrecklich sind.
Ich frage mich, was Sie über die Verwendung von ch-Einheiten denken. Sie sind ziemlich gut unterstützt und, obwohl sie nicht perfekt sind, sind sie ziemlich gut, um Situationen zu bewältigen, in denen wir die Anzahl der Zeichen pro Zeile in Absätzen in einem angemessenen Bereich halten wollen. Auch könnten wir sie mit Formeln (calc()) feinabstimmen
Das ist ziemlich nett. Ich mache etwas Ähnliches mit einem SCSS-Mixin und es hat bisher sehr gut funktioniert.
Siehe den Pen Fließende Typografie von Marc Müller
(@mkmueller) auf CodePen.
RFS ist auch ein großartiges Beispiel. Es unterstützt jetzt auch die reaktionsschnelle Skalierung anderer CSS-Eigenschaften und ist Teil von Bootstrap: https://github.com/twbs/rfs
Hallo,
Danke für Ihren Artikel und Ihre Lösungen!
Ich habe zwei Fragen
1 – Kann diese Formel auch mit anderen Elementen verwendet werden? In diesem Fall kann ich sie für line-height verwenden?
Denn beim Vergrößern auf manchen Bildschirmen ist die Zeile hoch, sie sollte gesenkt werden.
‘: min (max (1.3rem, 3vw), 35px)! important;’
2 – Wie wird Min-Max verwaltet? Ich habe versucht, es anzuwenden, aber es scheint andersherum zu funktionieren, als ich es mir vorstelle.
Es scheint hier, dass 35px die größte Größe ist, stattdessen (1.3rem, 3vw) ist die kleinste Größe, die passt. Richtig? Denn ich habe es auf einer Testseite ausprobiert, es funktioniert bei mir so.
Vielen Dank
Ich bin mir nicht sicher, wie ich die beiden gegebenen Beispiele korrelieren soll. Betrachten Sie dies
Es ist unklar, woher der Teil
4vwkommt. Wie bezieht sich das auf die zuvor vorhandenen 100vw?Das andere Beispiel ist dieses
Jetzt haben wir 2vw. Wie bezieht sich das auf die 4vw?
Es ist zweifellos mein mangelndes Verständnis, aber in vielen dieser Artikel finde ich Codebeispiele, die unterschiedliche Werte verwenden, ohne zu erklären, wie die Werte zwischen den Codebeispielen zusammenhängen.
Ich füge zu meiner Verwirrung bezüglich meines ersten Punkts hinzu: Warum wird ein Beispiel auf dem
htmldeklariert, das andere aber auf dembody? Nichts im Artikel deutet darauf hin, warum das so ist. Und warum zeigt ein Beispiel22px, während das andere24pxzeigt?Nochmals, es ist für mich einfach sehr unklar, wie ich diese Beispiele in Beziehung setzen soll, da ich vermute, dass sie verschiedene Wege zeigen, um denselben Effekt zu erzielen.