CSS/Media Queries/Einstieg

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Dieses Tutorial ist eine Einführung in Medienabfragen (media queries), insbesondere deren Notation und die verschiedenen Möglichkeiten von Gruppierung und Kombination.

Ziel des Kurses ist es zu verstehen, wie Media Queries verwendet werden und wie man sie am häufigsten für die Erstellung von responsiven Designs einsetzt.

Medientypen

Die Angabe eines Medientyps erfolgt als einfaches Schlüsselwort, z. B. screen oder print.

Medienabfrage im Stylesheet
/* CSS-Regeln für alle Ausgabegeräte */
body {
  color: white;
  background-color: #333;
}
@media print {
  /* zusätzliche oder abweichende CSS-Regeln für Drucker */
  body {
    color: black;
    background-color: white;
  }
  nav, .sidebar {
    display:none;
  }
}

In diesem Beispiel sind die CSS-Regeln für unterschiedliche Ausgabemedien in einer Ressource zusammengefasst:

Zuerst werden Festlegungen für die Bildschirmansicht notiert (das @all, bzw. @screen kann man weglassen). Auf einem dunklen Hintergrund soll die Schriftfarbe weiß sein.

In einer Medienabfrage @media print {} werden Formatierungen für den Druck festgelegt. Da weiße Schrift auf einem Drucker sinnlos wäre, wird die Schriftfarbe auf Schwarz gesetzt.

Siehe auch

Beachte: Solche Medienabfragen können im style-Element im head der Webseite, aber auch in externen Stylesheets notiert werden, nicht jedoch in style-Attributen.

Medienmerkmale abfragen

Neben den Medientypen kann ein Browser das Ausgabegerät auf Medienmerkmale untersuchen und dann das passende CSS anwenden.

p {
  color: black;
}

/* Any color device */
@media (color) {
  p {
    color: red;
  }
}

/* Farbmonitor mit mind. 8 Bit Farbtiefe */
@media (min-color: 8) {
  p {
    color: oklch(50% 0.25 30);
  }
}

Eine Medienabfrage beginnt mit @media und dem Medienmerkmal in Klammern. Die Kurzschreibweise (z. B. (color)) kann verwendet werden, um zu prüfen, ob das angegebene Merkmal von einem Ausgabemedium unterstützt wird:

  • Grundsätzlich ist die Schriftfarbe schwarz.
  • Falls das Ausgabegerät Farbe unterstützt, wird rot verwendet.

Mithilfe der vollständigen Notation (z. B. (min-color: 8)) indem innerhalb von runden Klammern ein Schlüsselwort notiert wird. Diesem Schlüsselwort folgt optional ein Doppelpunkt und ein Wert (z. B. eine Längenangabe in Pixeln oder em oder ein weiteres Schlüsselwort) wird ein zu erfüllendes Kriterium detailliert festgelegt.

  • Falls das Ausgabegerät eine Farbtiefe von mindestens 8 Bit erreicht, wird der entsprechende Wert in oklch() verwendet.


In diesem Beispiel wird mit prefers-color-scheme das bevorzugte Farbschema abgefragt:

Medienabfrage mit prefers-color-scheme
@media (prefers-color-scheme: dark) {
  /* dunkles Farbschema für die Nacht */
  body {
    color: white;
    background: black;
  }

  a {
    color: skyblue;
  }
}

@media (prefers-color-scheme: light) {
  /* helles Farbschema für den Tag */
}

Im dunklen Farbschema gibt es weiße Schrift auf schwarzem Grund; die Linkfarbe ist hellblau.

Größenangaben

Der häufigste Anwendungsfall für Medienabfragen sind responsive Designs, die sich flexibel an die Abmessungen des Viewports anpassen. Dabei überprüft der Browser eine Medienabfrage und entscheidet, ob der Viewport über oder unter einer bestimmten Breite liegt.

@media (width: 600px) {
  body {
    color: red;
  }
}

Nicht unbedingt falsch aber sinnlos: Bei einer Breite von genau 600px ist die Schriftfarbe rot, wenn sie darunter oder darüber liegt, trifft die Medienabfrage nicht zu!

Einige Medienmerkmale wie width können mit den Präfixen min- oder max- versehen werden, wodurch ihre Bedeutung um „größer oder gleich“ bzw. „kleiner oder gleich“ erweitert werden kann.

Responsive Navigation ansehen …
nav ul {
  display: flex;
  flex-direction: column;
} 

nav li {
  font-size: 1.5em;  
}

@media (min-width: 45em) {
  nav ul {	
    flex-direction: row;  
  }
  nav li {
    font-size: 1em;
  }  
}

Nach dem Grundsatz Mobile First wird zuerst ein „einfaches“ Layout für schmale Bildschirme entwickelt. Die Schriftgröße ist etwas größer; alle Inhalte werden untereinander dargestellt.

Mit @media (min-width: 45em){} wird die Breite des Viewports abgefragt. Ist sie größer als 45em, wird die Navigation nebeneinander dargestellt, damit man nicht so viel scrollen muss.


Breakpoints setzen

»Wo soll ich denn meine Breakpoints setzen? Welche Maße haben die meistverwendeten Smartphones?«

Viewportauflösungen heutiger Geräte
Quelle: https://opensignal.com/reports/fragmentation.php

Es ist heutzutage unmöglich, genaue Werte für Geräte-Abmessungen zu ermitteln, da eine Vielzahl dieser Geräte am Markt ist. SmartPhones werben mit 2000 (Geräte)Pixeln, Phablets lassen die Grenzen zwischen Phones und Tablets immer weiter verschwimmen. Hochauflösende 4K-Monitore sollen nicht für die mögliche Anzeige von mehreren DIN A4 Seiten in Mini-Schrift verwendet werden.

Eric Eggert (und wir) empfehlen:
Setze Breakpoints nicht nach vermeintlichen Gerätegrößen!


Die Breakpoints sollen sich nicht auf einige Endgeräte, sondern am Inhalt ausrichten.

  • Eine Box von 9em Breite ist auf einer breiten Seite ok - wenn der Hauptinhaltsbereich daneben aber nur 5em breit ist, sieht die Seite komisch aus. Deshalb soll der Hauptinhalt mindestens 20em Breite betragen. So wird der Breakpoint bei 30em gesetzt.
  • Bei einer Navigation wäre ein Breakpoint sinnvoll, bei dem alle Navigationselemente neben- anstatt untereinander dargestellt werden können. Dies kann bei 30em, aber auch bei einer anderen Breite passieren.
Hauptartikel: CSS/Tutorials/Einstieg/Webseiten responsiv umbauen
Empfehlung: Um Inhalte für Nutzer der unterschiedlichen Geräteklassen von der Smartwatch bis zum Breitbild-Monitor möglichst gut lesbar darzustellen, solltest du Breakpoints so einsetzen, dass alle Inhalte - insbesondere Fließtexte - ohne horizontales Scrollen erreichbar sind. Auf großen Bildschirmen sollte der Platz sinnvoll genutzt werden.
Auch sollte der Designprozess von kleinen Bildschirmen hin zu größeren gestaltet werden.
(Siehe auch: Responsiv(es Webdesign))

Merkmalstypen

Bei Medienabfragen ist zwischen zwei Merkmalstypen zu unterscheiden:[1]

  1. Merkmale mit einer Werteaufzählung (diskrete Merkmale), oder Schalter (boolesche Merkmale) bei denen das Merkmal nur auf Gleichheit mit einem der möglichen Werte geprüft werden kann. So ist die orientation entweder landscape oder portrait, prefers-color-scheme entweder light oder dark.
  2. Merkmale mit einem Wertebereich, der sich in Zahlen ausdrücken lässt und für deren Werte ein Kleiner- oder Größer-Vergleich sinnvoll ist.
    Durch Voranstellen von "min-" oder "max-" vor dem Merkmalsnamen wird auf einen Mindest- oder Höchstwert getestet:
    (width: 500px) ist nur erfüllt, wenn das Medium exakt 500px breit ist,
    (min-width: 500px) ist dagegen erfüllt, wenn das Medium mindestens 500px breit ist.
    (width >= 500px) in einer neueren Operatoren-Schreibweise

Mit der Stufe 4 der Media Queries Spezifikation ist eine für Programmierer ansprechendere Schreibweise hinzugekommen. Man vergleicht Merkmal und Wert mittels der vertrauten Operatoren =, <, <=, > und >=.[2]

Außerdem gibt es eine Bereichsabfrage. Um zu prüfen, ob ein Merkmal in einem Bereich liegt, wird (minimum <= merkmal <= maximum) oder auch (maximum >= merkmal >= mininum) notiert.


Anhang

In Ergänzung zum Tutorial gibt es hier noch einige Abschnitte, die Anfänger (noch) nicht brauchen - Profis und Fortgeschrittene aber gerne nachschlagen können:

Einbindung mehrerer Stylesheets im head

Am Anfang des Tutorials wurde gezeigt, wie Medienabfragen innerhalb eines Stylesheets verwendet werden. Bei großen Projekten können so auch mehrere link-Elemente auf mehrere verschiedene Stylesheets verweisen.

Medienabfrage im HTML-Dokument
<head>
    <link rel="stylesheet" media="screen" href="bildschirm-stylesheet.css" >
    <link rel="stylesheet" media="print"  href="druck-stylesheet.css" >
</head>

In diesem Beispiel sind zwei Stylesheets eingebunden. Zuerst lädt der Browser bei der Bildschirmausgabe das „Bildschirm-Stylesheet“. Falls die Webseite ausgedruckt wird, lädt er das „Druck-Stylesheet“ für Drucker und gleichartige Geräte (Medientyp print) nach.

Beachte: Auf diese Weise bindest du zwei unabhängige Formatvorlagen ein. Sollen auch in der Druckdarstellung viele Formate aus der Bildschirmdarstellung verwendet werden, müssen diese in beiden Dateien eingetragen und dauerhaft gepflegt, sowie doppelt übertragen werden. Zwei unabhängige Dateien sind daher nur sinnvoll, wenn die Druckdarstellung erheblich von der Bildschirmdarstellung abweicht.

Gruppierung und Kombination

UND Kombination

Eine einzelne Medienabfrage kann aus einer Typ-Abfrage und einer Anzahl von Feature-Abfragen bestehen. Alle Teile sind optional, und sie werden durch das Schlüsselwort and miteinander verknüpft. Jeder einzelne Teil muss erfüllt sein, damit die Medienabfrage als erfüllt gilt.

Beispiel
@media (min-width: 30em) and (max-width: 60em) { 
  /* Kompaktes Layout */ 
}
@media print and (min-width: 60em) { 
  /* Print-Layout auf genügend breitem Papier */ 
}

Die erste Medienabfrage enthält keine Typabfrage, nur zwei Feature-Abfragen. Durch die Kombination von min-width und max-width kann der Breitenbereich von 30em bis 60em erfasst werden.

Die zweite Abfrage gilt nur für den Medientyp print (Druck oder Druckvorschau) und hinreichend breites Papier.

Beachte: Du kannst Feature-Abfragen erstellen, die für den verwendeten Medientyp nicht definiert sind, oder die es noch nicht gibt. Beispielsweise das Bildschirm-Feature scan für den Typ print. Oder das unbekannte Feature threeD Solche Feature-Abfragen gelten als grundsätzlich nicht erfüllt und würden dazu führen, dass die vollständige Medienabfrage nicht erfüllt wird.

Verneinungen in einer Query - Vorsicht Falle!

Es ist auch möglich, Medienabfragen so zu formulieren, dass die Abfragen nicht zutreffen sollen, um die gewünschten CSS Regeln zu aktivieren. Es gibt zwei Arten der Verneinung, was leider verwirren kann.

Zum einen kann man eine komplette Abfrage verneinen, indem man der Abfrage das Schlüsselwort not voranstellt:

Verneinung der ganzen Abfrage
@media not print and (min-width: 60em) { 
  /* Schmales Papier, oder keine Druckausgabe */ 
}
Beachte: Dieses vorangestellte not negiert die komplette Abfrage. Ist der Typ nicht print, oder ist die Breite zu schmal, ist print and (min-width: 60em) nicht erfüllt und darum ist die Umkehrung erfüllt.

Zum anderen kann man eine einzelne Feature-Abfrage verneinen. Hier ist Vorsicht geboten, wenn die Verneinung zu Beginn der Medienabfrage steht. Folgt auf das not ein Medientyp, wird die ganze Abfrage verneint. Sonst nur das einzelne Feature!

Verneinung von Medienabfragen und Medientypen
/* Negiert nur die erste Feature-Abfrage! */
@media not (min-width: 60em) and (min-height: 40em) {    
   /* Regeln gelten wenn min-width unter 60 UND min-height über 40 */
}

/* Negiert die ganze Medienabfrage! */
@media not screen and (min-width: 60em) and (min-height: 40em) {    
   /* Regeln gelten für Drucker ODER min-width unter 60 ODER min-height unter 40 */
}
Beachte: Die Negierung von Feature-Abfragen funktioniert derzeit nur im Firefox-Browser. Von Chromium-Browsern wird ein not daher nur verstanden, wenn dahinter ein Medientyp folgt.

Gruppieren mehrerer Medienabfragen zu einer Liste

Eine ODER-Verknüpfung innerhalb einer Medienabfrage ist nicht vorgesehen. Statt dessen kann man mehrere Medienabfragen formulieren und durch Komma trennen. Analog zu einer Liste von CSS Selektoren genügt es, dass eine der Abfragen in dieser Liste erfüllt ist, damit die CSS-Regeln angewendet werden, die von dieser Liste abhängig sind. Der Anwendungsbereich für Abfragelisten ist begrenzt, eine ODER-Kombination war relevanter, als es noch mehr als zwei Medientypen gab.

Beispiel
@media screen and (min-width: 80em), print and (orientation: landscape) { ... } { 
  /* Breite Darstellung. */ 
}
Festlegung von CSS Regeln für eine Mindestbreite von 80em auf dem Bildschirm, oder einen Druck im Querformat .

Bei der UND-Verknüpfung wurde erwähnt, dass durch Abfragen eines Features, das für einen Medientyp nicht vorhanden ist, die gesamte Medienabfrage als "nicht erfüllt" gilt. Befindet sich eine solche Feature-Abfrage in einer Medienabfrage, die Teil einer Liste ist, so wird dadurch nur diese einzelne Abfrage auf "nicht erfüllt" gesetzt. Andere Abfragen der Liste können immer noch erfüllt werden.


Siehe auch

  • Dark Mode

    Lass' die Nutzer entscheiden:

    Vorschau-01-groß.png
  • Container Queries




    Die neue revolutionäre Methode Entwurfsmuster flexibel zu formatieren!

  • Print-CSS (Druckausgabe)

    Druckvorlage


Weblinks

  1. MDN: Targeting media features in Using media queries
  2. csswg.org: 5.1. Size Container Features