Die At-Rules von CSS

Avatar of Geoff Graham
Geoff Graham am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Die at-rule ist eine Anweisung, die CSS Anweisungen zur Ausführung gibt oder wie es sich verhalten soll. Jede Anweisung beginnt mit einem @, gefolgt direkt von einem von mehreren verfügbaren Schlüsselwörtern, die als Identifikator dafür dienen, was CSS tun soll. Dies ist die gängige Syntax, obwohl jede at-rule eine Variation davon ist.

Reguläre Regeln

Reguläre Regeln folgen einer regulären Syntax

@[KEYWORD] (RULE);

@charset

Diese Regel definiert den Zeichensatz, der vom Browser verwendet wird. Sie ist praktisch, wenn das Stylesheet Nicht-ASCII-Zeichen enthält (z. B. UTF-8). Beachten Sie, dass ein Zeichensatz, der im HTTP-Header platziert ist, jede @charset-Regel überschreibt.

@charset "UTF-8";

@import

Diese Regel wird ganz am Anfang der Datei eingefügt und weist das Stylesheet an, eine externe CSS-Datei anzufordern und einzubinden, als ob der Inhalt dieser Datei genau dort wäre, wo diese Zeile steht.

@import 'global.css';

Angesichts der Popularität von CSS-Präprozessoren, die @import unterstützen, sollte angemerkt werden, dass sie anders funktionieren als natives CSS. @import ist eine separate HTTP-Anforderung für diese Datei.

@namespace

Diese Regel ist besonders nützlich für die Anwendung von CSS auf XML HTML (XHTML), damit XHTML-Elemente als Selektoren im CSS verwendet werden können.

/* Namespace for XHTML */
@namespace url(http://www.w3.org/1999/xhtml);

/* Namespace for SVG embedded in XHTML */
@namespace svg url(http://www.w3.org/2000/svg);

Verschachtelte Regeln

Verschachtelte Regeln enthalten eine Teilmenge zusätzlicher Anweisungen, von denen einige bedingt für eine bestimmte Situation gelten können.

@[KEYWORD] {
  /* Nested Statements */
}

@document

Diese Regel legt Bedingungen für Stile fest, die auf eine bestimmte Seite angewendet werden. Wir können beispielsweise eine URL angeben und dann die Stile für diese spezielle Seite anpassen. Diese Stile werden auf anderen Seiten ignoriert.

@document 
  /* Rules for a specific page */
  url(https://css-tricks.de/),
  
  /* Rules for pages with a URL that begin with... */
  url-prefix(https://css-tricks.de/snippets/),
  
  /* Rules for any page hosted on a domain */
  domain(css-tricks.com),

  /* Rules for all secure pages */
  regexp("https:.*")
{
  
  /* Start styling */
  body { font-family: Comic Sans; }

}

Die Browserunterstützung für @document ist zum Zeitpunkt des Schreibens ziemlich schwach.

ChromeSafariFirefoxOperaIEAndroidiOS
NeinNeinBegrenztNeinNeinNeinNein

@font-face

Diese Regel ermöglicht es uns, benutzerdefinierte Schriftarten auf einer Webseite zu laden. Es gibt unterschiedliche Unterstützungsgrade für benutzerdefinierte Schriftarten, aber diese Regel akzeptiert Anweisungen, die diese Schriftarten erstellen und bereitstellen.

@font-face {
  font-family: 'MyWebFont';
  src:  url('myfont.woff2') format('woff2'),
        url('myfont.woff') format('woff');
}
Mehr über @font-face erfahren

Die besten Strategien zum Laden von Schriftarten und deren Umsetzung

@keyframes

Diese Regel ist die Grundlage für Keyframe-Animationen für viele CSS-Eigenschaften, indem sie es uns ermöglicht, die Start- und Stoppmarken (und die dazwischen liegenden) für das, was animiert wird, festzulegen.

@keyframes pulse {
  0% {
    background-color: #001f3f;
  }
  100% {
    background-color: #ff4136;
  }
}
Mehr über @keyframes erfahren

@media

Diese Regel enthält bedingte Anweisungen für die gezielte Anwendung von Stilen auf bestimmte Bildschirme. Diese Anweisungen können Bildschirmgrößen enthalten, was nützlich sein kann, um Stile an Geräte anzupassen.

/* iPhone in Portrait and Landscape */
@media only screen 
  and (min-device-width: 320px) 
  and (max-device-width: 480px)
  and (-webkit-min-device-pixel-ratio: 2) {

    .module { width: 100%; }

}

Oder Stile nur dann anzuwenden, wenn das Dokument gedruckt wird.

@media print {

}
Mehr über @media erfahren

@page

Diese Regel definiert Stile für einzelne Seiten beim Drucken des Dokuments. Sie enthält speziell Pseudo-Elemente zum Stylen der :first-Seite sowie der :left- und :right-Ränder der Seite.

@page :first {
  margin: 1in;
}

@property

CSS-Variablen gibt es schon eine Weile. Wir können sie ziemlich einfach für alle Werte definieren, die wir regelmäßig verwenden, wie z. B. Farben.

:root {
  --primary-color: oklch(70% 0.183 42.88);
}

body {
  color: var(--primary-color);
}

Das ist natürlich fantastisch. Aber es ist nicht nur Glanz und Gloria. Zum Beispiel ist es unmöglich, zwischen zwei Variablen zu animieren, wie z. B. den Farben eines Farbverlaufs. Sie denken vielleicht, es sei möglich, durch den gesamten Farbrad zu drehen, indem Sie eine Variable für den Farbton einer Farbe in einer Farb Funktion wie dieser einrichten.

:root {
  --hue: 0;
}

body {
  animation: hue 5s linear infinite;
  background-color: hsl(var(--hue) 80% 50%);
}

@keyframes hue {
    0% { --hue; }
  100% { --hue: 360; }
}

Das sieht sicher gültig aus! Aber es funktioniert einfach nicht. Das liegt daran, dass CSS erkennt, dass diese Zahl als Zeichenkette und nicht als tatsächliche Zahl behandelt wird. Wir müssen eine sogenannte benutzerdefinierte Eigenschaft registrieren, um alles zu verbinden.

Hier kommt @property ins Spiel. Es wird verwendet, um nicht nur eine CSS-Variable zu registrieren, sondern auch ihren Typ, den Anfangswert, zu dem sie standardmäßig gesetzt wird, und ob sie Werte von anderen Eigenschaften erbt oder nicht. Es ist sehr ähnlich wie die Definition unserer eigenen Spezifikation für eine bestimmte Art von Daten!

Um auf den animierten Farbverlauf zurückzukommen, richten wir unsere benutzerdefinierte Eigenschaft ein.

@property --hue {
  syntax: "<number>";
  initial-value: 0;
  inherits: false;
}

Jetzt können wir --hue tatsächlich verwenden, um den gesamten Farbrad zwischen 0deg und 360deg zu durchlaufen.

body {
  animation: hue 5s linear infinite;
  background-color: hsl(var(--hue) 100% 50%);
}

@keyframes hue {
    0% { --hue; }
  100% { --hue: 360; }
}

Lesen Sie den Artikel „Interpolating Numeric CSS Variables“ für eine vollständige Erklärung, wie @property funktioniert, sowie eine Demo des animierten Farbverlaufs.

Mehr über @property erfahren

@supports

Diese Regel prüft, ob ein Browser ein Feature unterstützt und wendet dann die Stile für diese Elemente an, wenn die Bedingung erfüllt ist. Sie ist so etwas wie Modernizr, aber speziell für CSS-Eigenschaften.

/* Check one supported condition */
@supports selector(::thumb) {
  /* If ::thumb is supported, style away! */
}

/* Check multiple conditions */
@supports (color: oklch(50% .37 200)) and (color: color-mix(white, black)) {
  background-color: 
}

Der Operator not ist eine Möglichkeit zu prüfen, ob ein Browser ein Feature *nicht* unterstützt, um Fallback-Stile für diese Fälle festzulegen.

.element {
  color: oklch(50% .37 200);
}

/* If the oklch() color function is not support, set a fallback color */
@supports not (color: oklch(50% .37 200)) {
  .element {
    color: #0288D1;
  }
}

Hier ist die, ähm, Unterstützung für @supports

ChromeEdgeSafariFirefoxOperaIEAndroidiOS
28+12+9+22+12.1+Nein4.4+9+
Erfahren Sie mehr über @supports

@container

Diese At-Regel wurde im Februar 2023 mit der Einführung von Container Queries eingeführt, einer Funktion, mit der Sie ein Element als container registrieren und Stile auf andere Elemente anwenden können, wenn der Container eine bestimmte Bedingung erfüllt. Es ähnelt sehr @media Queries, aber @container betrachtet ein bestimmtes Element anstelle der Viewport-Größe.

.parent {
  container: article / inline-size;
}

.child {
  display: flex;
}

@container article (width > 800px) {
  .child {
    flex-direction: column;
  }
}
Erfahren Sie mehr über Container Queries

Zusammenfassend

Die at-rule ist der Schlüssel, um CSS verrückte und interessante Dinge tun zu lassen. Während die Beispiele hier einfach sind, können wir sehen, wie sie verwendet werden können, um Stile für sehr spezifische Bedingungen zu erstellen und so Benutzererlebnisse und Interaktionen zu schaffen, die zu einem Szenario passen.