Ergebnis 1 bis 4 von 4

Thema: Fluid Typography clamp() mit nativem CSS und Custom Properties

  1. #1
    Contao-Fan Avatar von Kopfnuss
    Registriert seit
    05.09.2012.
    Ort
    Zwickau
    Beiträge
    353
    Partner-ID
    11375
    Contao-Projekt unterstützen

    Support Contao

    Standard Fluid Typography clamp() mit nativem CSS und Custom Properties

    Ich habe mir eine kleine Lösung für fluid typography nur mit nativem CSS gebaut. Dabei wollte ich die Schriftgrößen zwischen einem Minimum und einem Maximum dynamisch an die Viewport-Breite anpassen, basierend auf der bekannten Formel:
    Code:
    slope = (maxFontSize - minFontSize) / (maxWidth - minWidth)
    yAxisIntersection = -minWidth * slope + minFontSize
    preferredValue = yAxisIntersection[rem] + (slope * 100)[vw]
    Link zur Beschreibung bei CSS-Tricks: https://css-tricks.com/linearly-scal...-the-viewport/

    Tokens im :root

    Zuerst definiere ich die Fontgrößen und Breakpoints als Custom Properties.
    Dabei gibt es zwei Varianten pro Wert:

    • einmal mit Einheit (rem) ? für die direkte Verwendung in clamp()
    • einmal ohne Einheit (nur Zahl) ? damit ich im calc() rechnen kann.


    Beispiel:
    Code:
    :root {
        /* font sizes */
        --font-size-heading-lg-min: 2.125rem;
        --font-size-heading-lg-max: 2.5rem;
        --font-size-heading-lg-min-no-unit: 2.125;
        --font-size-heading-lg-max-no-unit: 2.5;
        --font-size-heading-xl-min: 2.65rem;
        --font-size-heading-xl-max: 3.625rem;
        --font-size-heading-xl-min-no-unit: 2.65;
        --font-size-heading-xl-max-no-unit: 3.625;
        --font-size-heading-xxl-min: 2.875rem;
        --font-size-heading-xxl-max: 6rem;
        --font-size-heading-xxl-min-no-unit: 2.875;
        --font-size-heading-xxl-max-no-unit: 6;
    
        /* breakpoints for fluid typography */
        --fluid-breakpoint-min: 26.25rem; /* 420px */
        --fluid-breakpoint-max: 90rem; /* 1440px */
        --fluid-breakpoint-min-no-unit: 26.25; /* 420px */
        --fluid-breakpoint-max-no-unit: 90; /* 1440px */
    }
    Warum das?
    CSS erlaubt es nicht, Einheiten zu „wegzudividieren“. Man kann keine Länge durch eine Länge teilen (10rem / 2rem ist ungültig).
    Darum trenne ich die Zahlen (unitless) und die Längen.

    Anwendung in h1 und h2

    Für jedes Heading berechne ich lokal die Parameter:
    Code:
    h1 {
        /* fluid typography parameters */
        --min-font-size: var(--font-size-heading-xxl-min);
        --max-font-size: var(--font-size-heading-xxl-max);
    
        --min-font-size-no-unit: var(--font-size-heading-xxl-min-no-unit);
        --max-font-size-no-unit: var(--font-size-heading-xxl-max-no-unit);
    
        /* fluid typography */
        --slope: calc(
            (var(--max-font-size-no-unit) - var(--min-font-size-no-unit)) /
                (var(--fluid-breakpoint-max-no-unit) - var(--fluid-breakpoint-min-no-unit))
        );
        --intercept: calc(
            var(--min-font-size) - (var(--max-font-size-no-unit) - var(--min-font-size-no-unit)) /
                (var(--fluid-breakpoint-max-no-unit) - var(--fluid-breakpoint-min-no-unit)) * var(--fluid-breakpoint-min)
        );
    
        font-size: var(--font-size-heading-xl-min); /* Fallback */
        font-size: clamp(var(--min-font-size), calc(var(--intercept) + var(--slope) * 100vw), var(--max-font-size));
    }
    
    h2 {
        /* fluid typography parameters */
        --min-font-size: var(--font-size-heading-xl-min);
        --max-font-size: var(--font-size-heading-xl-max);
    
        --min-font-size-no-unit: var(--font-size-heading-xl-min-no-unit);
        --max-font-size-no-unit: var(--font-size-heading-xl-max-no-unit);
    
        /* fluid typography */
        --slope: calc(
            (var(--max-font-size-no-unit) - var(--min-font-size-no-unit)) /
                (var(--fluid-breakpoint-max-no-unit) - var(--fluid-breakpoint-min-no-unit))
        );
        --intercept: calc(
            var(--min-font-size) - (var(--max-font-size-no-unit) - var(--min-font-size-no-unit)) /
                (var(--fluid-breakpoint-max-no-unit) - var(--fluid-breakpoint-min-no-unit)) * var(--fluid-breakpoint-min)
        );
    
        font-size: var(--font-size-heading-xl-min); /* Fallback */
        font-size: clamp(var(--min-font-size), calc(var(--intercept) + var(--slope) * 100vw), var(--max-font-size));
    }
    • clamp() sorgt dafür, dass die Schrift nie kleiner als das Minimum und nie größer als das Maximum wird.
    • Der mittlere Teil (intercept + slope * 100vw) gibt den fließenden Übergang zwischen den beiden Werten.
    • Die erste font-size-Zeile ist ein Fallback für alte Browser, die clamp() nicht verstehen.


    Alternativ gibt es auch Apps zum Berechnen der Werte: https://fluid.style
    Geändert von Kopfnuss (24.09.2025 um 15:39 Uhr)

  2. #2
    Contao-Urgestein
    Registriert seit
    24.02.2021.
    Beiträge
    1.712
    Partner-ID
    11715
    Contao-Projekt unterstützen

    Support Contao

    Standard

    I like!

  3. #3
    Contao-Fan Avatar von mdoll
    Registriert seit
    25.06.2009.
    Ort
    Wietze
    Beiträge
    362

    Standard

    Zitat Zitat von Kopfnuss Beitrag anzeigen
    Alternativ gibt es auch Apps zum Berechnen der Werte: https://fluid.style
    Oder https://utopia.fyi/type/calculator/

    Da kann man auch noch Abstände und Grids berechnen.

    Gruß
    Mathias
    The idea is to die young as late as possible!

  4. #4
    Community-Moderatorin & Contao-Urgestein Avatar von mlweb
    Registriert seit
    10.07.2011.
    Beiträge
    7.543
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Es gibt etliche solcher Generatoren. Derzeit mein Favorit https://www.fluid-type-scale.com/calculate
    Hier kann man auch die Einheit cqi (container inline size) verwenden, was z.B. sehr hilfreich für Schriftgrößen in Textboxen ist.
    Ich habe Dir mit meinen Hinweisen geholfen und Du möchtest Dich bedanken?
    Unterstütze bitte das Contao-Projekt (Button Links)
    Weitere Spendenmöglichkeiten
    ------------------------------------------------------------------------------------------------------
    Contao-Dokumentation: Contao-Handbuch und Contao-Entwickler-Doku
    Contao-Online-Video-Kurse: Contao Academy
    Funktionalität erweitern: Contao-Erweiterungen

    Für Dinge die man mit html5 und css3 lösen kann, braucht man kein javascript.




Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •