css mit Adi Prinz

Flexible Größen und Einheiten

Responsive Layouts verwenden möglichst häufig flexible Größen. Dadurch können sich Elemente an den verfügbaren Platz, die Schriftgröße und unterschiedliche Bildschirmgrößen anpassen.

Feste Werte wie px sind nicht grundsätzlich falsch. Für viele Layoutgrößen sind jedoch relative Einheiten und flexible CSS-Funktionen besser geeignet.

Absolute und relative Einheiten

Gruppe Einheiten Beschreibung
Absolute Einheit px Ein CSS-Pixel ist eine feste CSS-Einheit. Sie eignet sich beispielsweise für Rahmenbreiten oder kleine, genau festgelegte Abstände.
Schriftbezogene Einheiten em, rem, ch Diese Einheiten orientieren sich an Schriftgrößen oder Schrifteigenschaften.
Prozentwerte % Prozentwerte beziehen sich abhängig von der Eigenschaft meist auf eine Größe des umgebenden Elements.
Viewport-Einheiten vw, vh, dvh, vmin, vmax Diese Einheiten orientieren sich an den Abmessungen des Viewports.
Grid-Einheit fr Verteilt den im Grid-Container verfügbaren Platz auf Grid-Tracks.

Die Einheit rem

Die Einheit rem bezieht sich auf die Schriftgröße des Wurzelelements <html>. Bei der üblichen Browser-Standardeinstellung entspricht 1rem normalerweise 16px.

html {
  font-size: 100%;
}

body {
  font-size: 1rem;
}

h1 {
  font-size: 2.5rem;
}

.card {
  padding: 1.5rem;
  border-radius: 0.5rem;
}
    
Die Schriftgröße des Wurzelelements sollte normalerweise nicht fest auf einen kleinen Pixelwert gesetzt werden. So bleiben die Schriftgrößeneinstellungen des Browsers wirksam.

Die Einheit em

Bei der Eigenschaft font-size bezieht sich em auf die berechnete Schriftgröße des Elternelements. Bei vielen anderen Eigenschaften bezieht sich em auf die Schriftgröße des Elements selbst.

.button {
  font-size: 1rem;
  padding: 0.75em 1.5em;
  border-radius: 0.4em;
}

.button-large {
  font-size: 1.25rem;
}
    

Wird die Schriftgröße der Schaltfläche erhöht, wachsen auch das Padding und der Radius proportional mit.

Verschachtelte Schriftgrößen in em können sich mehrfach multiplizieren. Für eine besser vorhersehbare Typografie ist rem häufig einfacher.

Prozentwerte

Prozentwerte sind abhängig von der verwendeten CSS-Eigenschaft. Bei einer Breite bezieht sich der Prozentwert normalerweise auf die Breite des umgebenden Blocks.

.wrapper {
  width: 90%;
  max-width: 75rem;
  margin-inline: auto;
}

.content {
  width: 70%;
}

.sidebar {
  width: 30%;
}
    

Prozentwerte ermöglichen flexible Breiten. Abstände, Rahmen und mögliche gap-Werte müssen bei der Gesamtbreite jedoch ebenfalls berücksichtigt werden.

Die Einheit ch

Die Einheit ch orientiert sich an der Breite des Zeichens 0 der verwendeten Schrift. Sie eignet sich besonders zur Begrenzung von Textzeilen.

.text-content {
  max-width: 65ch;
}
    

Eine begrenzte Zeilenlänge verbessert bei längeren Texten häufig die Lesbarkeit. Der Wert ist keine genaue Anzahl von Zeichen, bietet dafür aber eine nützliche Orientierung.

Flexible Breite mit min()

Die Funktion min() verwendet den kleinsten der angegebenen Werte. Damit kann ein Element den verfügbaren Platz nutzen und gleichzeitig eine maximale Breite erhalten.

.page-wrapper {
  width: min(100% - 2rem, 75rem);
  margin-inline: auto;
}
    
  • Auf schmalen Bildschirmen verwendet der Bereich die verfügbare Breite abzüglich der seitlichen Abstände.
  • Auf großen Bildschirmen wird die Breite auf 75rem begrenzt.
  • margin-inline: auto zentriert den Bereich.

Mindestwerte mit max()

Die Funktion max() verwendet den größten der angegebenen Werte. Dadurch kann beispielsweise ein Mindestabstand festgelegt werden.

.page-wrapper {
  padding-inline: max(1rem, 4vw);
}
    

Der seitliche Innenabstand beträgt mindestens 1rem. Auf größeren Viewports kann er mit 4vw weiter anwachsen.

Flexible Werte mit clamp()

Die Funktion clamp() begrenzt einen bevorzugten flexiblen Wert durch einen Mindest- und einen Höchstwert.

h1 {
  font-size: clamp(2rem, 5vw, 4rem);
}
    

Die drei Angaben bedeuten:

Wert Bedeutung
2rem Kleinster erlaubter Wert
5vw Bevorzugter flexibler Wert
4rem Größter erlaubter Wert

Die Schriftgröße wächst damit fließend, wird aber weder kleiner als 2rem noch größer als 4rem.

Flexible Abstände

Nicht nur Schriftgrößen, sondern auch Abstände können sich innerhalb sinnvoller Grenzen an den verfügbaren Platz anpassen.

section {
  padding-block: clamp(2rem, 6vw, 6rem);
}

.card-grid {
  gap: clamp(1rem, 3vw, 2rem);
}
    

Kleine Viewports erhalten kompakte Abstände. Auf größeren Viewports können die Abstände fließend anwachsen, ohne unbegrenzt groß zu werden.

Flexible Layouts mit Flexbox und Grid

Relative Einheiten werden häufig mit Flexbox und Grid kombiniert. Beide Layoutsysteme können freien Platz automatisch verteilen.

Flexbox

.flex-container {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
}

.flex-item {
  flex: 1 1 16rem;
}
    

Die Elemente dürfen wachsen und schrumpfen. Wenn der Platz nicht ausreicht, werden sie durch flex-wrap: wrap in die nächste Zeile umgebrochen.

Grid

.grid-container {
  display: grid;
  grid-template-columns:
    repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
  gap: 1rem;
}
    

Grid erzeugt automatisch so viele Spalten, wie in den verfügbaren Platz passen. Auf sehr schmalen Containern verhindert min(100%, 16rem), dass eine Spalte breiter als ihr Container wird.

Feste Werte sinnvoll verwenden

Responsive Webdesign bedeutet nicht, dass Pixelwerte vollständig vermieden werden müssen. Feste Werte sind sinnvoll, wenn eine Größe tatsächlich konstant bleiben soll.

  • Rahmenbreiten wie 1px
  • kleine Schattenversätze
  • bestimmte Icon-Größen
  • Mindestgrößen für Bedienelemente
  • gezielte Breakpoints, die sich aus dem Layout ergeben
.button {
  min-height: 44px;
  padding: 0.75rem 1rem;
}
    

Im Beispiel bleibt die Mindesthöhe eindeutig festgelegt, während sich der Innenabstand an der Schriftgröße orientiert.

Zusammenfassung

  • rem eignet sich besonders für gut skalierbare Schriftgrößen und Abstände.
  • em ist nützlich, wenn Größen proportional zur Schrift eines Elements wachsen sollen.
  • Prozentwerte passen Größen an den verfügbaren Bereich an.
  • ch eignet sich zur Begrenzung gut lesbarer Textzeilen.
  • min(), max() und clamp() verbinden flexible Größen mit sinnvollen Grenzen.
  • Flexbox und Grid ermöglichen anpassungsfähige Layouts teilweise ganz ohne Media Queries.
  • Feste Pixelwerte bleiben für bestimmte, bewusst konstante Größen sinnvoll.
Gute responsive Layouts kombinieren flexible Größen mit sinnvollen Mindest- und Höchstwerten.