Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
| de:modul:m291:learningunits:lu02:theorie:a_css-intro [2026/02/02 01:07] – [2) Überschreiben (Overriding): Wer gewinnt bei Konflikten?] gkoch | de:modul:m291:learningunits:lu02:theorie:a_css-intro [2026/02/02 01:29] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| - die Schrift (Google Font) einbinden, | - die Schrift (Google Font) einbinden, | ||
| - Designwerte als CSS-Variablen definieren und | - Designwerte als CSS-Variablen definieren und | ||
| - | - Mit Media Queries das Responsive-Layout für Mobile umsetzen. | + | - mit Media Queries das Responsive-Layout für Mobile umsetzen. |
| </ | </ | ||
| ==== 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. | ||
| + | ---- | ||
| - | ===== Fonts im Web ===== | + | ===== 1) Fonts im Web ===== |
| {{: | {{: | ||
| ==== Google Fonts via CDN ==== | ==== Google Fonts via CDN ==== | ||
| + | In vielen Projekten werden Fonts schnell über ein CDN eingebunden (z.B. Google Fonts). Das ist praktisch für Schulprojekte und schnelle Prototypen. | ||
| - | In vielen Projekten werden Fonts schnell über ein CDN eingebunden (z.B. Google Fonts) – das ist praktisch für Prototypen und Schulprojekte. | ||
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Typischer Aufbau im ''< | + | **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> | ||
| body { | body { | ||
| - | font-family: | + | |
| } | } | ||
| </ | </ | ||
| </ | </ | ||
| - | <WRAP center round tip 60%> | + | <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 ''< |
| </ | </ | ||
| - | ==== Besser in der Praxis: | + | ==== Fonts lokal speichern ==== |
| - | Mit '' | + | Wenn Fonts lokal im Projekt liegen, werden sie mit '' |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| <code css> | <code css> | ||
| Zeile 56: | Zeile 62: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
| + | ((Für lokale Fonts brauchen Sie die Font-Dateien im Projekt, idealerweise '' | ||
| ==== Wichtige Font-Eigenschaften ==== | ==== Wichtige Font-Eigenschaften ==== | ||
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | * '' | + | * '' |
| - | ==== Einheiten bei Fonts: px vs em vs rem ==== | + | ---- |
| - | === Kurzdefinitionen | + | ==== Einheiten bei Schriftgroessen ==== |
| - | * **px**: „fixe“ Design-Einheit. '' | + | |
| - | * **em**: relativ zur **berechneten Schriftgrösse** ('' | + | |
| - | * **rem**: relativ zur **Root-Schriftgrösse** ('' | + | |
| + | <WRAP center round box 80%> | ||
| + | **Wichtig: | ||
| + | \\ | ||
| + | Viele Menschen nutzen Browser-Zoom oder haben eine grössere Standard-Schrift eingestellt. | ||
| + | </ | ||
| + | === px === | ||
| + | * '' | ||
| + | * Vorteil: direkt und einfach. | ||
| + | * Nachteil: In grossen Projekten wird es schnell unübersichtlich, | ||
| - | === Warum em/rem oft besser sind als px === | + | ((Browser-Zoom vergrössert zwar alles. Trotzdem ist '' |
| - | ==== 1) Skalierung & Nutzer-Einstellungen (Accessibility) ==== | + | <WRAP center round box 80%> |
| - | Viele Nutzerinnen und Nutzer verändern bewusst die **Standard-Schriftgrösse** im Browser oder verwenden **Zoom** bzw. Betriebssystem-Einstellungen (z.B. Sehhilfe, grosse Schrift). | + | <code css> |
| + | h1 { font-size: 64px; } | ||
| + | p { font-size: 18px; } | ||
| + | </ | ||
| + | </ | ||
| - | * Mit **rem/em** „gehen“ Ihre Schriftgrössen | + | === em === |
| - | * Mit **px** bleiben Sie oft näher an einem „fixen“ Design – das kann dazu führen, dass Text im Verhältnis zu Layout-Abständen schlechter skaliert. | + | |
| + | * '' | ||
| - | ==== 2) Konsistenz über das ganze Projekt | + | ((Historisch stammt „em“ aus der Typografie. In CSS ist '' |
| - | Mit **rem** können Sie ein klares System bauen: | + | |
| - | * Basis ist '' | + | |
| - | * Alles andere wird in rem definiert (z.B. h1 = 4rem, p = 1.125rem) | + | |
| - | Damit können Sie das „Gesamtbild“ sehr kontrolliert skalieren, ohne jedes Element einzeln anzufassen. | + | <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: | ||
| - | ==== 3) Robustheit bei Komponenten ==== | + | <WRAP center round box 80%> |
| - | **em** ist besonders nützlich innerhalb von Komponenten: | + | <code css> |
| - | * Buttons, Badges, Cards können Abstände (padding/margins) in '' | + | body { font-size: 1.2em; } /* 1.2 × 16px = 19.2px |
| - | * so bleiben sie proportional zur Textgrösse der Komponente. | + | div { font-size: 1.3em; } /* 1.3 × 19.2px = 24.96px |
| + | h1 { font-size: 2em; } /* 2 × 24.96px = 49.92px */ | ||
| + | </ | ||
| + | </ | ||
| - | Beispiel: Wenn ein Button-Text grösser wird, wächst das Padding automatisch mit – das wirkt typografisch sauber und verhindert „gequetschte“ Buttons. | + | ((Darum ist '' |
| + | **Wann ist em sinnvoll** | ||
| + | * Für Proportionen innerhalb einer Komponente: Padding, Icon-Grössen, | ||
| - | === px – wann ist es trotzdem okay? === | + | <WRAP center round box 80%> |
| - | **px ist nicht „verboten“**, | + | <code css> |
| - | | + | button { |
| - | | + | font-size: 1rem; |
| - | * einzelne Sonderfälle im Layout | + | |
| + | } | ||
| + | </ | ||
| + | </ | ||
| - | Viele moderne Designsysteme nutzen | + | === 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 */ | ||
| + | </ | ||
| + | </ | ||
| - | === em vs rem – wann welches? === | + | ((Mit '' |
| - | * **rem**: für **globale Typografie** (h1, p, nav, Standardtext) → konsistent im ganzen Projekt | + | |
| - | * **em**: für **komponenten-interne Proportionen** (Padding, Icon-Grösse, | + | |
| + | ==== 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 === | + | ==== line-height |
| - | Für Lesbarkeit ist eine passende Zeilenhöhe zentral. | + | Setzen Sie '' |
| - | * Best Practice: | + | |
| - | Einheitenlose | + | <WRAP center round box 80%> |
| + | <code css> | ||
| + | body { line-height: 1.4; } | ||
| + | </ | ||
| + | </ | ||
| + | ((Einheitenlose '' | ||
| - | ===== CSS-Variablen (Custom Properties) ===== | + | ---- |
| + | ===== 2) CSS-Variablen ===== | ||
| + | ==== Was sind CSS-Variablen ==== | ||
| + | CSS-Variablen sind benannte Werte, die Sie einmal zentral definieren und dann überall wiederverwenden. | ||
| - | ==== Was sind CSS-Variablen? | ||
| - | CSS-Variablen (korrekt: Custom Properties) sind benannte Werte, die Sie **einmal zentral** definieren und dann überall mit '' | ||
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Beispiel: | ||
| <code css> | <code css> | ||
| :root { | :root { | ||
| --primary: #263fa9; | --primary: #263fa9; | ||
| - | --text: #178bff; | + | --text: #223344; |
| - | } | + | --h1-size: 4rem; |
| - | body { | + | |
| - | | + | |
| - | } | + | |
| - | button { | + | |
| - | background: var(--primary); | + | |
| } | } | ||
| + | |||
| + | body { color: var(--text); | ||
| + | button { background: var(--primary); | ||
| + | h1 { font-size: var(--h1-size); | ||
| </ | </ | ||
| </ | </ | ||
| - | ==== 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 |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Vergleich zu Print-Design | + | **Vergleich zu Print-Design** |
| \\ | \\ | ||
| - | CSS-Variablen | + | CSS-Variablen |
| </ | </ | ||
| + | ---- | ||
| - | ===== CSS Cascade | + | ===== 3) CSS Cascade ===== |
| {{: | {{: | ||
| + | \\ | ||
| //Viele CSS-Regeln funktionieren nach dem Prinzip " | //Viele CSS-Regeln funktionieren nach dem Prinzip " | ||
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Was ist die Kaskade?** | + | **Was ist die Kaskade** |
| \\ | \\ | ||
| - | Die CSS-Kaskade | + | Die CSS-Kaskade entscheidet, |
| - | \\ | + | |
| - | Kurz: Wenn CSS „streitet“, | + | |
| </ | </ | ||
| - | ==== Warum ist das wichtig? | + | ==== Vererbung |
| - | In echten Projekten schreiben Sie nicht nur 1 Regel pro Element: | + | Einige Eigenschaften werden von Eltern an Kinder |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | * und manchmal überschreibt man später etwas gezielt | + | |
| - | + | ||
| - | Ohne Kaskade wäre unklar, was am Ende gilt. | + | |
| - | ==== 1) Vererbung (Inheritance): | + | |
| - | Einige CSS-Eigenschaften werden vom Eltern-Element an Kinder | + | * Meist nicht vererbt: '' |
| - | + | ||
| - | **Typisch | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | + | ||
| - | **Typisch NICHT vererbt:** | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| - | * '' | + | |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Beispiel: | ||
| <code css> | <code css> | ||
| - | body { | + | body { |
| font-family: | font-family: | ||
| color: #223344; | color: #223344; | ||
| Zeile 201: | Zeile 225: | ||
| </ | </ | ||
| - | Alle Textelemente im Body erhalten diese Werte, solange sie nicht selbst etwas anderes | + | ==== Überschreiben ==== |
| + | Wenn zwei Regeln dieselbe Eigenschaft | ||
| - | ==== 2) Überschreiben (Overriding): Wer gewinnt bei Konflikten? ==== | + | - **Wichtigkeit:** '' |
| - | Wenn mehrere Regeln dieselbe Eigenschaft setzen (z.B. '' | + | |
| - | Das passiert in dieser Reihenfolge: | + | - **Reihenfolge:** bei gleicher Spezifität gewinnt die spätere Regel |
| - | + | ||
| - | === Regel 1: Wichtigkeit ('' | + | |
| - | | + | |
| - | + | ||
| - | ((In diesem Modul: '' | + | |
| - | + | ||
| - | === Regel 2: Spezifität (Specificity) === | + | |
| - | Je „genauer“ ein Selektor ist, desto stärker ist er. | + | |
| - | + | ||
| - | **Grob von schwach nach stark:** | + | |
| - | - Elementselektor: | + | |
| - | - Klassenselektor: '' | + | |
| - | - ID-Selektor: | + | |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Beispiel: | ||
| <code css> | <code css> | ||
| - | a { color: black; } /* schwach */ | + | a { color: black; } |
| - | .menu a { color: gray; } /* stärker */ | + | .menu a { color: gray; } |
| - | a.active { color: blue; } /* ähnlich stark wie .menu a (Klasse + Element) */ | + | a.active { color: blue; } |
| - | #special a { color: red; } /* sehr stark */ | + | #special a { color: red; } |
| </ | </ | ||
| </ | </ | ||
| - | === Regel 3: Reihenfolge im CSS (Last Rule Wins) === | + | ==== Reihenfolge im CSS ==== |
| - | Wenn zwei Regeln **gleich spezifisch** sind, gewinnt die Regel, die **später im CSS** steht. | + | Bei gleicher Spezifität |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| - | **Beispiel: | ||
| <code css> | <code css> | ||
| .menu a { color: gray; } | .menu a { color: gray; } | ||
| Zeile 241: | Zeile 251: | ||
| </ | </ | ||
| - | Für ein vertieftes Verständnis | + | Für ein vertieftes Verständnis schauen Sie sich diese interaktive Darstellung an: |
| + | [[https:// | ||
| + | ---- | ||
| - | ==== Media Queries und Kaskade: „CSS gilt nur wenn Bedingung stimmt“ | + | ===== 4) Media Queries und Responsive Design ===== |
| - | Media Queries | + | |
| - | Sie sind wie zusätzliche Regeln, die nur aktiv werden, wenn die Bedingung erfüllt ist. | + | |
| - | + | ||
| - | <WRAP center round box 80%> | + | |
| - | **Beispiel: | + | |
| - | <code css> | + | |
| - | # | + | |
| - | + | ||
| - | @media screen and (width < 1024px) { | + | |
| - | # | + | |
| - | } | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | Was passiert? | + | |
| - | * Über 1024px gilt: '' | + | |
| - | * Unter 1024px wird die zweite Regel aktiv und überschreibt '' | + | |
| - | + | ||
| - | Media Query überschreibt nur dann, wenn sie „an“ ist. Und auch dort gilt: Spezifität + Reihenfolge entscheiden. | + | |
| - | + | ||
| - | + | ||
| - | <WRAP center round box 80%> | + | |
| - | **CSS debuggen** | + | |
| - | \\ | + | |
| - | Wenn etwas „komisch“ aussieht, schauen Sie in DevTools: Welche Regel ist durchgestrichen? | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ===== Media Queries & Responsive Design ===== | + | |
| {{: | {{: | ||
| - | ==== Was macht eine Media Query? ==== | + | ==== Was macht eine Media Query ==== |
| - | Media Queries | + | Media Queries |
| - | + | ||
| - | ==== Breakpoints: | + | |
| - | Ein **Breakpoint** ist eine Bildschirmbreite, bei der Sie Ihr CSS **bewusst ändern**, damit das Layout | + | ==== Breakpoints ==== |
| - | Das passiert meistens über eine **Media Query**, z.B.: | + | Ein Breakpoint ist eine Breite, bei der Sie das Layout |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| Zeile 290: | Zeile 271: | ||
| </ | </ | ||
| - | ==== Was passiert an einem Breakpoint? ==== | + | Typische Hinweise, dass ein Breakpoint |
| - | Bei einem Breakpoint passen Sie die Darstellung an, weil sonst z.B.: | + | * Elemente überlappen oder stossen |
| - | * Elemente | + | * Navigation |
| - | * Textzeilen extrem lang/kurz werden (schlecht lesbar) | + | * 2 Spalten |
| - | * Buttons/Navigation nicht mehr sinnvoll Platz haben | + | |
| - | * ein 2-Spalten-Layout | + | |
| * horizontales Scrollen entsteht | * horizontales Scrollen entsteht | ||
| - | <WRAP center round tip 60%> | + | <WRAP center round tip 70%> |
| - | Ein Breakpoint ist also der Moment, wo das Layout | + | **Merksatz: |
| </ | </ | ||
| - | |||
| ==== Beispiel aus unserem Projekt ==== | ==== Beispiel aus unserem Projekt ==== | ||
| - | Unser Desktop-Layout ist 2-spaltig (Text links, Bild rechts). | + | Desktop: Text links, Bild rechts. |
| - | Auf Mobile | + | Mobile: |
| <WRAP center round box 80%> | <WRAP center round box 80%> | ||
| <code css> | <code css> | ||
| + | # | ||
| + | |||
| @media screen and (width < 1024px) { | @media screen and (width < 1024px) { | ||
| - | # | + | # |
| - | | + | |
| - | | + | |
| } | } | ||
| </ | </ | ||
| Zeile 317: | Zeile 296: | ||
| ==== Media Queries und Kaskade ==== | ==== Media Queries und Kaskade ==== | ||
| - | | + | Media Queries folgen denselben Regeln wie normales CSS: |
| - | * Wenn ein Selektor gleich bleibt (z.B. ''# | + | |
| + | * Bei gleicher Spezifität | ||
| - | ===== 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. | ||
| + | </ | ||