====== LU02: Fonts, CSS-Variablen, Cascade & Media Queries ====== **Ziel von LU02:** Sie bringen Ihr Projekt „Landingpage Alarado“ optisch näher ans Figma-Design, indem Sie \\ - die Schrift (Google Font) einbinden, - Designwerte als CSS-Variablen definieren und - mit Media Queries das Responsive-Layout für Mobile umsetzen. ==== Lernziele ==== * Sie können eine Google Font per '''' einbinden und als ''font-family'' verwenden. * Sie verstehen ''px'', ''em'' und ''rem'' und setzen Schriftgroessen konsistent um. * Sie können CSS-Variablen in '':root'' definieren und mit ''var(...)'' einsetzen. * Sie verstehen die CSS-**Kaskade** (Vererbung, Spezifität, Reihenfolge). * Sie können Media Queries für Responsive Design nutzen und mit DevTools testen. ---- ===== 1) Fonts im Web ===== {{:de:modul:m291:learningunits:lu02:theorie:jon-tyson-x5bnzeywcug-unsplash_700.jpg?nolink&400|}} ==== 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. **Typischer Aufbau im ''''** (hier mit **Poppins**): **Dann im CSS verwenden:** body { font-family: "Poppins", sans-serif; } **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 ''''. ((CDN-Fonts sind bequem, aber Sie sind abhängig von einem externen Dienst.)) ==== Fonts lokal speichern ==== Wenn Fonts lokal im Projekt liegen, werden sie mit ''@font-face'' eingebunden. @font-face { font-family: "Poppins"; src: url("./fonts/Poppins-Regular.woff2") format("woff2"); font-weight: 400; font-style: normal; } ((Für lokale Fonts brauchen Sie die Font-Dateien im Projekt, idealerweise ''woff2''.)) ==== Wichtige Font-Eigenschaften ==== * ''font-family'': Schriftfamilie mit Fallback (z.B. ''sans-serif'') * ''font-weight'': Schriftschnitt (400 normal, 700 bold) ((Nicht jede Font bietet jede Weight-Stufe.)) * ''font-style'': normal oder italic * ''text-transform'': Darstellung (z.B. ''uppercase'') ((Der Inhalt bleibt gleich, nur die Darstellung ändert sich.)) * ''line-height'': Zeilenhöhe (Best Practice: **einheitenlos**, z.B. ''1.4'') ---- ==== Einheiten bei Schriftgroessen ==== **Wichtig:** Bei Schriftgroessen geht es nicht nur um „schön“, sondern auch um **Skalierung, Wartbarkeit und Accessibility**. \\ Viele Menschen nutzen Browser-Zoom oder haben eine grössere Standard-Schrift eingestellt. === px === * ''px'' ist eine „fixe“ Design-Einheit: ''16px'' bleibt rechnerisch 16px. * Vorteil: direkt und einfach. * Nachteil: In grossen Projekten wird es schnell unübersichtlich, weil Anpassungen an vielen Stellen nötig werden. ((Browser-Zoom vergrössert zwar alles. Trotzdem ist ''px'' oft weniger flexibel, wenn Sie ein Designsystem skalieren oder mehrere Breakpoints sauber pflegen wollen.)) h1 { font-size: 64px; } p { font-size: 18px; } === em === * ''1em'' entspricht der **berechneten Schriftgroesse** (''font-size'') des aktuellen Elements. * ''em'' wirkt wie ein Faktor: ''2em'' ist doppelt so gross wie die Schriftgroesse des Eltern-Elements. ((Historisch stammt „em“ aus der Typografie. In CSS ist ''em'' eine Recheneinheit: 1em = aktuelle ''font-size''.)) 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: 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 ''em'' für globale Typografie manchmal schwerer zu kontrollieren, wenn viel verschachtelt wird.)) **Wann ist em sinnvoll** * Für Proportionen innerhalb einer Komponente: Padding, Icon-Grössen, Abstände, die mit dem Text mitwachsen sollen. button { font-size: 1rem; padding: 0.8em 1.2em; /* wächst mit der Button-Schrift */ } === rem === * ''1rem'' ist relativ zur Schriftgroesse des Root-Elements ''html''. * Vorteil: bleibt konsistent, egal wie tief ein Element verschachtelt ist. html { font-size: 16px; } h1 { font-size: 4rem; } /* 64px */ p { font-size: 1.125rem; } /* 18px */ ((Mit ''rem'' vermeiden Sie „Schriftgroessenvermehrung“ durch verschachtelte Elemente.)) ==== 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 ''line-height'' möglichst **einheitenlos**, z.B.: body { line-height: 1.4; } ((Einheitenlose ''line-height'' skaliert automatisch mit der Schriftgroesse.)) ---- ===== 2) CSS-Variablen ===== ==== Was sind CSS-Variablen ==== CSS-Variablen sind benannte Werte, die Sie einmal zentral definieren und dann überall wiederverwenden. :root { --primary: #263fa9; --text: #223344; --h1-size: 4rem; } body { color: var(--text); } button { background: var(--primary); } h1 { font-size: var(--h1-size); } ==== Warum lohnt sich das ==== * **Wiederverwendbarkeit:** weniger Copy/Paste, weniger Fehler * **Wartbarkeit:** 1 Änderung in '':root'' wirkt im ganzen Projekt * **Lesbarkeit:** Namen sind verständlicher als zufällige Hex-Zahlen **Vergleich zu Print-Design** \\ CSS-Variablen funktionieren ähnlich wie Absatz- und Zeichenstile: Sie definieren Werte zentral und wenden sie konsistent an. ---- ===== 3) CSS Cascade ===== {{:de:modul:m291:learningunits:lu02:theorie:ezgi-kimball-jg8jcmefhdg-unsplash_700.jpg?nolink&500|}} \\ //Viele CSS-Regeln funktionieren nach dem Prinzip "Wasserfall" -> Styles, die für Elemente ganz "oben" im HTML definiert wurden, vererben sich an Elemente weiter "unten" in der HTML-Struktur (gemeint sind Kinder-Elemente)// **Was ist die Kaskade** \\ Die CSS-Kaskade entscheidet, welche CSS-Regel am Ende wirklich angewendet wird, wenn mehrere Regeln dasselbe Element betreffen. ==== Vererbung ==== Einige Eigenschaften werden von Eltern an Kinder **vererbt**. * Häufig vererbt: ''color'', ''font-*'', ''line-height'', ''text-transform'' * Meist nicht vererbt: ''background-*'', ''margin/padding'', ''border'', ''width/height'', ''display'' body { font-family: "Poppins", sans-serif; color: #223344; line-height: 1.4; } ==== Überschreiben ==== Wenn zwei Regeln dieselbe Eigenschaft setzen, gilt diese Reihenfolge: - **Wichtigkeit:** ''!important'' gewinnt ((Nur im Ausnahmefall verwenden.)) - **Spezifität:** ID schlägt Klasse, Klasse schlägt Element - **Reihenfolge:** bei gleicher Spezifität gewinnt die spätere Regel 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. .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://2019.wattenberger.com/blog/css-cascade|CSS Cascade]] ---- ===== 4) Media Queries und Responsive Design ===== {{:de:modul:m291:learningunits:lu02:theorie:media-queries.webp| Responsive Media Queries: Desktop, Tablet, Mobile}} ==== Was macht eine Media Query ==== Media Queries passen die Darstellung an verschiedene Bildschirmbreiten an. Der Inhalt bleibt gleich, nur das Layout ändert sich. ==== Breakpoints ==== Ein Breakpoint ist eine Breite, bei der Sie das Layout anpassen, weil es sonst nicht mehr sauber wirkt. @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 **Merksatz:** Ein Breakpoint ist ein Layout-Umbruchpunkt, nicht ein „Handy-Mass“. ==== Beispiel aus unserem Projekt ==== Desktop: Text links, Bild rechts. Mobile: Bild oben, Text darunter. #hero-section { flex-direction: row; } @media screen and (width < 1024px) { #hero-section { flex-direction: column-reverse; } } ==== Media Queries und Kaskade ==== Media Queries folgen denselben Regeln wie normales CSS: * Bei aktivem Breakpoint überschreiben Sie nur die Eigenschaften, die sich ändern. * Bei gleicher Spezifität gewinnt die Regel, die später kommt. ---- ===== 5) Responsive Testing mit DevTools ===== {{:de:modul:m291:learningunits:lu02:theorie:screenshot_2026-02-02_at_00.23.31.png?direct&1100| Screenshot Chromebrowser mit Dev-Tools }} * Öffnen Sie DevTools (Chrome/Edge: F12) * Aktivieren Sie Device Toolbar (Handy/Tablet Symbol) * Testen Sie: - Breitenwechsel über/unter 1024px - Presets (z.B. iPhone, iPad) - Hoch-/Querformat * Prüfen Sie: - Überlappungen oder abgeschnittene Bereiche - horizontales Scrollen - Lesbarkeit der Schrift **Praxis-Tipp** \\ Wenn etwas nicht greift: DevTools → „Styles“ öffnen und schauen, welche Regel durchgestrichen ist. Das ist Kaskade in Aktion.