Cascading Style Sheets — Inhalt und Darstellung trennen
Webentwicklung & Agentic Coding — Universität Graz, SS 2026
CSS steht für Cascading Style Sheets und ist die Sprache, mit der wir das Aussehen von HTML-Dokumenten definieren.
CSS wurde 1996 vom W3C eingeführt. Die aktuelle Version ist CSS3, die modular aufgebaut ist und ständig erweitert wird.
<p style="color: red;
font-size: 18px;">
Roter Text
</p>
Direkt am Element. Nur für Einzelfälle.
<head>
<style>
p { color: red; }
</style>
</head>
Für einzelne Seiten brauchbar.
<head>
<link rel="stylesheet" href="style.css">
</head>
Getrennte Datei — wiederverwendbar, wartbar, cachebar.
p {
color: navy;
}
/* Trifft ALLE <p>-Elemente */
.wichtig {
font-weight: bold;
color: red;
}
/* Trifft class="wichtig" */
#haupttitel {
font-size: 2rem;
border-bottom: 2px solid navy;
}
/* Trifft id="haupttitel" — nur einmal pro Seite! */
p | Klasse = .name | ID = #name
/* Nachfahren-Selektor: p innerhalb von .brief */
.brief p {
line-height: 1.8;
}
/* Direktes Kind: nur direkte <li> von .navigation */
.navigation > li {
display: inline-block;
}
/* Mehrere Selektoren gleichzeitig */
h1, h2, h3 {
font-family: Georgia, serif;
}
/* Klasse + Element kombiniert */
p.hervorhebung {
background: yellow;
}
/* Mehrere Klassen auf einem Element */
.karte.aktiv {
border-color: blue;
}
Was passiert, wenn mehrere CSS-Regeln auf dasselbe Element zutreffen? Der Browser entscheidet nach diesen Regeln:
p) < Klasse (.text) < ID (#titel) < Inline-Style < !important
p { color: black; } /* Spezifität: 0-0-1 */
.absatz { color: blue; } /* Spezifität: 0-1-0 */
#intro { color: green; } /* Spezifität: 1-0-0 */
/* Ein <p class="absatz" id="intro"> wird grün */
selektor {
eigenschaft: wert;
eigenschaft: wert;
}
/* Konkretes Beispiel: */
.brief-absatz {
font-family: Georgia, serif;
font-size: 1.1rem;
line-height: 1.8;
color: #333333;
margin-bottom: 1rem;
}
color, font-size)red, 16px);)/* Das ist ein Kommentar */CSS kennt mehrere Formate, um Farben zu definieren:
/* Benannte Farben (147 vordefiniert) */
color: red;
color: cornflowerblue;
/* Hexadezimal: #RRGGBB */
color: #ff0000; /* Rot */
color: #1a5276; /* Dunkelblau */
color: #333; /* Kurzform für #333333 */
/* RGB: rot, grün, blau (0–255) */
color: rgb(255, 0, 0);
color: rgba(26, 82, 118, 0.8); /* mit Transparenz */
/* HSL: Farbton (0-360), Sättigung, Helligkeit */
color: hsl(0, 100%, 50%); /* Rot */
color: hsla(200, 65%, 28%, 0.9); /* mit Transparenz */
body {
/* Schriftfamilie mit Fallbacks */
font-family: Georgia, 'Times New Roman', serif;
/* Schriftgröße */
font-size: 16px; /* Pixel (absolut) */
font-size: 1.1rem; /* Relativ zum Root-Element */
/* Schriftstärke */
font-weight: normal; /* oder 400 */
font-weight: bold; /* oder 700 */
/* Zeilenabstand */
line-height: 1.6; /* Ohne Einheit = Faktor */
/* Textausrichtung */
text-align: left; /* left, center, right, justify */
/* Weitere Eigenschaften */
font-style: italic;
text-decoration: underline;
text-transform: uppercase;
letter-spacing: 0.05em;
}
Jedes HTML-Element ist eine rechteckige Box mit vier Schichten:
+--------------------------------------------+
| MARGIN (Außenabstand) |
| +--------------------------------------+ |
| | BORDER (Rahmen) | |
| | +--------------------------------+ | |
| | | PADDING (Innenabstand) | | |
| | | +---------------------------+ | | |
| | | | | | | |
| | | | CONTENT | | | |
| | | | (Inhalt: Text, | | | |
| | | | Bilder etc.) | | | |
| | | | | | | |
| | | +---------------------------+ | | |
| | +--------------------------------+ | |
| +--------------------------------------+ |
+--------------------------------------------+
.karte {
/* Alle Seiten gleich */
padding: 20px;
/* Oben/Unten Links/Rechts */
padding: 10px 20px;
/* Oben Rechts Unten Links */
padding: 10px 20px 10px 20px;
/* Einzeln */
padding-top: 10px;
padding-left: 20px;
}
Padding erzeugt Platz zwischen Inhalt und Rahmen.
.karte {
/* Alle Seiten gleich */
margin: 20px;
/* Horizontale Zentrierung */
margin: 0 auto;
/* Einzeln */
margin-bottom: 2rem;
/* Negative Werte möglich */
margin-top: -10px;
}
Margin erzeugt Platz zwischen Elementen. Vertikale Margins kollabieren!
div, p, h1, section {
display: block;
}
/* Nimmt volle Breite ein.
Beginnt auf neuer Zeile.
Width/Height wirken. */
span, a, strong, em {
display: inline;
}
/* Nur so breit wie Inhalt.
Bleibt im Textfluss.
Width/Height ignoriert! */
.tag {
display: inline-block;
/* Bleibt im Textfluss wie inline,
aber Width/Height wirken wie bei block.
Ideal für Buttons, Tags, Badges. */
padding: 4px 12px;
border: 1px solid #ccc;
}
.brief {
/* Feste Breite */
width: 600px;
/* Maximale Breite (responsive!) */
max-width: 800px;
width: 100%; /* Nimmt verfügbare Breite, aber maximal 800px */
/* Mindestbreite */
min-width: 300px;
/* Höhe (meist vermeiden!) */
height: auto; /* Default: passt sich dem Inhalt an */
min-height: 400px; /* Mindesthöhe */
/* Box-Sizing für intuitive Berechnung */
box-sizing: border-box;
/* width = content + padding + border */
}
max-width statt width für
responsives Design. Vermeiden Sie feste height-Werte — lassen Sie den Inhalt
die Höhe bestimmen.
/* Einfache Hintergrundfarbe */
.brief {
background-color: #FFFFF8;
}
/* Hintergrundbild */
.briefkopf {
background-image: url('pergament.jpg');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
/* Farbverlauf (Gradient) */
.header {
background: linear-gradient(
to bottom,
#1a5276,
#2980b9
);
}
/* Kurzform: alles in einer Zeile */
.banner {
background: #f5f5f0 url('muster.png') repeat center;
}
/* Border (Rahmen) */
.karte {
border: 1px solid #ddd; /* Breite, Stil, Farbe */
border-bottom: 3px solid navy; /* Nur unten */
}
/* Border-Radius (abgerundete Ecken) */
.karte {
border-radius: 8px; /* Alle Ecken */
border-radius: 50%; /* Kreisform */
}
/* Box-Shadow (Schatten) */
.karte {
/* X-Versatz Y-Versatz Unschärfe Farbe */
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
/* Kombination: Elegante Karte */
.brief-karte {
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
padding: 2rem;
background: white;
}
Pseudo-Klassen sprechen Elemente in einem bestimmten Zustand an:
/* :hover — wenn die Maus über dem Element ist */
a:hover {
color: #0000ff;
text-decoration: none;
}
.karte:hover {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
transform: translateY(-2px);
transition: all 0.2s ease;
}
/* :first-child / :last-child */
li:first-child {
font-weight: bold;
}
li:last-child {
border-bottom: none;
}
/* :nth-child() — jedes zweite Element */
tr:nth-child(even) {
background: #f9f9f9;
}
/* :focus — wenn ein Formularfeld aktiv ist */
input:focus {
outline: 2px solid #1a5276;
border-color: #1a5276;
}
/* Variablen definieren (meist auf :root) */
:root {
--farbe-primaer: #1a5276;
--farbe-sekundaer: #2980b9;
--farbe-akzent: #c0392b;
--farbe-hintergrund: #fffff8;
--schrift-text: Georgia, serif;
--abstand: 1.5rem;
}
/* Variablen verwenden mit var() */
h1 {
color: var(--farbe-primaer);
font-family: var(--schrift-text);
}
.button {
background: var(--farbe-sekundaer);
padding: var(--abstand);
}
/* Fallback-Wert angeben */
.element {
color: var(--farbe-unbekannt, black);
}
Webseiten werden auf verschiedensten Geräten betrachtet: Smartphones, Tablets, Laptops, große Monitore.
Schritt 1: Der Viewport Meta-Tag im HTML-Head:
<meta name="viewport"
content="width=device-width, initial-scale=1.0">
/* Ohne diesen Tag ignorieren mobile Browser responsive CSS! */
Schritt 2: Media Queries — CSS-Regeln für bestimmte Bildschirmgrößen:
/* Standard: Styles für alle Größen */
.brief {
max-width: 800px;
padding: 2rem;
font-size: 1.1rem;
}
/* Ab 768px Breite oder kleiner: */
@media (max-width: 768px) {
.brief {
padding: 1rem;
font-size: 1rem;
}
}
/* Ab 480px Breite oder kleiner: */
@media (max-width: 480px) {
.brief {
padding: 0.5rem;
font-size: 0.9rem;
}
}
/* px — Pixel */
font-size: 16px;
width: 800px;
padding: 20px;
/* Probleme:
- Skaliert nicht
- Unflexibel bei
verschiedenen
Bildschirmgrößen */
/* rem — relativ zur Root-Fontsize */
font-size: 1.1rem; /* 17.6px */
/* em — relativ zum Elternelement */
padding: 1.5em;
/* % — Prozent des Elternelements */
width: 100%;
max-width: 50rem;
/* vw/vh — Viewport-Einheiten */
width: 100vw; /* Volle Breite */
height: 100vh; /* Volle Höhe */
rem für Schriftgrößen und Abstände,
% und max-width für Layouts,
vw/vh für Vollbild-Elemente.
<div class="brief">
<div class="absender">
Hugo Schuchardt
Elisabethstr. 6
Graz
</div>
<div class="datum">
12. Jänner 1882
</div>
<div class="anrede">
Verehrter Herr Kollege!
</div>
<p>Inhalt des Briefes...</p>
<div class="gruss">
Ihr ergebenster
Hugo Schuchardt
</div>
</div>
.brief {
max-width: 700px;
margin: 2rem auto;
padding: 3rem;
background: #fffff8;
border: 1px solid #ccc;
font-family: Georgia, serif;
line-height: 1.8;
box-shadow: 0 2px 8px
rgba(0,0,0,0.1);
}
.absender {
text-align: right;
font-style: italic;
color: #555;
}
.datum {
text-align: right;
margin: 1rem 0 2rem;
}
.anrede {
font-weight: bold;
margin-bottom: 1rem;
}
.gruss {
margin-top: 2rem;
font-style: italic;
}
Statt CSS auswendig zu lernen, beschreiben Sie das gewünschte Design:
/* Vom LLM generiert — können Sie diesen Code lesen? */
.brief {
max-width: 700px;
margin: 2rem auto;
padding: 3rem;
background-color: #fdf6e3;
border: 1px solid #c4a35a;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.12);
font-family: 'Palatino Linotype', Georgia, serif;
line-height: 1.75;
}
Die Browser-Entwicklerwerkzeuge sind unverzichtbar für CSS-Arbeit:
F12 oder Rechtsklick → Element untersuchen--name: wert; und var(--name)Einheit 03: Vertiefung HTML & CSS — Flexbox, Grid, Formulare, Tabellen
Assignment 1: Erstellen Sie eine persönliche Projektseite mit HTML und CSS. Nutzen Sie ein LLM als Coding-Assistent und dokumentieren Sie Ihre Prompts und Iterationsschritte.