Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m291:learningunits:lu02:theorie:a_css-intro [2026/02/01 23:37] – gkoch | de:modul:m291:learningunits:lu02:theorie:a_css-intro [2026/02/02 01:29] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 4: | Zeile 4: | ||
| **Ziel von LU02:** Sie bringen Ihr Projekt „Landingpage Alarado“ optisch näher ans Figma-Design, | **Ziel von LU02:** Sie bringen Ihr Projekt „Landingpage Alarado“ optisch näher ans Figma-Design, | ||
| \\ | \\ | ||
| - | 1) die Schrift (Google Font) einbinden, | + | - die Schrift (Google Font) einbinden, |
| + | - Designwerte als CSS-Variablen definieren und | ||
| + | - mit Media Queries das Responsive-Layout für Mobile | ||
| </ | </ | ||
| ==== Lernziele ==== | ==== Lernziele ==== | ||
| - | * Sie können eine Google Font per ''< | + | * Sie können eine Google Font per ''< |
| - | * Sie verstehen | + | * Sie verstehen '' |
| - | * Sie können CSS-Variablen in '': | + | * Sie können CSS-Variablen in '': |
| - | * Sie verstehen die CSS-**Cascade** (Reihenfolge/ | + | * Sie verstehen die CSS-**Kaskade** (Vererbung, Spezifität, |
| * Sie können Media Queries für Responsive Design nutzen und mit DevTools testen. | * Sie können Media Queries für Responsive Design nutzen und mit DevTools testen. | ||
| ---- | ---- | ||
| - | ===== A) Fonts im Web ===== | + | ===== 1) Fonts im Web ===== |
| + | {{: | ||
| - | ==== A1) Schnellstart: | + | ==== Google Fonts via CDN ==== |
| - | In vielen Projekten werden Fonts schnell über ein CDN eingebunden (z.B. Google Fonts) | + | In vielen Projekten werden Fonts schnell über ein CDN eingebunden (z.B. Google Fonts). Das ist praktisch für Schulprojekte |
| - | **Typischer Aufbau im ''< | + | <WRAP center round box 80%> |
| + | **Typischer Aufbau im ''< | ||
| <code html> | <code html> | ||
| <link rel=" | <link rel=" | ||
| <link rel=" | <link rel=" | ||
| - | <link href=" | + | <link |
| + | | ||
| + | | ||
| + | /> | ||
| </ | </ | ||
| + | </ | ||
| + | <WRAP center round box 80%> | ||
| **Dann im CSS verwenden: | **Dann im CSS verwenden: | ||
| <code css> | <code css> | ||
| Zeile 34: | Zeile 43: | ||
| } | } | ||
| </ | </ | ||
| + | </ | ||
| - | <WRAP center round box 80%> | + | <WRAP center round tip 70%> |
| - | **Hinweis zur Praxis:** In professionellen Projekten werden Fonts häufig | + | **Praxis-Hinweis:** In professionellen Projekten werden Fonts oft **lokal** gespeichert (Datenschutz, Performance, Offline-Fähigkeit). Für dieses Modul genügt zu Beginn das Einbinden via ''< |
| </ | </ | ||
| - | ==== A2) Besser in der Praxis: | + | ==== Fonts lokal speichern ==== |
| - | Mit '' | + | Wenn Fonts lokal im Projekt liegen, werden sie mit '' |
| + | <WRAP center round box 80%> | ||
| <code css> | <code css> | ||
| @font-face { | @font-face { | ||
| Zeile 50: | Zeile 61: | ||
| } | } | ||
| </ | </ | ||
| + | </ | ||
| - | ==== A3) Wichtige Font-Eigenschaften | + | ((Für lokale Fonts brauchen Sie die Font-Dateien im Projekt, idealerweise '' |
| - | * '' | + | |
| - | * '' | + | ==== Wichtige Font-Eigenschaften ==== |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ---- | ||
| - | ==== A4) Einheiten bei Fonts: px vs em vs rem ==== | + | ==== Einheiten bei Schriftgroessen |
| - | * **px** = absolute Einheit (kann bei Accessibility/ | + | |
| - | * **em** = relativ zur Schriftgrösse des *Eltern-Elements* | + | |
| - | * **rem** = relativ zur Schriftgrösse des ''< | + | |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Best Practice (für dieses Modul):** | + | **Wichtig:** Bei Schriftgroessen geht es nicht nur um „schön“, |
| \\ | \\ | ||
| - | - Nutzen Sie für Schriftgrössen bevorzugt **rem**. | + | Viele Menschen nutzen Browser-Zoom oder haben eine grössere Standard-Schrift eingestellt. |
| - | \\ | + | |
| - | - Nutzen Sie für '' | + | |
| </ | </ | ||
| + | |||
| + | === px === | ||
| + | * '' | ||
| + | * Vorteil: direkt und einfach. | ||
| + | * Nachteil: In grossen Projekten wird es schnell unübersichtlich, | ||
| + | |||
| + | ((Browser-Zoom vergrössert zwar alles. Trotzdem ist '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | h1 { font-size: 64px; } | ||
| + | p { font-size: 18px; } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === em === | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | ((Historisch stammt „em“ aus der Typografie. In CSS ist '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | body { font-size: 16px; } /* Basis */ | ||
| + | h1 { font-size: 2em; } /* 2 × 16px = 32px */ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Die typische EM-Falle** | ||
| + | Wenn mehrere Eltern-Elemente die Schrift bereits verändern, multipliziert sich der Effekt: | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | body { font-size: 1.2em; } /* 1.2 × 16px = 19.2px */ | ||
| + | div { font-size: 1.3em; } /* 1.3 × 19.2px = 24.96px */ | ||
| + | h1 { font-size: 2em; } /* 2 × 24.96px = 49.92px */ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ((Darum ist '' | ||
| + | |||
| + | **Wann ist em sinnvoll** | ||
| + | * Für Proportionen innerhalb einer Komponente: Padding, Icon-Grössen, | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | button { | ||
| + | font-size: 1rem; | ||
| + | padding: 0.8em 1.2em; /* wächst mit der Button-Schrift */ | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === rem === | ||
| + | * '' | ||
| + | * Vorteil: bleibt konsistent, egal wie tief ein Element verschachtelt ist. | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | html { font-size: 16px; } | ||
| + | h1 { font-size: 4rem; } /* 64px */ | ||
| + | p { font-size: 1.125rem; } /* 18px */ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ((Mit '' | ||
| + | |||
| + | ==== Empfehlung für dieses Modul ==== | ||
| + | * Für Schriftgroessen überwiegend **rem** verwenden. | ||
| + | * **em** gezielt innerhalb von Komponenten einsetzen. | ||
| + | * **px** sparsam einsetzen, z.B. für 1px Linien oder sehr feine Details. | ||
| + | |||
| + | ==== line-height ==== | ||
| + | Setzen Sie '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | body { line-height: | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ((Einheitenlose '' | ||
| ---- | ---- | ||
| - | ===== B) CSS-Variablen | + | ===== 2) CSS-Variablen ===== |
| - | ==== B1) Was sind CSS-Variablen? ==== | + | ==== Was sind CSS-Variablen ==== |
| - | CSS-Variablen | + | CSS-Variablen sind benannte Werte, die Sie einmal zentral definieren und dann überall |
| - | **Beispiel: | + | <WRAP center round box 80%> |
| <code css> | <code css> | ||
| :root { | :root { | ||
| --primary: #263fa9; | --primary: #263fa9; | ||
| --text: #223344; | --text: #223344; | ||
| + | --h1-size: 4rem; | ||
| } | } | ||
| - | body { | + | |
| - | | + | body { color: var(--text); |
| - | } | + | button { background: var(--primary); |
| - | button { | + | h1 { font-size: var(--h1-size); |
| - | | + | |
| - | } | + | |
| </ | </ | ||
| + | </ | ||
| - | ==== B2) Warum ist das nützlich? | + | ==== Warum lohnt sich das ==== |
| - | * **Wiederverwendbarkeit**: Farben/Grössen müssen nicht überall kopiert werden. : | + | * **Wiederverwendbarkeit:** weniger Copy/Paste, weniger Fehler |
| - | * **Wartbarkeit**: Eine Änderung in '': | + | * **Wartbarkeit:** 1 Änderung in '': |
| - | * **Semantik**: '' | + | * **Lesbarkeit:** Namen sind verständlicher als zufällige Hex-Zahlen |
| - | * **Reagiert auf Media Queries und DOM** (im Gegensatz zu reinen Preprocessor-Variablen). : | + | |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Vergleich zu Print-Design | + | **Vergleich zu Print-Design** |
| \\ | \\ | ||
| - | CSS-Variablen | + | CSS-Variablen |
| </ | </ | ||
| ---- | ---- | ||
| - | ===== C) CSS Cascade | + | ===== 3) CSS Cascade ===== |
| - | Die Kaskade bestimmt, **welche CSS-Regel am Ende gewinnt**. | + | {{: |
| + | \\ | ||
| + | //Viele CSS-Regeln funktionieren nach dem Prinzip " | ||
| - | ==== C1) Grundprinzip ==== | + | <WRAP center round box 80%> |
| - | * Viele Eigenschaften werden | + | **Was ist die Kaskade** |
| - | * Andere werden **nicht vererbt** (z.B. viele '' | + | \\ |
| - | * Wenn Sie eine Eigenschaft «weiter innen» oder «später» neu setzen, **überschreiben** Sie nur diese Eigenschaft – der Rest wird weiter vererbt. : | + | Die CSS-Kaskade entscheidet, welche CSS-Regel am Ende wirklich angewendet wird, wenn mehrere Regeln dasselbe Element betreffen. |
| + | </ | ||
| - | **Mini-Beispiel:** | + | ==== Vererbung ==== |
| + | Einige Eigenschaften werden von Eltern an Kinder | ||
| + | |||
| + | * Häufig vererbt: '' | ||
| + | * Meist nicht vererbt: '' | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| <code css> | <code css> | ||
| - | body { color: #223344; } | + | body { |
| - | p { color: # | + | font-family: " |
| - | p span { color: #263fa9; } /* überschreibt nur die Farbe im span */ | + | color: #223344; |
| + | | ||
| + | } | ||
| </ | </ | ||
| + | </ | ||
| - | ==== C2) Reihenfolge, | + | ==== Überschreiben |
| - | - Spezifischere Selektoren gewinnen meist gegen allgemeine. | + | Wenn zwei Regeln dieselbe Eigenschaft setzen, gilt diese Reihenfolge: |
| - | - Bei gleicher Spezifität gewinnt die **Regel, die später im CSS steht**. | + | |
| - | - Media Queries wirken wie „zusätzliche Regeln“, die nur aktiv sind, wenn die Bedingung stimmt. | + | - **Wichtigkeit: |
| + | - **Spezifität: | ||
| + | - **Reihenfolge: | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | a { color: black; } | ||
| + | .menu a { color: gray; } | ||
| + | a.active { color: blue; } | ||
| + | #special a { color: red; } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | ==== Reihenfolge im CSS ==== | ||
| + | Bei gleicher Spezifität gewinnt die Regel, die später im CSS steht. | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | .menu a { color: gray; } | ||
| + | .menu a { color: green; } /* gewinnt, weil später */ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Für ein vertieftes Verständnis schauen Sie sich diese interaktive Darstellung an: | ||
| + | [[https:// | ||
| ---- | ---- | ||
| - | ===== D) Media Queries | + | ===== 4) Media Queries |
| + | {{: | ||
| - | ==== D1) Was macht eine Media Query? ==== | + | ==== Was macht eine Media Query ==== |
| - | Media Queries | + | Media Queries |
| - | ==== D2) Breakpoints: nach Inhalt, nicht nach Geräten | + | ==== Breakpoints ==== |
| - | Setzen | + | Ein Breakpoint ist eine Breite, bei der Sie das Layout anpassen, weil es sonst nicht mehr sauber wirkt. |
| - | ==== D3) Beispiel aus unserem Projekt ==== | + | <WRAP center round box 80%> |
| - | Unser Desktop-Layout ist 2-spaltig (Text links, Bild rechts). | + | |
| - | Auf Mobile wird es 1-spaltig, mit dem Bild zuerst: | + | |
| <code css> | <code css> | ||
| + | @media (width < 1024px) { ... } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Typische Hinweise, dass ein Breakpoint nötig ist: | ||
| + | * Elemente überlappen oder stossen sich | ||
| + | * Navigation passt nicht mehr | ||
| + | * 2 Spalten werden zu eng | ||
| + | * horizontales Scrollen entsteht | ||
| + | |||
| + | <WRAP center round tip 70%> | ||
| + | **Merksatz: | ||
| + | </ | ||
| + | |||
| + | ==== Beispiel aus unserem Projekt ==== | ||
| + | Desktop: Text links, Bild rechts. | ||
| + | Mobile: Bild oben, Text darunter. | ||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | <code css> | ||
| + | # | ||
| + | |||
| @media screen and (width < 1024px) { | @media screen and (width < 1024px) { | ||
| - | # | + | # |
| - | | + | |
| - | | + | |
| } | } | ||
| </ | </ | ||
| + | </ | ||
| - | ==== D4) Media Queries und Kaskade ==== | + | ==== Media Queries und Kaskade ==== |
| - | * Innerhalb der Media Query überschreiben Sie **nur** die Eigenschaften, | + | Media Queries folgen denselben Regeln wie normales CSS: |
| - | * Wenn ein Selektor gleich bleibt (z.B. ''# | + | * Bei aktivem Breakpoint |
| + | * Bei gleicher Spezifität | ||
| ---- | ---- | ||
| - | ===== E) Responsive Testing mit DevTools ===== | + | ===== 5) Responsive Testing mit DevTools ===== |
| + | {{: | ||
| * Öffnen Sie DevTools (Chrome/ | * Öffnen Sie DevTools (Chrome/ | ||
| - | * Aktivieren Sie den **Device Toolbar** (Handy/ | + | * Aktivieren Sie Device Toolbar (Handy/ |
| * Testen Sie: | * Testen Sie: | ||
| - | - Breitenwechsel über/ | + | - Breitenwechsel über/unter 1024px |
| - | - verschiedene | + | - Presets (z.B. iPhone, iPad) |
| - | - Landscape/Portrait | + | - Hoch-/Querformat |
| - | * Prüfen Sie auch: | + | * Prüfen Sie: |
| - | - ob Elemente verschwinden/ | + | - Überlappungen oder abgeschnittene Bereiche |
| - | - ob Text zu klein/gross wirkt | + | - horizontales Scrollen |
| - | - ob es horizontales Scrollen gibt (meist ein Zeichen für zu grosse Breiten) | + | - Lesbarkeit der Schrift |
| + | <WRAP center round box 80%> | ||
| + | **Praxis-Tipp** | ||
| + | \\ | ||
| + | Wenn etwas nicht greift: DevTools → „Styles“ öffnen und schauen, welche Regel durchgestrichen ist. Das ist Kaskade in Aktion. | ||
| + | </ | ||