Direkt zum Code, hier ist eine funktionierende Implementierung
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;
}
}
Es lohnt sich, unseren neueren Beitrag Simplified Fluid Typography für praktische, geklemmte, viewportbasierte Typengrößen zu lesen.
Das würde font-size von einem Minimum von 16px (bei einem 320px Viewport) auf ein Maximum von 22px (bei einem 1000px Viewport) skalieren. Hier ist ein Demo davon, aber als Sass @mixin (was wir später behandeln werden).
Siehe den Pen Basisbeispiel für fließende Typografie mit Sass von Chris Coyier (@chriscoyier) auf CodePen.
Sass wurde nur verwendet, um die Ausgabe etwas einfacher zu generieren, und die Tatsache, dass ein wenig Mathematik involviert ist. Schauen wir uns das mal an.
Mithilfe von Viewport-Einheiten und calc() können wir die Schriftgröße (und andere Eigenschaften) basierend auf der Bildschirmgröße anpassen. Anstatt also immer die gleiche Größe zu haben oder bei Media Queries von einer Größe zur nächsten zu springen, kann die Größe fließend sein.
Hier ist die Mathematik, Mike Riethmuller sei Dank
body {
font-size: calc([minimum size] + ([maximum size] - [minimum size]) * ((100vw - [minimum viewport width]) / ([maximum viewport width] - [minimum viewport width])));
}
Der Grund, warum diese Mathematik etwas kompliziert ist, ist, dass wir versuchen zu vermeiden, dass die Schrift jemals kleiner als unser Minimum oder größer als unser Maximum wird, was mit Viewport-Einheiten sehr einfach ist.
Wenn wir zum Beispiel wollen, dass unsere Schriftgröße in einem Bereich liegt, in dem 14px die Mindestgröße bei der kleinsten Viewport-Breite von 300px ist und 26px die Maximalgröße bei der größten Viewport-Breite von 1600px ist, dann sieht unsere Gleichung so aus
body {
font-size: calc(14px + (26 - 14) * ((100vw - 300px) / (1600 - 300)));
}

Siehe den Pen JEVevK von CSS-Tricks (@css-tricks) auf CodePen.
Um diese Mindest- und Höchstgrößen festzulegen, hilft die Verwendung dieser Mathematik innerhalb von Media Queries. Hier ist etwas Sass, das hilft...
In Sass
Sie könnten ein (ziemlich robustes) Mixin erstellen, wie dieses
@function strip-unit($value) {
@return $value / ($value * 0 + 1);
}
@mixin fluid-type($min-vw, $max-vw, $min-font-size, $max-font-size) {
$u1: unit($min-vw);
$u2: unit($max-vw);
$u3: unit($min-font-size);
$u4: unit($max-font-size);
@if $u1 == $u2 and $u1 == $u3 and $u1 == $u4 {
& {
font-size: $min-font-size;
@media screen and (min-width: $min-vw) {
font-size: calc(#{$min-font-size} + #{strip-unit($max-font-size - $min-font-size)} * ((100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)}));
}
@media screen and (min-width: $max-vw) {
font-size: $max-font-size;
}
}
}
}
Was Sie so verwenden
$min_width: 320px;
$max_width: 1200px;
$min_font: 16px;
$max_font: 24px;
html {
@include fluid-type($min_width, $max_width, $min_font, $max_font);
}
Hier ist ein weiteres von Mikes Beispielen, um den fließenden Rhythmus genau richtig hinzubekommen

Erweiterung der Idee auf Überschriften mit modularer Skalierung
Modulare Skalierung, was bedeutet, dass je mehr Platz zur Verfügung steht, desto dramatischer ist der Größenunterschied. Vielleicht ist bei der größten Viewport-Breite jeder Header der Hierarchie 1,4x größer als der nächste, aber bei der kleinsten nur 1,05x.
Siehe Ansicht
"Fluid Type" i̶n̶s̶p̶i̶r̶i̶e̶r̶t̶ von @MikeRiethmuller gestohlen, jetzt live auf @CodePen Blogs. Inklusive "Fluid Modular Scale!" pic.twitter.com/0yJk8Iq8fR
— Chris Coyier (@chriscoyier) 27. Oktober 2016
Mit unserem Sass-Mixin sieht das so aus
$mod_1: 1.2; // mobile
$mod_2: 1.5; // desktop
h1 {
font-size: $mod_1*$mod_1*$mod_1*$mod_1 *1rem;
@include fluid-type($min_width, $max_width, $mod_1*$mod_1*$mod_1 *$min_font, $mod_2*$mod_2*$mod_2 *$min_font);
}
h2 {
font-size: $mod_1*$mod_1*$mod_1 *1rem;
@include fluid-type($min_width, $max_width, $mod_1*$mod_1*$mod_1 *$min_font, $mod_2*$mod_2*$mod_2 *$min_font);
}
h3 {
font-size: $mod_1*$mod_1 *1rem;
@include fluid-type($min_width, $max_width, $mod_1*$mod_1 *$min_font, $mod_2*$mod_2 *$min_font);
}
Weitere Lektüre
- Flexible Typografie mit CSS-Locks von Tim Brown
- Das Gleichgewicht finden: Responsive Display Text von Richard Rutter
- Beispiele für fließende Typografie von Mike Riethmuller
Sehr schöner Trick! Wie ist die Browserunterstützung? IE11+?
Sollte in IE11 und Edge in Ordnung funktionieren
http://caniuse.com/#feat=viewport-units
http://caniuse.com/#feat=calc
Korrigieren Sie mich, wenn ich falsch liege.
Ich glaube, wenn Sie einen Polyfill für Viewport-Einheiten und calc einschließen, können Sie dies mit jedem Browser verwenden, den der Polyfill unterstützt, richtig? Richtig?
Verwenden Sie keinen Polyfill. Lassen Sie ältere Browser sich auf elegante Weise degradieren. Das Hinzufügen von Polyfills verringert nur die Leistung, insbesondere auf älteren Rechnern. Die zusätzliche Nuancierung der Größenänderung ist es nicht wert.
Kombinieren mit CSS-Variablen
Ich habe heute Morgen versucht, dies in meinen Workflow zu integrieren, und Sie haben hier eine ziemlich entscheidende Sache ausgelassen. Diese Berechnung der fließenden Schriftgröße sollte innerhalb einer Media Query mit den minimalen und maximalen Viewports liegen. Andernfalls skaliert sie weiter über das Minimum und Maximum hinaus. Sehen Sie den Originalbeitrag hier
https://madebymike.com.au/writing/fluid-type-calc-examples/
Das Sass-Mixin ist das gesamte Paket, das all das abdeckt, über das Grundkonzept hinaus.
Beweisen Sie mir, dass ich falsch liege, aber der Stift oben funktioniert nicht in Safari?
Beste Grüße
Thomas
Ich denke, das hat mit der Live-Berechnung von Viewport-Einheiten in Safari zu tun. Wenn Sie die Seite neu laden, ist es richtig, es ist nur nicht fließend, wenn Sie die Größe ändern. Schade. Vorübergehender Fehler, würde ich denken. Immer noch nützlich.
Es gibt einen Fehler in einigen Versionen von Safari (und IE11), der bedeutet, dass er bei Größenänderungen nicht berechnet wird, aber wie Chris sagte, sollte er beim ersten Laden korrekt sein.
Dies deckt die Mehrheit der Situationen ab. Aber ich höre, dass das Hinzufügen von +100% am Ende der Berechnung den Größenänderungsfehler in Safari beheben wird.
Nachdem ich Chris' geteiltes Sass-Mixin ausprobiert habe, funktioniert es hervorragend – auch in Safari.
Könnte es dann ein Problem in CodePen sein? Ich meine, alle geteilten Pens kämpfen in Safari (was wahrscheinlich das neue IE ist?)
Ich wollte Sie nur informieren und danke für das Teilen. Sehr cool.
Beste Grüße
Thomas
ups – Ihren Kommentar, Mike, völlig verpasst. Entschuldige.
Beste Grüße
Thomas
Ich habe auch bemerkt, dass in Safari calc nur beim Neuladen der Seite ausgeführt wird, aber anscheinend funktioniert das Einstellen der Schriftgröße auf eine beliebige vw-Größe in einem übergeordneten Container, und Sie können eine fließende Schriftgröße haben.
https://jsfiddle.net/hbyzLcj1/52/
@Konrad… Danke für diesen „font-size: 1vw auf dem Elternelement-Hack“. 2019 und Safari folgt immer noch nicht den anderen Browsern in Bezug auf dies.
Tatsächlich funktioniert das auch nicht. Es skaliert die Größe nur nach unten, ohne Mindest-/Höchstgröße.
Aber ich habe eine Korrektur/einen Hack für Safari gefunden, der funktioniert
fügen Sie
min-height: 0vw;auch dem Text hinzuKann mir jemand sagen, wo der Unterschied zu vw liegt?
Diese Technik verwendet vw. Aber nicht nur vw, da es dann keine Möglichkeit gibt, ein Minimum und ein Maximum oder die hier vorgestellte Trickkiste zu steuern.
Danke für die Antwort.
Ich benutze oft vw, aber auf kleinen Geräten wird der Text manchmal viel zu klein. Dann korrigiere ich ihn, indem ich eine Media Query für das kleine Gerät verwende und die Schriftgröße erhöhe. Und mit dieser Technik brauchen Sie die Media Query nicht, oder?
Hallo Chris, es lohnt sich, diese Beispiele von James Nowland zu teilen: http://codepen.io/jnowland/pen/GWgbMP/ Er hat ein wirklich nettes Mixin gemacht und manche Leute bevorzugen vielleicht diese Syntax.
Danke für das Teilen dieses Codepen, das Mixin ist großartig… bis auf ein paar Probleme
Die Einbeziehung von line-height funktioniert nicht. Chrome sagt, der Eigenschaftswert sei ungültig. Ich habe sowohl das responsive-resize Mixin als auch das responsive-type Mixin ausprobiert. Beide funktionieren nicht für line-height… funktionieren aber für font-size.
Ich würde diese Mixins gerne verwenden
@include responsive-type('14px@400px', '50px@1900px');@include responsive-type('1.2@400px', '1.05@1900px', line-height);Aber Sass gibt mir einen Fehler beim Kompilieren: „index out of bounds for
nth($list, $n). Sass hat wohl diese Eigenart, dass man am Ende eines verschachtelten Arrays mit einem einzigen Element ein zusätzliches Komma hinzufügen muss. Ich kann nicht herausfinden, wie ich das bei dieser speziellen Stringaufteilung tun soll. Hilfe wäre willkommen.Das responsive-resize Mixin funktioniert hervorragend für font-size!
Ich mache seit etwa 2,5 Jahren fließenden Text.
Ich verwende vw's und rem's in demselben CSS-Eigenschaftsblock.
Ich verwende es sogar, um ein gesamtes HTML-Objekt als ein großes Design zu behandeln, das skaliert.
Joe, möchtest du dich austauschen? Ich benutze es auch, um die meisten Elemente auf einer Seite außer der Typografie zu gestalten, um ein sauber fließendes und fließendes Layout zu erhalten. Wo kann ich Sie erreichen? Haben Sie vielleicht (noch halbfertige) Pens und Gists, vielleicht möchten Sie sich das ansehen?
Gerade heute habe ich Mike eine E-Mail geschickt, in der ich ein kleines Problem mit dem fließenden Typ-Sass-Mixin beschreibe, nämlich dass es bei der Verwendung für mehr als eine Region/Media-Query mehrere Werte für denselben Selektor erzeugt. Sehen Sie hier https://www.sassmeister.com/gist/0a451c254e43c07a7e487771d3590476 (wenn die CSS nicht sofort kompiliert wird, fügen Sie ein Leerzeichen hinzu und entfernen Sie es wieder in SCSS, und SassMeister wird den Kompilierungsprozess erneut auslösen)
Ich habe es noch nicht gelesen, den Poly Fluid Post https://css-tricks.de/poly-fluid-sizing/, er ist gerade in meinem Posteingang angekommen und ich gehe sofort dorthin, vielleicht liegt dort eine Lösung, denn ich glaube, das ist es, was ich suche.
Und wie Joe Hoeller schreibt, nicht nur für Typografie, sondern für alle Stile im DOM, von extremen 50px Breite bis 2500px und mehr, großer Spaß und wenn man den Dreh raus hat, bekommt man ein wirklich beeindruckendes und responsives Layout hin.
Ein einfach zu bedienender
<a href="https://websemantics.uk/tools/responsive-font-calculator/">Fließender-responsiver Schriftgrößenrechner</a>Zusammen mit einem
<a href="https://codepen.io/2kool2/pen/PKGrdj">Schmutziger 'ässlicher 'acky Safari Größenänderungs-Fix</a>.Schamlose Eigenwerbung!
Fließend-responsiver Schriftgrößenrechner
Schmutziger 'ässlicher 'acky Safari Größenänderungs-Fix
@return $value / ($value * 0 + 1); Jede Zahl multipliziert mit 0 = 0 und 0 + 1 ergibt immer 1
@return $value / 1; Jede Zahl geteilt durch 1 = diese Zahl
@return $value;
Oder fehlt mir hier etwas??
Das Ziel der Funktion ist es, die Einheiten (z. B. "px") aus $value zu entfernen. Ich glaube, dass ($value * 0) gleich 0 der jeweiligen Einheit von $value ist (z. B. "0px"). Dann macht das Hinzufügen von 1 daraus 1 der Einheit (z. B. "1px"). Das Teilen von $value (z. B. "20px") durch 1 seiner Einheiten ("1px") ergibt eine einheitenlose Zahl (z. B. 20), während $value/1 nur $value ist, mit intakten Einheiten.
calc([minimale Größe] + ([maximale Größe] – [minimale Größe]) * ((100vw – [minimale Viewport-Breite]) / ([maximale Viewport-Breite] – [minimale Viewport-Breite])));
Kann jemand die Logik für den Aufbau dieser mathematischen Gleichung erklären?
Wie wählen wir den Media-Query-Bereich für die Mathematik aus?
Ich verstehe nicht wirklich, was das tut? Ich dachte, Sie würden uns zeigen, wie man Text durch Schriftgröße erweitert, um die Breite seines Containers auszufüllen. Das jQuery-Plugin fitText() tut das nicht und erfordert einen "magischen" Schätzekoeffizienten, den man schließlich wie eine Gitarre stimmen lernt – etwas, worin ich nie gut sein werde.
Nachdem ich eine Weile mit dem Plugin herumgespielt habe, habe ich ein schnelles Skript geschrieben, das tut, was ich dachte, dass fitText tut: Es passt die Textgröße an die Breite des übergeordneten Containers an. Ich habe das Resize-Ereignis nicht gedrosselt (oder debounced oder was auch immer) und es hat viele Probleme, aber es entspricht eher dem, was ich dachte, dass fitText tut. Wo habe ich mich verirrt?
Großartig, danke!
Ich möchte die calc-Zeile in einem externen Stylesheet mit WordPress verwenden.
Ich muss den Ausdruck !important verwenden, um bestehende Regeln zu überschreiben.
Leider konnte ich nicht herausfinden, wo !important genau hingehört.
Ich habe Folgendes versucht, aber die calc-Zeile hat nicht funktioniert
@media screen and (min-width: 320px) {
html {
font-size: calc(16px + 6 * ((100vw – 320px) / 680))!important;
}
}
@media screen and (min-width: 1000px) {
html {
font-size: 22px!important;
}
}
Danke für Ihre Hilfe!
Mit freundlichen Grüßen,
Michael
Ich habe gerade eine viel kürzere SASS-Version herausgefunden, ohne dass ein Mixin benötigt wird. Ich setze
pxnicht in die Variablen. Auf diese Weise können wir es bei Bedarf in der Schriftgrößenberechnung hinzufügen.font-size: calc(#{$min_font * 1px} + #{$max_font - $min_font} * (100vw - #{$min_width * 1px}) / #{$max_width - $min_width});Guter Artikel, sehr nützlich.
Eine Frage aber, ist es möglich, für die Größen "rem" zu verwenden?
Ich habe es versucht und die Berechnung ist etwas "verkehrt".
Ich versuche, zwischen 6,4rem und 3,2rem zu wechseln, kann es aber nicht über "38,7968px" hinaus schaffen. Oder muss ich das "rem"-Äquivalent der maximalen/minimalen Breite verwenden, damit es korrekt berechnet wird?
Ich habe es behoben. Die maximalen/minimalen Breiten müssen ebenfalls in "rem" sein, lassen Sie einfach die Einheit weg.
Das ist eine großartige Lösung!
Allerdings hatten wir leicht unterschiedliche Anforderungen für die Schriftgrößenanpassung.
Die Anforderung war: die Schriftgröße proportional zur Viewport-Breite verkleinern, damit sie immer das gleiche Seitenverhältnis hat und keine Zeilenumbrüche verursacht. Aber nur innerhalb gegebener Viewports. Und nur mit maximaler und minimaler Schriftgröße.
Ihre Lösung führt zu einer langsameren Schrumpfung als erforderlich, da eine lineare Funktion zwischen zwei Schriftgrößen zwischen zwei Breakpoints verwendet wird.
Hier ist mein Ansatz für unsere Anforderungen: https://codepen.io/shooby83/pen/JQyRao
Hoffentlich ist es für jemanden nützlich.
Beste Grüße
@Matthias Schubert: Gut gemacht, großartiger Ansatz.
Hallo Chris. Fantastischer Code. Frage: Wenn ich diesen Ansatz verwende, sehe ich in den Chrome-Entwicklertools die Zusammenfassung "Geerbt von body", die die Schriftgröße und die calc mit durchgestrichener Schrift anzeigt, obwohl sie anscheinend tatsächlich die calc-Formel verwendet. Können Sie erklären, warum? Danke!
Eine sehr hilfreiche Lösung!
Gibt es eine Möglichkeit, dies mit einer dynamischen Schriftgröße zu tun, wie zum Beispiel, wenn wir die Schriftgröße vom Benutzer für eine interaktive Seite erhalten?
Hey Mann!
Ich muss sagen, ich bin ein großer Fan Ihrer Arbeit, so sehr, dass ich in meinem neuesten Blogbeitrag auf Sie verwiesen habe. Sie können ihn hier ansehen https://pixelzui.com/components/typography.
Viele Grüße,
Engr. Salman Ramzan
P.S. Wenn Sie es teilen, würde es meinen Tag machen.
„@if $u1 == $u2 and $u1 == $u3 and $u1 == $u4 {“
Warum müssen alle die gleiche Einheit haben?
Ich sehe, wie nützlich das für eine textlastige Website (wie Blogs) sein kann, aber würden Sie den gleichen Ansatz in einer Web-/Mobile-App verwenden? Es scheint mir, dass es in diesen Fällen übertrieben sein könnte oder sogar die Benutzeroberfläche beschädigen könnte.
Irgendwelche Gedanken?
Hat jemand das mit benutzerdefinierten Eigenschaften und relativen Schriftgrößen (em/rem) ausprobiert?
Wirklich schöner Leitfaden, vielen Dank dafür! Ich hatte gerade einige Probleme mit 'Safari', da ich die Schriftgröße nicht 'on the fly' ändern konnte. Die Größenänderung erschien erst nach dem Neuladen der Seite.
Allerdings hat mir dieser Codepen sehr geholfen, indem er eine 'min-height: 0vw' zur Klasse hinzugefügt hat. Hat für mich funktioniert.
Das ist eine großartige Lösung!
Warum verwenden Sie nicht: calc(14px + (12) * ((100vw – 300px) / (1600 – 300)));
In Ihrem Beispiel
calc(14px + (26 – 14) * ((100vw – 300px) / (1600 – 300)));
Das ist erstaunlich! Super cool. Bootstrap sollte das implementieren!
Ich bin sicher, dass das möglich ist, aber kann das auf andere Eigenschaften wie die Breite und Höhe eines bestimmten div erweitert werden?
Ooo, das klingt nach einem guten Anwendungsfall für Container Queries! Hoffentlich bekommen wir die bald.
Hat Bootstrap nicht letztes Jahr ein fließendes/responsives Typ-Mixin namens RFS integriert? Der Autor schrieb vor einiger Zeit darüber und erwähnte, dass es für Bootstrap 5 geplant sei.
Ich habe gerade von den neuen CSS-Funktionen
min(),max()undclamp()erfahren (clamp()wird zum Zeitpunkt des Schreibens in Safari nicht unterstützt, aber die beiden anderen sind es und können so komponiert werden, dass sie wieclamp()wirken).https://developer.mozilla.org/en-US/docs/Web/CSS/min
Es scheint, dass dies etwas wie der Blogbeitrag ermöglicht, nur mit viel saubererem Code!
Hallo Josh,
Während Clamp- und Min-Max-Methoden nicht so gut unterstützt werden wie die Media-Query-Version, funktionieren alle diese Methoden im aktuellen Safari, solange Sie den Safari-Fix min-height: 0vw; verwendet haben.
Versuchen Sie das Testfenster auf dieser Seite: https://websemantics.uk/tools/responsive-font-calculator/
Eines der besten Code-Stücke, die ich je gefunden habe. Funktioniert mit Rändern, Polstern… nun, es funktioniert einfach und es ist großartig!! Vielen Dank dafür
Vielen Dank für diesen Artikel! Keine Albträume mehr beim Erstellen von responsiven Stilen für jede Überschrift.
Sehr schöner Trick!
Obwohl die Mathematik etwas komplex ist.
Glauben Sie, dass
clamp()ein sauberer Ansatz ist, um fließende Typografie zu erreichen?Nochmal, ein wirklich schöner Trick!
Ja!
clamp()bietet definitiv einen saubereren Ansatz, da es Minimum- und Maximumwerte bereits integriert hat. Chris erklärt das in einem anderen Artikel.Sehr nützlich gefunden! Danke, Mr. Graham.