32 KiB
marp, theme, paginate, backgroundColor, header, footer, title
| marp | theme | paginate | backgroundColor | header | footer | title |
|---|---|---|---|---|---|---|
| true | gaia | true | Grundlagen IT- und Internettechnik (223015c) | Michael Czechowski – HdM Stuttgart – WS 2025/26 | Termin 2: Netzwerke, Protokolle & CSS |
Grundlagen IT- und Internettechnik
223015c · Modul "Technik 1" · 1. Semester Digital- und Medienwirtschaft Hochschule der Medien Stuttgart
Wintersemester 2025/26
https://librete.ch/hdm/223015c/
Termin 2 – 10.01.2026
Netzwerke, Protokolle & CSS
Agenda
Teil 1: Die Reise eines Klicks
- Warum ist Netzwerk-Kommunikation kompliziert?
- Was passiert, wenn du eine URL aufrufst?
- DNS → TCP → HTTP → Response
Teil 2: CSS
- Grundlagen, Selektoren, Spezifität
- Box-Modell, Farben, Einheiten
Ressourcen zum Selbstlernen
- CODE CRISPIES: https://codecrispi.es/
- Online Code-Editor: https://codepen.io/pen/
- MDN (Mozilla Developer Network): https://developer.mozilla.org/de/
- Flexbox-Spiel: https://flexboxfroggy.com/
- Grid-Spiel: https://cssgridgarden.com/
Teil 1: Die Reise eines Klicks
Was passiert, wenn du www.hdm-stuttgart.de aufrufst?
Das Szenario
Du bist im WLAN der HdM angemeldest und gehst auf:
hdm-stuttgart.de
Zwischen Enter und der fertigen Seite: ~200 Millisekunden.
In dieser Zeit passieren hunderte Operationen.
Bevor wir sie durchgehen: Warum ist das überhaupt so kompliziert?
Das Grundproblem
Warum brauchen wir Schichten, Adressen, Ports?
Was zwischen dir und dem Server liegt
Du willst eine Webseite. Klingt einfach.
Aber dazwischen liegen:
- Deine WLAN-Karte
- Der Router im Flur
- Das Netzwerk der HdM
- Das Internet (dutzende Router)
- Der Webserver in Vaihingen
Jede Station spricht eine andere "Sprache":
- Dein Browser spricht HTTP ("Gib mir /index.html")
- Das Kabel versteht nur Strom an/aus
Die Lösung: Aufgabenteilung
Statt dass jedes Programm alles können muss, teilen wir die Arbeit auf:
| Wer | Kümmert sich um |
|---|---|
| HTTP | "Was will ich?" (Webseite, Bild, Video) |
| TCP | "Kommt alles an? In der richtigen Reihenfolge?" |
| IP | "Wo muss es hin?" (welcher Rechner im Internet) |
| Ethernet | "Wie kommt es zum nächsten Gerät?" |
| Physik | "Strom oder Licht durch das Kabel" |
Jeder macht seinen Job. Keiner muss wissen, wie die anderen arbeiten.
Warum ist das clever?
Ohne Schichten: Dein Browser müsste wissen, wie man Ethernet-Frames baut, wie WLAN-Frequenzen funktionieren, wie Router Pakete weiterleiten...
Mit Schichten: Dein Browser sagt nur: "Ich will diese Seite." Alles andere übernehmen die Schichten darunter.
Das Prinzip heißt Abstraktion: Jede Schicht versteckt ihre Komplexität vor den anderen.
Warum brauchen wir IP-Adressen?
Das Internet ist kein einzelnes Netzwerk
Das Internet besteht aus tausenden separaten Netzwerken:
- Netzwerk der HdM
- Netzwerk der Telekom
- Netzwerk von Google
- Netzwerk deines Heimrouters
- ...
Ein Paket muss von Netzwerk zu Netzwerk weitergereicht werden.
Router entscheiden bei jedem Hop: "In welches Netzwerk als nächstes?"
IP-Adressen = Globale Adressen
141.62.xxx.xxx ← HdM-Netzwerk
212.132.79.37 ← Ziel-Server
Die IP-Adresse sagt dem Router:
- In welchem Netzwerk ist der Rechner?
- Welcher Rechner in diesem Netzwerk?
"141.62... ist nicht bei mir. Ich schicke das Paket Richtung eduroam."
Die IP-Adresse bleibt auf dem gesamten Weg gleich. Sie ist die Empfängeradresse auf dem Brief.
Warum reicht die MAC-Adresse nicht?
Jede Netzwerkkarte hat eine MAC-Adresse (z.B. aa:bb:cc:dd:ee:ff).
Problem: MAC funktioniert nur lokal.
- Dein Laptop kennt die MAC deines Routers
- Dein Router kennt die MAC des nächsten Routers
- Aber niemand kennt die MAC des Webservers in Vaihingen
MAC = "Wer ist mein direkter Nachbar?" IP = "Wo ist das Ziel im gesamten Internet?"
Deshalb brauchen wir beides.
Warum brauchen wir Ports?
Ein Rechner, viele Programme
Dein Laptop hat eine IP-Adresse.
Aber gleichzeitig laufen:
- Browser
- Mail-Programm
- Spotify
- Discord
- System-Updates
Ein Paket kommt an. Für welches Programm ist es?
Ports = Türnummern
IP-Adresse = Hausnummer → "Friedrichstraße 10"
Port = Wohnungstür → "3. Stock links"
Jedes Programm "lauscht" auf einem Port:
| Port | Dienst |
|---|---|
| 80 | HTTP (Webseiten) |
| 443 | HTTPS (Webseiten, verschlüsselt) |
| 25 | SMTP (E-Mail senden) |
| 22 | SSH (Terminal) |
Beide Seiten haben Ports
Dein Laptop: 141.62.xxx.xxx:52431
└─────── Dein Browser lauscht hier
Server: 212.132.79.37:443
└─────── Webserver lauscht hier
52431 ist ein zufälliger Port, den dein System für diese Verbindung vergeben hat.
Die Antwort des Servers geht an 141.62.xxx.xxx:52431 – und landet bei deinem Browser, nicht bei Spotify.
Zusammenfassung: Die Bausteine
Was wir jetzt wissen
| Konzept | Löst welches Problem? |
|---|---|
| Schichten | Komplexität aufteilen, Abstraktion |
| IP-Adresse | Ziel im globalen Internet finden |
| MAC-Adresse | Nächsten Nachbarn im lokalen Netz finden |
| Port | Richtiges Programm auf dem Rechner finden |
Mit diesen Bausteinen können wir jetzt die Reise eines Klicks verfolgen.
Die Reise beginnt
Schritt für Schritt
Die Zeitlinie
[0 ms] DNS-Anfrage: "Welche IP hat www.hdm-stuttgart.de?"
↓
[~20 ms] DNS-Antwort: "212.132.79.37"
↓
[~25 ms] TCP-Handshake: Verbindung aufbauen
↓
[~50 ms] HTTP-Request: "GET /index.html"
↓
[~150 ms] HTTP-Response: Der HTML-Code kommt zurück
↓
[~200 ms] Browser rendert die Seite
Jeder dieser Schritte durchläuft alle Schichten – runter und wieder rauf.
Schritt 1: DNS
"Wo wohnt hdm-stuttgart.de?"
Das Problem
Dein Browser kennt nur den Namen: www.hdm-stuttgart.de
Das Internet kennt nur Zahlen: 212.132.79.37
Jemand muss übersetzen.
DNS: Das Telefonbuch des Internets
Domain Name System
Dein Laptop fragt sich durch eine Hierarchie:
- Browser-Cache: "War ich da kürzlich?" → Nein
- Betriebssystem-Cache: "Kennt Windows/Mac die IP?" → Nein
- Router / ISP: "Frag den DNS-Server deines Providers"
Wenn auch der Provider es nicht weiß, beginnt die rekursive Suche.
Die DNS-Hierarchie
. (Root)
/|\
/ | \
.de .com .org
/
hdm-stuttgart
|
www
Jede Ebene kennt nur die nächste Ebene darunter.
Der DNS-Lookup
Dein Laptop → Resolver: "Wo ist www.hdm-stuttgart.de?"
Resolver → Root (.): "Wer verwaltet .de?"
← "Frag 194.0.0.53"
Resolver → .de-Server: "Wer verwaltet hdm-stuttgart.de?"
← "Frag den Nameserver der HdM"
Resolver → HdM-NS: "Welche IP hat www?"
← "212.132.79.37"
Resolver → Dein Laptop: "Die IP ist 212.132.79.37"
DNS ist selbst ein Netzwerk-Request
Die DNS-Anfrage ist nicht magisch. Sie ist selbst ein Paket, das durch alle Schichten muss:
| Eigenschaft | Wert |
|---|---|
| Protokoll | UDP |
| Port | 53 |
| Inhalt | "A-Record für www.hdm-stuttgart.de?" |
Das DNS-Paket macht die gleiche Reise wie später der HTTP-Request – nur zu einem anderen Ziel.
Nach dem DNS-Lookup
Ergebnis: Dein Browser weiß jetzt:
www.hdm-stuttgart.de = 212.132.79.37
Diese Information wird gecached.
Nächster Schritt: Verbindung zum Server aufbauen.
Schritt 2: TCP-Handshake
"Hallo Server, bist du da?"
Warum ein Handshake?
HTTP läuft über TCP (Transmission Control Protocol).
TCP ist verbindungsorientiert: Bevor Daten fließen, müssen sich beide Seiten einig sein, dass sie miteinander reden wollen.
Analogie: Du rufst jemanden an. Das Telefon klingelt. Die Person nimmt ab. Erst dann redest du.
Der 3-Way-Handshake
Dein Laptop HdM-Server
| |
|-------- SYN (Seq=1000) --------------->|
| "Ich will reden" |
| |
|<--- SYN-ACK (Seq=5000, Ack=1001) ------|
| "OK, ich auch" |
| |
|-------- ACK (Ack=5001) --------------->|
| "Gut, dann los" |
| |
| [ Verbindung steht ] |
SYN = Synchronize · ACK = Acknowledge
Warum die Sequenznummern?
Problem: Pakete können im Internet:
- Verloren gehen
- Doppelt ankommen
- In falscher Reihenfolge ankommen
Lösung: Jedes Byte wird nummeriert.
Der Empfänger weiß genau, welches Byte als nächstes kommen muss – und kann fehlende Pakete erneut anfordern.
Nach dem Handshake
Status: Die TCP-Verbindung steht.
Dein Laptop ←————————————————→ 212.132.79.37:443
(Port 52431) (Port 443)
Jetzt erst kann der eigentliche HTTP-Request gesendet werden.
Schritt 3: Der HTTP-Request
"Gib mir die Startseite"
Was dein Browser sendet
GET / HTTP/1.1
Host: www.hdm-stuttgart.de
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html
Accept-Language: de-DE
Connection: keep-alive
Das sind ~200 Bytes Text.
Aber diese 200 Bytes müssen durch das halbe Internet.
Wie?
Die Verpackungsstraße
Encapsulation: Schicht für Schicht
Jede Schicht verpackt
HTTP-Request: "GET / HTTP/1.1..."
↓
TCP packt ein: [ Ports + Seq-Nr ] + HTTP-Request
= Segment
↓
IP packt ein: [ IP-Adressen ] + Segment
= Paket
↓
Ethernet packt: [ MAC-Adressen ] + Paket + [ Prüfsumme ]
= Frame
↓
Physik: 01001000 01010100 01010100 01010000 ...
= Bits auf dem Kabel
Layer 4: Transport (TCP)
Der HTTP-Request wird zum Segment.
┌─────────────────────────────────────────────────┐
│ TCP-Header │
│ ┌─────────────┬─────────────┬─────────────────┐ │
│ │ Source Port │ Dest Port │ Sequence Number │ │
│ │ 52431 │ 443 │ 1001 │ │
│ └─────────────┴─────────────┴─────────────────┘ │
├─────────────────────────────────────────────────┤
│ Payload: "GET / HTTP/1.1..." │
└─────────────────────────────────────────────────┘
Neu hinzugekommen: Ports (wer sendet? wer empfängt?) und Sequenznummer
Layer 3: Network (IP)
Das Segment wird zum Paket.
┌─────────────────────────────────────────────────┐
│ IP-Header │
│ ┌─────────────────┬─────────────────┐ │
│ │ Source IP │ Destination IP │ │
│ │ 141.62.xxx.xxx │ 212.132.79.37 │ │
│ └─────────────────┴─────────────────┘ │
├─────────────────────────────────────────────────┤
│ TCP-Segment (von oben) │
└─────────────────────────────────────────────────┘
Neu: IP-Adressen – woher kommt das Paket, wohin soll es?
Layer 2: Data Link (Ethernet)
Das Paket wird zum Frame.
┌─────────────────────────────────────────────────┐
│ Ethernet-Header │
│ ┌─────────────────┬─────────────────┐ │
│ │ Source MAC │ Destination MAC │ │
│ │ aa:bb:cc:dd:ee │ 11:22:33:44:55 │ │
│ └─────────────────┴─────────────────┘ │
├─────────────────────────────────────────────────┤
│ IP-Paket (von oben) │
├─────────────────────────────────────────────────┤
│ FCS (Prüfsumme) │
└─────────────────────────────────────────────────┘
Neu: MAC-Adressen – aber Achtung: Das ist die MAC des Routers, nicht des Servers!
Layer 1: Physical
Der Frame wird zu Bits – und die Bits zu physikalischen Signalen.
| Medium | Signal |
|---|---|
| Kupferkabel | Spannung: High/Low |
| Glasfaser | Licht: An/Aus |
| WLAN | Funkwellen |
01001000 01010100 01010100 01010000 ...
Ab hier übernimmt die Physik.
MAC vs. IP – nochmal genau
| IP-Adresse | MAC-Adresse | |
|---|---|---|
| Frage | Wer ist das Endziel? | Wer ist der nächste Hop? |
| Reichweite | Global (ganzes Internet) | Lokal (bis zum nächsten Router) |
| Ändert sich? | Nein, bleibt gleich | Ja, bei jedem Hop |
| Analogie | Empfänger auf dem Brief | "Nächstes Postamt: XY" |
Die MAC-Adresse im ersten Frame ist die MAC des Routers – nicht des Servers!
Woher kennt dein Laptop die MAC des Routers?
ARP – Address Resolution Protocol
Dein Laptop (Broadcast an alle):
"Wer hat die IP 192.168.1.1? Sag mir deine MAC!"
Router:
"Das bin ich! Meine MAC ist 11:22:33:44:55:66"
Diese Information wird gecached.
Die Reise durch das Netz
Hop für Hop
Der erste Hop: Dein Router
Dein Laptop → [Frame] → Router
Der Router empfängt den Frame:
- Layer 1: Signale → Bits
- Layer 2: Prüft Frame. "MAC stimmt, FCS okay" → Auspacken
- Layer 3: Liest IP-Header. "212.132.79.37 – nicht mein Netz"
Routing-Entscheidung: "Ich schicke es Richtung eduroam."
Der Router verpackt NEU
Der Router erstellt einen neuen Frame für den nächsten Hop:
┌─────────────────────────────────────────────────┐
│ Ethernet-Header (NEU!) │
│ ┌─────────────────┬─────────────────┐ │
│ │ Source MAC │ Destination MAC │ │
│ │ Router-MAC │ Nächster-Router │ │
│ └─────────────────┴─────────────────┘ │
├─────────────────────────────────────────────────┤
│ IP-Paket (UNVERÄNDERT) │
│ Source: 141.62.xxx.xxx │
│ Dest: 212.132.79.37 │
└─────────────────────────────────────────────────┘
Die IP bleibt gleich. Die MAC ändert sich.
Mehrere Hops
Dein Laptop
↓ [Frame mit MAC des HdM-Routers]
Router (HdM-Netz)
↓ [Frame mit MAC des eduroam-Routers]
Router (BelWü)
↓ [Frame mit MAC des nächsten Routers]
...weitere Router...
↓ [Frame mit MAC des Ziel-Servers]
Webserver der HdM
Bei jedem Hop: Auspacken bis Layer 3, Routing-Entscheidung, neu verpacken.
Die Ankunft
Decapsulation am Server
Der Server empfängt
Am Webserver passiert alles rückwärts (Decapsulation):
Bits empfangen (Layer 1)
↓
Frame prüfen: MAC korrekt? FCS okay? → Auspacken (Layer 2)
↓
IP-Paket lesen: Ziel-IP = meine IP? Ja! → Auspacken (Layer 3)
↓
TCP-Segment lesen: Port 443, Seq-Nr passt → Auspacken (Layer 4)
↓
HTTP-Request lesen: "GET / HTTP/1.1" (Layer 7)
Der Webserver versteht: "Jemand will die Startseite."
Die Antwort
Der gleiche Weg zurück
Der Server antwortet
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 45231
<!DOCTYPE html>
<html lang="de">
<head>
<title>HdM Stuttgart</title>
...
Diese ~45 KB HTML müssen jetzt zu dir.
Encapsulation beim Server
Der Server macht dasselbe wie du vorher – nur in die andere Richtung:
HTTP-Response: "HTTP/1.1 200 OK..."
↓
TCP packt ein: [ Ports + Seq-Nr ] + Response
Dest-Port: 52431 (dein Browser!)
↓
IP packt ein: [ IP-Adressen ]
Dest-IP: 141.62.xxx.xxx (dein Laptop!)
↓
Ethernet packt: [ MAC-Adressen ]
Dest-MAC: Router des Server-Netzes
↓
Bits auf dem Kabel
Die Antwort reist zurück
Server
↓
Router (Ziel-Netz)
↓
...weitere Router...
↓
Router (HdM-Netz)
↓
Dein Laptop
Bei jedem Hop: Auspacken bis Layer 3, Routing-Entscheidung, neu verpacken.
Bis die Antwort bei dir ankommt – und dein Browser sie auspackt.
Decapsulation bei dir
Bits empfangen
↓
Frame: MAC = meine MAC? → Auspacken
↓
IP-Paket: Ziel-IP = meine IP? → Auspacken
↓
TCP-Segment: Port 52431 = mein Browser → Auspacken
↓
HTTP-Response: "HTTP/1.1 200 OK..."
↓
Browser rendert die Seite
Zusammenfassung
Das TCP/IP-Modell
Die Schichten (TCP/IP)
| Schicht | Name | Dateneinheit | Adressierung |
|---|---|---|---|
| 4 | Anwendung | Daten | – |
| 3 | Transport | Segment | Ports |
| 2 | Internet | Paket | IP-Adressen |
| 1 | Netzzugang | Frame | MAC-Adressen |
4 Schichten. Das reicht, um das Internet zu verstehen.
OSI vs. TCP/IP
OSI (Theorie) TCP/IP (Praxis)
┌─────────────────┐ ┌─────────────────┐
│ 7. Anwendung │ │ │
├─────────────────┤ │ Anwendung │
│ 6. Darstellung │ │ │
├─────────────────┤ │ │
│ 5. Sitzung │ │ │
├─────────────────┤ ├─────────────────┤
│ 4. Transport │ │ Transport │
├─────────────────┤ ├─────────────────┤
│ 3. Vermittlung │ │ Internet │
├─────────────────┤ ├─────────────────┤
│ 2. Sicherung │ │ │
├─────────────────┤ │ Netzzugang │
│ 1. Bitübertrag │ │ │
└─────────────────┘ └─────────────────┘
OSI ist ein Referenzmodell. TCP/IP ist die Realität.
Was ihr wissen solltet
Den Ablauf:
- DNS-Lookup (UDP:53) → IP-Adresse
- TCP-Handshake (SYN → SYN-ACK → ACK)
- HTTP-Request
- HTTP-Response
Die Konzepte:
- IP bleibt gleich, MAC ändert sich pro Hop
- Ports identifizieren Programme
- Encapsulation/Decapsulation
Die Dateneinheiten (PDUs)
| Schicht | Dateneinheit | Was kommt hinzu? |
|---|---|---|
| Anwendung | Daten | HTTP-Header |
| Transport | Segment | Ports, Seq-Nr |
| Internet | Paket | IP-Adressen |
| Netzzugang | Frame | MAC, Prüfsumme |
Encapsulation: Jede Schicht verpackt die Daten der Schicht darüber. Decapsulation: Beim Empfang wird Schicht für Schicht ausgepackt.
Exkurs: MTU & Fragmentierung
Die MTU (Maximum Transmission Unit)
Ein Ethernet-Frame kann maximal 1500 Bytes Nutzdaten transportieren.
┌───────────┬──────────────────────────────────────────┬──────────┐
│ Header │ Payload (max. 1500 Bytes) │ Trailer │
│ 14 Bytes │ │ 4 Bytes │
└───────────┴──────────────────────────────────────────┴──────────┘
Problem: Ein Foto hat 3.000.000 Bytes. Lösung: TCP zerschneidet die Daten in ~2000 Segmente.
TCP sorgt für Ordnung
Jedes Segment hat eine Sequenznummer.
Segment 1: Bytes 0-1459 Seq=0
Segment 2: Bytes 1460-2919 Seq=1460
Segment 3: Bytes 2920-4379 Seq=2920
...
Der Empfänger setzt die Segmente zusammen – auch wenn sie in falscher Reihenfolge ankommen.
Exkurs: TCP vs. UDP
Zwei Transport-Protokolle
| TCP | UDP | |
|---|---|---|
| Verbindung | Ja (Handshake) | Nein |
| Reihenfolge garantiert | Ja | Nein |
| Fehlende Pakete | Werden nachgefordert | Gehen verloren |
| Geschwindigkeit | Langsamer | Schneller |
Wann was?
TCP:
- Web (HTTP/HTTPS)
- Dateitransfer
- SSH
→ Wenn jedes Byte ankommen muss
UDP:
- DNS
- Video-Streaming
- Online-Gaming
- Video-Calls
→ Wenn Geschwindigkeit wichtiger ist als Vollständigkeit
Warum UDP bei Video-Calls?
Szenario: Ein Paket geht verloren.
TCP: Wartet, fordert neu an, wartet... → Video friert ein
UDP: Ignoriert es, zeigt nächstes Frame → Kurzes Artefakt
Bei Echtzeit ist ein verlorenes Frame weniger schlimm als Verzögerung.
HTTP-Response & Status-Codes
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
Status-Codes:
- 2xx Erfolg (200 OK)
- 3xx Umleitung (301 Moved)
- 4xx Client-Fehler (404 Not Found)
- 5xx Server-Fehler (500 Internal Error)
HTTP-Methoden
| Methode | Zweck | Beispiel |
|---|---|---|
| GET | Daten abrufen | Seite laden |
| POST | Daten senden | Formular absenden |
| PUT | Daten ersetzen | Profil aktualisieren |
| DELETE | Daten löschen | Account löschen |
Werkzeuge zum Selbst-Erkunden
Im Browser (F12 → Network-Tab):
- Jeder Request sichtbar
- Timing, Headers, Response
Im Terminal:
ping hdm-stuttgart.de
traceroute hdm-stuttgart.de
nslookup hdm-stuttgart.de
curl -I hdm-stuttgart.de
Teil 2: CSS
Webseiten gestalten
Was ist CSS?
Cascading Style Sheets
- Trennt Inhalt (HTML) von Darstellung (CSS)
- "Cascading" = Regeln können überschrieben werden
- Eine CSS-Datei für viele HTML-Seiten
p {
color: blue;
font-size: 16px;
}
CSS einbinden
Option 1: Externe Datei (empfohlen)
<link rel="stylesheet" href="style.css">
Option 2: Style-Tag
<style>p { color: blue; }</style>
Option 3: Inline (vermeiden)
<p style="color: blue;">...</p>
CSS-Anatomie
selector {
property: value;
}
Beispiel:
h1 {
color: #333333;
font-size: 2rem;
margin-bottom: 1rem;
}
Selektoren: Element
/* Alle <p>-Elemente */
p {
color: gray;
}
/* Mehrere Elemente */
h1, h2, h3 {
font-family: sans-serif;
}
Selektoren: Klasse
<p class="wichtig">Dieser Text ist wichtig.</p>
<p>Dieser nicht.</p>
.wichtig {
color: red;
font-weight: bold;
}
Punkt vor dem Namen = Klasse
Selektoren: ID
<nav id="hauptnavigation">...</nav>
#hauptnavigation {
background: #333;
padding: 1rem;
}
Raute vor dem Namen = ID
⚠️ IDs sollten einmalig pro Seite sein.
Selektoren: Kombinationen
/* Nachfahre (beliebig tief) */
article p { line-height: 1.6; }
/* Direktes Kind */
nav > a { text-decoration: none; }
/* Nächstes Geschwister */
h2 + p { font-size: 1.2rem; }
/* Element mit Klasse */
p.wichtig { color: red; }
Spezifität: Welche Regel gewinnt?
| Selektor | Spezifität |
|---|---|
Element (p) |
0,0,0,1 |
Klasse (.wichtig) |
0,0,1,0 |
ID (#header) |
0,1,0,0 |
Inline (style="...") |
1,0,0,0 |
p { color: blue; } /* 0,0,0,1 */
.text { color: green; } /* 0,0,1,0 → gewinnt */
Box-Modell
┌─────────────────────────────────────┐
│ margin │
│ ┌─────────────────────────────┐ │
│ │ border │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ padding │ │ │
│ │ │ ┌─────────────┐ │ │ │
│ │ │ │ content │ │ │ │
│ │ │ └─────────────┘ │ │ │
│ │ └─────────────────────┘ │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
Box-Modell: CSS
.box {
width: 200px;
height: 100px;
padding: 20px;
border: 2px solid black;
margin: 10px;
/* Wichtig: */
box-sizing: border-box;
}
box-sizing: border-box → width inkl. padding + border
Farben
/* Keyword */
color: red;
/* Hex */
color: #FF0000;
color: #F00;
/* RGB/RGBA */
color: rgb(255, 0, 0);
color: rgba(255, 0, 0, 0.5);
/* HSL */
color: hsl(0, 100%, 50%);
Einheiten
| Einheit | Bedeutung |
|---|---|
px |
Pixel (absolut) |
% |
Prozent vom Parent |
em |
Relativ zur Schriftgröße |
rem |
Relativ zur Root-Schriftgröße |
vw/vh |
Viewport-Breite/-Höhe |
Empfehlung: rem für Schrift, % oder vw/vh für Layout
Pseudo-Klassen
a:hover { color: red; }
a:visited { color: purple; }
input:focus { border-color: blue; }
li:first-child { font-weight: bold; }
li:nth-child(odd) { background: #eee; }
Pseudo-Elemente
.required::before {
content: "* ";
color: red;
}
p::first-letter { font-size: 2em; }
: = Pseudo-Klasse · :: = Pseudo-Element
Responsive Design
/* Mobile First */
.container { padding: 1rem; }
/* Ab 768px (Tablet) */
@media (min-width: 768px) {
.container {
padding: 2rem;
max-width: 720px;
}
}
Fragen & Diskussion
Nächster Termin: 24.01.2026 – JavaScript
Kontakt: lb-czechowski@hdm-stuttgart.de
Lizenz
Diese Präsentation ist lizenziert unter Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
Basiert auf Material von:
- Markus Thamm / Wolfgang Gruel (HdM Stuttgart)
- Michael Czechowski
Vollständige Lizenz: https://creativecommons.org/licenses/by-sa/4.0/

