9 Responsive Design

9.1 Medienabfragen

Medienabfragen (Media Queries) sind ein zentraler Bestandteil von Responsive Design und ermöglichen es, CSS-Regeln basierend auf den Eigenschaften des Geräts oder Viewports anzuwenden. Mit Medienabfragen lassen sich Layouts, Schriftgrößen und andere Stilregeln an die Bildschirmgröße, Auflösung und Ausrichtung des Geräts anpassen, um eine optimale Benutzererfahrung auf verschiedenen Geräten zu gewährleisten.

9.1.1 Grundlegende Syntax für Medienabfragen

Medienabfragen werden mit dem Schlüsselwort @media definiert, gefolgt von einem Bedingungsausdruck, der festlegt, wann die Regeln innerhalb der Medienabfrage angewendet werden. Die am häufigsten verwendete Bedingung ist die Bildschirmbreite (width), um Layouts je nach Gerätetyp (z. B. Smartphone, Tablet, Desktop) anzupassen.

/* Allgemeine Stile für alle Bildschirmgrößen */
body {
    font-size: 16px;
}

/* Spezifische Stile für Bildschirme mit einer maximalen Breite von 768px */
@media (max-width: 768px) {
    body {
        font-size: 14px;
    }
}

In diesem Beispiel wird die Schriftgröße für Bildschirme mit einer Breite von maximal 768px reduziert.

9.1.2 Wichtige Bedingungen und Operatoren für Medienabfragen

9.1.2.1 Bildschirmbreiten (width)

Die Breite des Viewports ist die häufigste Bedingung in Medienabfragen, um unterschiedliche Layouts für Smartphones, Tablets und Desktops zu erstellen.

@media (min-width: 768px) {
    /* Layout für Tablets und Desktops */
    .sidebar {
        display: block;
    }
}

9.1.2.2 Bildschirmhöhe (height)

Ähnlich wie die Breite kann auch die Höhe des Bildschirms genutzt werden, um Stile basierend auf der vertikalen Größe des Viewports anzupassen. Diese Bedingung wird oft für Geräte mit kleineren Bildschirmhöhen, wie mobile Geräte im Querformat, genutzt.

@media (max-height: 500px) {
    .header {
        display: none;
    }
}

9.1.2.3 Auflösung und Pixeldichte

Mit der resolution-Bedingung lässt sich die Pixeldichte des Bildschirms ansprechen. Diese Bedingung ist besonders nützlich, um hochauflösende Bilder und Grafiken für Retina-Displays bereitzustellen.

@media (min-resolution: 2dppx) {
    .logo {
        background-image: url('logo@2x.png');
    }
}

Hier wird ein hochauflösendes Bild verwendet, wenn das Gerät eine Pixeldichte von mindestens 2 dppx (Dots per Pixel) hat.

9.1.2.4 Ausrichtung (orientation)

Mit der orientation-Bedingung kann die Ausrichtung des Bildschirms (Hoch- oder Querformat) angesprochen werden. Diese Bedingung ist nützlich für das Anpassen des Layouts, wenn Benutzer ihre Geräte drehen.

@media (orientation: landscape) {
    .sidebar {
        display: block;
    }
}

Hier wird die Sidebar nur im Querformat angezeigt.

9.1.3 Kombinieren von Bedingungen

Mehrere Bedingungen lassen sich kombinieren, um spezifischere Medienabfragen zu erstellen. Bedingungen werden durch and verknüpft, um sicherzustellen, dass alle Bedingungen zutreffen müssen.

@media (min-width: 768px) and (orientation: landscape) {
    .sidebar {
        display: block;
    }
}

Hier wird die Sidebar nur angezeigt, wenn die Bildschirmbreite mindestens 768px beträgt und der Bildschirm im Querformat ist.

9.1.4 Breakpoints für Responsive Design

Breakpoints sind vordefinierte Bildschirmbreiten, bei denen das Layout geändert wird, um auf verschiedene Gerätegrößen zu reagieren. Typische Breakpoints sind:

/* Smartphone */
@media (max-width: 600px) {
    /* Stile für Smartphones */
}

/* Tablets */
@media (min-width: 600px) and (max-width: 1024px) {
    /* Stile für Tablets */
}

/* Desktops */
@media (min-width: 1024px) {
    /* Stile für Desktops */
}

9.1.5 Beispiel für ein responsives Layout mit Medienabfragen

/* Standardlayout für Desktops */
.container {
    display: flex;
    flex-direction: row;
}

/* Anpassungen für Tablets */
@media (max-width: 1024px) {
    .container {
        flex-direction: column;
    }
}

/* Anpassungen für Smartphones */
@media (max-width: 600px) {
    .container {
        padding: 10px;
    }
    .sidebar {
        display: none;
    }
}

In diesem Beispiel bleibt das Layout auf Desktops in einer Zeile (Reihe), wechselt jedoch auf Tablets zu einer Spaltenstruktur und blendet auf Smartphones die Sidebar aus.

9.1.6 Vorteile und Best Practices

9.2 Responsive Einheiten

Responsive Einheiten sind CSS-Einheiten, die sich dynamisch an die Größe des Viewports oder des umgebenden Containers anpassen. Sie sind entscheidend für Responsive Design, da sie flexible Layouts und Elemente ermöglichen, die auf unterschiedlichen Bildschirmgrößen und Geräten optimal dargestellt werden.

9.2.1 Relative Einheiten

Relative Einheiten passen sich im Vergleich zu einem übergeordneten Element oder dem Viewport an und sind daher ideal für responsive Designs.

9.2.1.1 Prozent (%)

Prozente werden relativ zur Größe des übergeordneten Containers berechnet, was sie besonders nützlich für fließende Layouts macht.

.container {
    width: 80%; /* 80% der Breite des übergeordneten Elements */
}

9.2.1.2 em und rem

.container {
    font-size: 1.2rem; /* Skaliert basierend auf der Root-Schriftgröße */
    padding: 2em; /* Basierend auf der Schriftgröße des Containers */
}

Verwendung: - em eignet sich gut für Inline-Elemente und Bereiche, deren Größe vom Eltern-Element abhängen soll. - rem bietet Konsistenz, da es sich nicht durch die Verschachtelung beeinflussen lässt und eignet sich gut für globale Schriftgrößen.

9.2.2 Viewport-Einheiten

Viewport-Einheiten sind relativ zur Größe des Ansichtsfensters und passen sich bei Änderung der Fenstergröße dynamisch an. Sie eignen sich hervorragend für responsive Designs, die sich an den Bildschirm anpassen sollen.

.header {
    font-size: 3vw; /* Schriftgröße entspricht 3% der Bildschirmbreite */
    height: 50vh;   /* Höhe entspricht 50% der Bildschirmhöhe */
}

9.2.3 min(), max(), und clamp()

Diese Funktionen bieten mehr Flexibilität, indem sie dynamisch zwischen Werten wechseln und die Größe auf einem Minimum oder Maximum begrenzen.

9.2.3.1 min()

min() wählt den kleineren von zwei oder mehr Werten, um sicherzustellen, dass ein Element nicht größer wird als der festgelegte Wert.

.container {
    width: min(90%, 400px); /* Maximal 90% des Containers, aber nicht mehr als 400px */
}

9.2.3.2 max()

max() wählt den größeren von zwei oder mehr Werten, was nützlich ist, um ein Element auf eine Mindestgröße zu setzen.

.container {
    width: max(300px, 50%); /* Mindestens 300px, aber kann 50% des Containers erreichen */
}

9.2.3.3 clamp()

clamp() legt einen dynamischen Wert mit festgelegtem Minimum und Maximum fest. Die Syntax lautet: clamp(min, preferred, max).

.container {
    font-size: clamp(1rem, 2vw, 2rem); /* Dynamische Schriftgröße, begrenzt zwischen 1rem und 2rem */
}

9.2.4 Anwendungsbeispiele für Responsive Einheiten

9.2.4.1 Dynamische Schriftgröße

body {
    font-size: clamp(1rem, 1.5vw, 2rem); /* Passt die Schriftgröße dynamisch an */
}

9.2.4.2 Anpassbare Margins und Paddings

.section {
    padding: 5vh 10vw; /* Vertikaler Abstand relativ zur Viewport-Höhe und horizontal zur -Breite */
}

9.2.4.3 Bildgrößen und Abstände

.image {
    width: 100%;       /* Breite passt sich dem Eltern-Container an */
    max-width: 50vw;   /* Maximale Breite auf 50% des Viewports beschränkt */
}

9.2.5 Vorteile und Best Practices

9.3 Mobile-First-Ansatz

Der Mobile-First-Ansatz ist eine Designstrategie für responsive Webseiten, bei der zunächst das Layout und die Funktionalität für kleine Bildschirme (z. B. Smartphones) entwickelt wird, bevor es schrittweise für größere Bildschirmgrößen erweitert wird. Diese Herangehensweise stellt sicher, dass eine Webseite auf mobilen Geräten optimal und benutzerfreundlich ist, was zunehmend wichtiger wird, da die Mehrheit der Nutzer über mobile Endgeräte auf das Internet zugreift.

9.3.1 Prinzipien des Mobile-First-Ansatzes

  1. Minimalismus und Fokus auf das Wesentliche: Da mobile Geräte oft nur begrenzten Platz bieten, konzentriert sich das Design zunächst auf die Kerninhalte und Hauptfunktionen.
  2. Performance-Optimierung: Kleinere Bildschirme bedeuten meist langsamere Verbindungen. Daher sollte der Mobile-First-Ansatz eine schnelle Ladezeit und geringe Datenanforderungen berücksichtigen.
  3. Progressive Enhancement: Zusätzliche Stile und Funktionen werden für größere Bildschirme hinzugefügt, anstatt sie für kleinere Bildschirme zu entfernen. Der Basisstil wird für mobile Geräte geschrieben, und dann kommen mit Medienabfragen weitere Stile für größere Viewports hinzu.

9.3.2 Implementierung des Mobile-First-Ansatzes

Im Mobile-First-Ansatz werden CSS-Regeln zunächst ohne Medienabfragen definiert. Spezifische Anpassungen für größere Bildschirme werden dann mit min-width-Medienabfragen hinzugefügt.

9.3.2.1 Beispiel einer Mobile-First-CSS-Struktur

/* Basisstile für mobile Geräte */
body {
    font-size: 16px;
    padding: 10px;
}

.container {
    display: flex;
    flex-direction: column;
}

.navbar {
    font-size: 1.2rem;
    padding: 1rem;
}

/* Anpassungen für Tablets */
@media (min-width: 768px) {
    .container {
        flex-direction: row;
    }

    .navbar {
        font-size: 1.4rem;
    }
}

/* Anpassungen für Desktops */
@media (min-width: 1024px) {
    body {
        font-size: 18px;
        padding: 20px;
    }

    .navbar {
        font-size: 1.6rem;
    }
}

In diesem Beispiel wird das Layout für mobile Geräte erstellt. Wenn der Bildschirm mindestens 768px breit ist, ändert sich das Layout für Tablets. Ab 1024px wird das Layout für größere Desktop-Bildschirme angepasst.

9.3.3 Vorteile des Mobile-First-Ansatzes

  1. Bessere Performance auf mobilen Geräten: Da die Basisstile auf mobile Geräte ausgelegt sind, bleibt die Webseite auf Smartphones schnell und leichtgewichtig.
  2. Nutzerzentrierte Gestaltung: Der Mobile-First-Ansatz führt zu einem Design, das die Nutzererfahrung auf mobilen Geräten optimiert und eine hohe Benutzerfreundlichkeit auf kleineren Bildschirmen sicherstellt.
  3. Zukunftssichere Webseiten: Die mobile Nutzung wird weiterhin zunehmen, und Mobile-First stellt sicher, dass die Webseite auch in Zukunft auf modernen Geräten gut funktioniert.

9.3.4 Best Practices für Mobile-First

9.4 Responsive Bilder und Videos

Responsive Bilder und Videos sind entscheidend, um Medieninhalte an verschiedene Bildschirmgrößen und -auflösungen anzupassen. Dadurch werden Ladezeiten und Datenverbrauch optimiert, was besonders auf mobilen Geräten eine bessere Benutzererfahrung bietet. HTML und CSS bieten mehrere Techniken, um sicherzustellen, dass Bilder und Videos auf jedem Gerät korrekt angezeigt werden.

9.4.1 Responsive Bilder

Bilder sollten in einer Weise eingebunden werden, dass sie sich dynamisch an die Bildschirmgröße und Auflösung anpassen können.

9.4.1.1 1. Fluid Images mit CSS

Durch CSS können Bilder so eingestellt werden, dass sie innerhalb ihres Containers flexibel skaliert werden.

img {
    max-width: 100%;
    height: auto;
}

Diese Regel sorgt dafür, dass das Bild seine Breite an den Container anpasst, ohne das Seitenverhältnis zu verlieren.

9.4.1.2 2. HTML-Attribute für responsive Bilder

HTML5 bietet Attribute wie srcset und sizes, um für verschiedene Bildschirmgrößen und -auflösungen unterschiedliche Bildquellen bereitzustellen.

<img 
    src="small.jpg" 
    srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 1500w" 
    sizes="(max-width: 600px) 100vw, (min-width: 601px) and (max-width: 1200px) 50vw, 33vw" 
    alt="Beispielbild">

In diesem Beispiel wird auf kleinen Bildschirmen das Bild in voller Breite (100vw), auf mittleren Bildschirmen mit 50% der Breite (50vw) und auf großen Bildschirmen mit einem Drittel der Breite (33vw) angezeigt.

9.4.1.3 3. Das <picture>-Element für verschiedene Bildformate

Das <picture>-Element ermöglicht die Auswahl unterschiedlicher Bildquellen basierend auf Bedingungen wie der Bildschirmbreite oder dem Bildformat.

<picture>
    <source srcset="image.webp" type="image/webp">
    <source srcset="image.jpg" type="image/jpeg">
    <img src="image.jpg" alt="Beispielbild">
</picture>

In diesem Beispiel wird, wenn unterstützt, das Bild im modernen WebP-Format geladen, andernfalls greift der Browser auf die JPEG-Version zurück.

9.4.2 Responsive Videos

Ähnlich wie Bilder sollten auch Videos an verschiedene Bildschirmgrößen angepasst werden.

9.4.2.1 1. Fluid Videos mit CSS

Mit der folgenden CSS-Technik kann ein Video so eingestellt werden, dass es sich an den Container anpasst und das Seitenverhältnis beibehält.

.video-container {
    position: relative;
    padding-bottom: 56.25%; /* Seitenverhältnis 16:9 */
    height: 0;
    overflow: hidden;
}

.video-container iframe,
.video-container video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
<div class="video-container">
    <iframe src="https://www.youtube.com/embed/beispielvideo" frameborder="0" allowfullscreen></iframe>
</div>

In diesem Beispiel wird ein Video im 16:9-Format durch die CSS-Eigenschaft padding-bottom: 56.25% in einem responsiven Container eingebettet. Die Breite und Höhe des Videos passen sich dynamisch an die Größe des Containers an.

9.4.2.2 2. Das <video>-Element mit verschiedenen Quellen

Das <video>-Element unterstützt das Einbinden mehrerer Videoquellen für verschiedene Formate. Dies ist nützlich, da nicht alle Browser alle Videoformate unterstützen.

<video controls>
    <source src="video.mp4" type="video/mp4">
    <source src="video.webm" type="video/webm">
    Dein Browser unterstützt dieses Videoformat nicht.
</video>

Hier stellt das <video>-Element sicher, dass das Video für die meisten Browser abspielbar ist, indem es mehrere Formate anbietet.

9.4.2.3 3. Videos im Hintergrund

Um ein Video im Hintergrund responsiv zu gestalten, kann CSS verwendet werden:

.background-video {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: -1;
}
<video class="background-video" autoplay muted loop>
    <source src="background.mp4" type="video/mp4">
    <source src="background.webm" type="video/webm">
</video>

Mit der CSS-Eigenschaft object-fit: cover passt sich das Video an, ohne sein Seitenverhältnis zu verlieren.