Das Konzept der Fluid Typography wurde vor ein paar Jahren aufgeworfen. Die Hauptidee ist, dass wenn man weiß, wie groß die Schrift bei zwei verschiedenen Ansichten ist, dann kann die Schrift fließend zwischen den beiden Größen skaliert werden. Wir hatten eine jQuery-Lösung dafür in FitText (natürlich für Überschriften gedacht), bis die calc() Funktion herauskam und uns eine reine CSS-Lösung gab.
p {
font-size: calc(16px + (24 - 16)*(100vw - 400px)/(800 - 400));
}
Die wichtigen Zahlen hier sind 24px (die größere Schrift bis zu 800px Ansichten) und 16px (die kleinere Schriftgröße bis zu 400px Ansichten). Ich würde die Begriffe "Minimum" oder "Maximum" nicht verwenden, um Schriftgrößen und Ansichten in diesem Kontext zu beschreiben, da dies etwas irreführend ist. Tatsächlich müssen Sie immer noch eine Standard-Schriftgröße für Ansichten kleiner als 400px und größer als 800px angeben - andernfalls wird die Schrift mit der gleichen Skalierung der Gleichung immer kleiner (oder größer). Oder, wenn Sie fancy sind, könnten Sie eine weitere Skalierung für größere Bildschirmgrößen definieren.
Das funktioniert wirklich gut und Sie sollten sich unbedingt die Mathematik dahinter ansehen.
Abstand und Zeilenhöhe?
Ich mochte das Konzept der Fluid Typography so sehr, dass ich mich gefragt habe, ob es auch für andere Eigenschaften funktionieren könnte. Und das tut es! Sie können keine Prozente verwenden, aber solange Sie sich an px, em oder rem Einheiten halten, ist es in Ordnung. Ich bin ein Pixel-Typ, daher habe ich alle meine Experimente damit durchgeführt, aber es gibt diesen netten Generator, der Ihnen bei Umrechnungen hilft, wenn Sie ihn brauchen.
Also, zurück zu padding und line-height. Mit der gleichen calc() Logik können wir ein vollständig fließendes *Layout* mit festen Werten für definierte Bildschirmgrößen erzielen.

Ich habe diese Idee auf dieser Website umgesetzt, mich aber auf font-size und line-height beschränkt. Und ja, es wird einfacher, all diese Mathematik zu übersehen und zu nutzen, je mehr man damit arbeitet.
Ein Exkurs über "Hero"-Komponenten
Wenn Sie wie ich sind, dann haben Sie vielleicht etwas gegen das, was wir alle als Hero-Komponente kennengelernt haben. Es ist allgegenwärtig bis zu dem Punkt, dass es zu einem festen Bestandteil von Designsystemen wie Bootstrap geworden ist.

Mein Hauptkritikpunkt betrifft den besten Weg, sie responsiv zu gestalten. Wenn es sich nicht um eine *vollbildgroße* Hero-Komponente handelt (d. h. sie nimmt bei jeder Größe den gesamten Viewport ein), dann frage ich normalerweise den Designer, wie sich die Seite verhalten soll. Oft gibt es ein Verhältnis der Hero-Seite, das gut funktioniert, sodass ich padding-bottom in % mit absoluter Positionierung des inneren Inhalts verwenden kann. Diese Taktik funktioniert meistens,
Das macht Spaß und funktioniert gut, besonders auf der Desktop-Version einer Website. Sie erhalten eine ordentliche Hero-Sektion, das Verhältnis ist gut und der Inhalt ist zentriert.
Aber was passiert, wenn Sie beginnen, die Ansicht zu verkleinern? Die Hero-Komponente bleibt bis zu einem gewissen Punkt lesbar, Sie müssen wirklich das Verhältnis ändern.
Wenn wir von einem Desktop-First-Responsive-Ansatz ausgehen, könnten wir mit einem horizontalen Rechteck beginnen, das so weit schrumpft, dass auf kleinen Bildschirmen ein vertikales Rechteck übrig bleibt.

Das ist eine mühsame Angelegenheit, denn Sie könnten viele Zeilen CSS benötigen, um eine schöne und lesbare Hero-Sektion bei verschiedenen Breakpoints zu erhalten.
Es muss doch einen besseren Weg geben, oder? Was wäre, wenn die Hero-Komponente ihre Höhe erhöhen könnte, während die Seitenbreite schmaler wird?
Zurück zur Fluidität!
Also wandte ich mich wieder der calc() Funktion zu, die in diesen anderen Situationen funktionierte, wie z. B. dem Browser, der die Mathematik handhabt und die Dinge entsprechend skaliert, wenn sich die Ansicht ändert.
Hier ist der CSS-Code aus dem Fluid Typography Beispiel, mit dem wir begonnen haben
p {
width: 100%;
max-width: 1200px;
margin: 0 auto;
font-family: 'Open Sans', sans-serif;
font-size: calc(24px + (18 - 24)*(100vw - 400px)/(1200 - 400));
line-height: 1.5;
padding: 10px;
}
Hier ist, was wir wollen: eine Hero-Komponente, die größer wird, wenn Sie die Seite verkleinern. Ich habe Pixel-Einheiten für den *fließenden Teil* und Prozente überall sonst verwendet.

Hier ist ein Screencast, wie die Lösung aussieht, zu der ich gekommen bin
Das ist ziemlich nützlich, wenn Sie dem Text mehr vertikalen Raum geben möchten. Wenn Sie die Ansichtsbreite von groß auf klein verkleinern, erhalten Sie mehr Zeilen für denselben Text, da die Schriftgröße nicht zu klein sein kann.
Ziemlich nett, oder? Noch eine Möglichkeit, wie calc() ein Szenario für mich lösen konnte.
Ja, es gibt einige Vorbehalte
Die Browserunterstützung ist sehr gut und erreicht fast 93 % der Nutzer (zum Zeitpunkt des Schreibens), mit der Hauptausnahme von Opera Mini.
Diese Browser-Supportdaten stammen von Caniuse, das mehr Details enthält. Eine Zahl zeigt an, dass der Browser das Feature ab dieser Version unterstützt.
Desktop
| Chrome | Firefox | IE | Edge | Safari |
|---|---|---|---|---|
| 19* | 4* | 11 | 12 | 6* |
Mobil / Tablet
| Android Chrome | Android Firefox | Android | iOS Safari |
|---|---|---|---|
| 127 | 127 | 127 | 6.0-6.1* |
Denken Sie auch daran, dass diese calc() Technik nur px, em und rem Einheiten unterstützt. Aber die hier behandelten Beispiele lassen sich leicht in Einheiten für Dinge wie padding-bottom Prozente in Pixel umwandeln, da die Hero-Komponente typischerweise 100% breit ist.
Oh! Und vergessen Sie nicht, Ihre Werte vor und nach den Breakpoints in der calc() Funktion zurückzusetzen. Andernfalls erhalten Sie entweder sehr große oder sehr kleine Werte für die Ziel-Eigenschaften.
Was sagen Sie?
Dies ist wahrscheinlich nur eine Möglichkeit, wie wir die Situation handhaben können, und sie wurde hauptsächlich von meinem Interesse an der calc() Funktion angetrieben. Das wirft die Frage auf: Wie haben Sie die Skalierung der Hero-Komponentenhöhe gehandhabt? Haben Sie calc() dafür verwendet? Bevorzugen Sie es, Breakpoints bei verschiedenen Breiten zu verwalten? Gibt es etwas anderes, das Sie verwenden? Lassen Sie es uns in den Kommentaren wissen!
Sie sollten sich unbedingt diese Verwendung von calc und vm in diesem Beitrag ansehen. https://medium.com/@jakobud/css-polyfluidsizing-using-calc-vw-breakpoints-and-linear-equations-8e15505d21ab Das war wirklich eine Offenbarung und ich verwende den Poly-Fluid-Ansatz für Typografie, aber auch für Komponenten/Elemente, und alles fließt vollständig fließend und schön.
Dieser Ansatz hat mich auch gelehrt, Designanforderungen mit einer anderen Perspektive anzugehen. Das bedeutet, ich bekomme ein Bild davon, wie Dinge bei vw 320 und vw 1024 aussehen sollen, aber zwischen diesen beiden Bildern liegt es meist an mir zu entscheiden, wie die Dinge zwischen diesen beiden Punkten skalieren, und genau hier leistet Poly-Fluid-Sizing hervorragende Arbeit.
Ich habe schon früher proportional skalierte Hero-Elemente geschrieben, ohne all die Mathematik oder Breakpoints zu benötigen.
Es gibt wahrscheinlich Situationen, die Ihr Ansatz besser bewältigen kann, aber es gibt auch eine gewisse Komplexität, die durch all den zusätzlichen Code entsteht und möglicherweise nicht immer erforderlich ist.
Ich arbeite auch in einem Team, in dem ich meine Stile an andere Teammitglieder weitergeben muss, und wenn ich komplexe Berechnungen wie diese weitergebe, kann die Lesbarkeit/Verständlichkeit ein Problem darstellen.
Hallo Timothy, danke für das Follow-up. Die Sache ist, dass bei Ihrem Code die Hero-Komponente kleiner wird, wenn Sie die Seite verkleinern. Mein Ziel war es, sie höher zu machen, wenn die Seite kleiner wird. Wenn Sie ohne Media Queries arbeiten wollen, könnten Sie etwas wie das hier tun
Offensichtlich ist, wenn Sie etwas Einfacheres brauchen, keine
calc()nötig, aber soweit ich weiß, gibt es keinen anderen (einfachen) Weg, etwas wachsen zu lassen, während die Seite kleiner wird.Warum sollten Sie Ihren lesbaren Inhalt absolut positionieren? Anstatt dem Bildhintergrund eine Höhe zu geben, geben Sie dem Inhalt die Kontrolle über die Höhe, dann brauchen Sie gar keine Berechnung.
Verwenden Sie Grid/Flexbox und place-content: center mit einer min-height (wenn Sie Lust dazu haben) und etwas Polsterung für die Optik. Dann ist überhaupt keine Höhe bei irgendeinem Breakpoint nötig. Ich denke, Sie haben das komplizierter gemacht, als es sein muss.
Hallo Vanderson, ich stimme zu, dass dies ein Grenzfall ist. Die Hauptidee war, calc() mit "invertierten Werten" zu verwenden, damit etwas größer wird, während die Seite kleiner wird. Aber was ist, wenn ich möchte, dass die Hero-Komponente proportional ist, wenn der Bildschirm größer als x wird?
Das ist wahrscheinlich ein großer Hack, aber ohne Media Queries können Sie Flex verwenden, um die Höhe der Hero-Komponente auf ein intrinsisches Seitenverhältnis einzustellen, wenn der Inhalt bequem passt, und wenn nicht (kleinere Bildschirme), bestimmt die Höhe des Inhalts die Hero-Höhe. Grundsätzlich gewinnt bei jeder Bildschirmgröße der höhere Artikel. Der einzige wirkliche Nachteil (den ich kenne) ist, dass Sie ein leeres Div (Abstandshalter) benötigen, damit es in allen Browsern funktioniert, einschließlich IE.
Ich mag diese Methode, weil man keine Ahnung oder Einschränkungen hinsichtlich der Menge des Inhalts bei jeder Bildschirmgröße haben muss, und sie kann auf alle Arten von Komponenten über Hero-Komponenten hinaus angewendet werden – geteilte Spalten, Galerien usw. Es funktioniert einfach irgendwie.
Ich habe die Ursache nicht genauer untersucht, aber die Fluid-Typografie-Beispiele funktionieren in Safari nicht. (v.12.0. unter MacOS 10.13.6)
Wie oft ändern die Leute die Größe ihrer Browser? Mobile Nutzer tun das nicht, Windows-Nutzer maximieren ihre Browser, Mac ist normalerweise auf eine bevorzugte Größe eingestellt. Die einzigen Leute, die das tun (und die ich kenne), sind die Entwickler, die für verschiedene Ansichten testen.
Hallo Michail! Es stimmt absolut, dass die einzigen Leute, die ihre Browser in der Größe ändern, wir Entwickler sind :) Aber da man die tatsächliche Bildschirmgröße, die der Nutzer haben wird, nicht vorhersagen kann, denke ich, ist es am besten, alle Größen abzudecken. Und so wird viel Zeit mit dem Ändern der Browsergröße verbracht.
Auf Mobilgeräten und Tablets konsumieren einige Leute Inhalte manchmal im Querformat. Das Drehen eines Geräts zwischen Hoch- und Querformat ist vergleichbar mit dem Ändern der Größe eines Desktop-Browsers.
„vergessen Sie nicht, Ihre Werte vor und nach den Breakpoints in der calc()-Funktion zurückzusetzen“
Könnten Sie dies genauer erklären oder ein Beispiel geben?
Hey Martino! Das ist eine tolle Technik. Ich hätte nie gedacht, dass man den Fluid-Typografie-Ansatz für andere Eigenschaften verwenden könnte.
Die Anwendung auf Padding und Zeilenhöhe erscheint mir etwas übertrieben (ich würde einfach em und einheitlos bzw. jeweils verwenden), aber die responsive Höhe bei der "Hero"-Komponente hat mir absolut gefallen. Kudos.
Warum absolute Positionierung anstelle von Flexbox verwenden, um die Elemente zu zentrieren?
Ich würde gerne sehen, wie diese Technik mit Flexbox und nicht mit absoluter Positionierung verwendet wird.
Ich benutze immer https://websemantics.uk/tools/responsive-font-calculator/ zum Generieren von Fluid-Typografie, es ist absolut genial und erspart viel Kopfzerbrechen und Zeit.
Danke!
Können Sie die Mathematik hinter der Gleichung detaillierter erklären? Zum Beispiel, wenn ich eine kürzere fließende Hero-Komponente haben möchte.
Schöner Artikel und danke für die Formel, die in den meisten Fällen sehr gut funktioniert.
Ich habe damit experimentiert und eine kleine SCSS-Mixin erstellt, um die Anwendung zu testen und zu vereinfachen, Reduktion...
Ich hasse Websites, die die Schriftgröße auf kleineren Bildschirmen verkleinern. Das ergibt keinen Sinn! Wenn überhaupt, sollte die Schrift auf einem Mobilgerät größer sein.
Die Pixel auf einem Mobilgerät sind bereits kleiner. Diese "Fluid Typography"-Tricks sind normalerweise nur ein Weg für einen Entwickler, seine "responsiven" Fähigkeiten zu zeigen.
Wäre das nicht eher ein Problem der Implementierung als der Methode?
Absolut richtig. Deshalb mache ich es umgekehrt. Oft geht die Kurve von groß (kleiner Bildschirm) zu mittel (mittlerer Bildschirm) und dann wieder zurück zu groß auf sehr großen Bildschirmen. Leute erkennen nicht, wie viel einfacher es ist, Informationen aufzunehmen, wenn die Schriftgröße gut lesbar ist. Ich kann Entwickler nur ermutigen, mutig zu sein und auf dem kleinsten Bildschirm nicht unter 18px zu gehen. Meine bisherigen Erfahrungen haben gezeigt, dass dies zunächst riesig erscheint, aber wenn man sich daran gewöhnt hat und eine Website findet, die auf einem 320px breiten Bildschirm 12px hat, muss man wirklich blinzeln und hat Schwierigkeiten, den Inhalt zu lesen. Groß denken oder untergehen! ;)
Ich habe mich vor einiger Zeit an etwas Ähnlichem versucht und mich schließlich dafür interessiert, ein Seitenverhältnis für Mobilgeräte, ein anderes Seitenverhältnis für Desktops zu steuern und dann Calc zu verwenden, um von einem zum anderen zu wechseln. Ich habe es mit der Höhe des Elements gemacht und min- und max- verwendet, um meine "Locks" festzulegen: https://codepen.io/jhogue/pen/ZpNqZm
Meine Herren, bitte hören Sie auf zu hacken und vw, vh Einheiten für Schriftgrößen zu verwenden (es ist sehr selten nötig), ich weiß, dass viele Entwickler es geschafft haben, diesen Hack zu verwenden, leider verursacht er viele Probleme und funktioniert nicht gut auf verschiedenen Geräten.
Wenn Sie die Schriftgröße in Pixeln definieren, wird sie auf einem kleinen Full-HD-Mobilgerät nicht 16px groß sein.
Auf Mobilgeräten geschieht diese Art von Magie. Pixel werden standardmäßig in cm und mm umgewandelt.
https://www.unitconverters.net/typography/pixel-x-to-centimeter.htm
Wenn Sie einen Bildschirm finden, auf dem alles größer oder kleiner sein sollte (zum Beispiel ein Smart-TV-Browser), passen Sie einfach die Zoom-Einstellung mit einer Media Query an.
Wenn Sie einen Bildschirm wie diesen haben
https://www.overclockers.co.uk/aoc-agon-ag352ucg-35-3440×1440-ips-g-sync-100hz-widescreen-ultrawide-curved-led-monitor-black-si-mo-04f-ao.html
und die Schriftgröße basiert auf der ViewportWidth, wird sie sehr groß sein und die Seite wird kaputt gehen.
Wenn Sie sicher sind, dass Sie die Schrift auf allen Bildschirmen in gleicher Größe sehen möchten, verwenden Sie cm oder mm Werte, und das wird immer der Fall sein. Das sind keine CSS-Tricks, sondern CSS-Hacks, die Sie anwenden.