- Einstieg: heute bauen wir eigene, wiederverwendbare HTML-Elemente
- Drei Bausteine ankuendigen: Templates, Shadow DOM, Custom Elements
- Nicht auf dem Titel verweilen
- Fahrplan fuer die Vorlesung zeigen: sechs Stationen bis zur eigenen Profilkarte
- Kurz halten, direkt weiter zum Ziel der Stunde
- Motivation: wiederverwendbare, fertig gestylte Bausteine wie in einer Komponenten-Bibliothek
- Laufendes Beispiel der naechsten Folien: ein Container, der Text blau faerbt
- Ueberleitung von der Motivation zum ersten Baustein: das template-Element
- Danach das Problem (globales CSS) und die Loesung (Shadow DOM) zeigen
- Kernpunkt: Inhalt eines template-Elements wird vom Browser nicht gerendert
- Erst per JavaScript ausgewaehlt, geklont und eingefuegt
- Ablauf am Code zeigen: content des Templates holen, mit cloneNode(true) duplizieren, anhaengen
- Ergebnis rechts: der Schnipsel erscheint zweimal, komplett blau
- Problem herausarbeiten: globales CSS der Seite greift auch auf die eingefuegten Elemente
- Der spaeter geladene p-Selektor gewinnt, die Absaetze werden rot statt blau
- Kernbegriff: Verkapselung, der Shadow-Baum ist von aussen nicht stylebar
- Genau das loest unser Problem von der vorherigen Folie
- Begriffe am Bild erklaeren: Shadow Host (Element im Haupt-DOM), Shadow Root, Shadow Boundary
- Rechts: zum Rendern werden beide Baeume zu einem Flattened Tree zusammengefuehrt
- Eine neue Zeile macht den Unterschied: attachShadow({ mode: "open" }) am Einfuege-Element
- Klone landen im Shadow Root statt im Haupt-DOM, alles bleibt blau
- Templates und Shadow DOM sind die Bausteine, Custom Elements verpacken sie in einen eigenen Tag
- Ueberleitung: statt einzufuegen schreiben wir gleich unser eigenes HTML-Element
- Custom Element = eigene Klasse, die von HTMLElement erbt
- Im Konstruktor: Shadow Root anhaengen und Inhalt hineinbauen
- customElements.define registriert den Tag-Namen (muss einen Bindestrich enthalten)
- Einsatz wie ein normales HTML-Element: einfach <blue-div> schreiben
- Gegenprobe zum Problem von vorhin: der rote p-Selektor greift nicht mehr
- Bisher war der Inhalt eines Custom Elements fest im Konstruktor verdrahtet
- Slots loesen das: Nutzer:innen der Komponente liefern eigenen Inhalt von aussen
- Slots als Uebergabe-Stellen: Nutzer des Elements liefern eigenen Inhalt hinein
- Ueberleitung zur Uebung: genau das braucht die Profilkarte fuer den Beschreibungstext
- Ein slot ohne name-Attribut ist der Default-Slot: er nimmt jeden nicht anders zugewiesenen Inhalt auf
- Bleibt das Custom Element leer, greift der Fallback-Text, der im slot-Element selbst steht
- Benannte Slots erlauben mehrere Einfuegestellen in einer Komponente statt nur einer
- Ueberleitung: CustomProfileCard braucht genau das fuer den Beschreibungstext
- Letzter Baustein vor der Uebung: die Lifecycle-Callbacks eines Custom Elements
- Wichtig fuer die Uebung gleich: wann darf ich welche Attribute lesen?
- Tabelle als Nachschlagewerk: vier Callbacks plus die observedAttributes-Deklaration
- Kernregel hervorheben: Attribute nie im Constructor lesen, das gilt gleich auch fuer die Uebung
- observedAttributes legt fest, dass nur Aenderungen am color-Attribut attributeChangedCallback ausloesen
- connectedCallback setzt die Startfarbe hier, nicht im Constructor, weil das Element da schon im DOM haengt
- Letzte Station: alle Bausteine (Custom Element, Shadow DOM, Slot, Lifecycle) in einer Uebung kombinieren
- Direkt in die Aufgabenstellung ueberleiten
- Uebung austeilen: Material liegt im Lernraum unter Zusatzmaterial, QR-Code zeigen
- Dry-Run-Stolperstelle: QR-Code (assets/web-06/qr-custom-profile-card.png) zeigt auf den
25/26-Lernraumkurs — vor dem Halten fuer den neuen Kurs neu generieren
- Hinweis: Attribute (img, name, role) auslesen, Slot fuer die Beschreibung, Stylesheet einbinden
- 20 Minuten Arbeitszeit, danach kurze Besprechung
- Vier Schritte als Fahrplan fuer die Live-Codierung der Loesung
- Kernregel wiederholen: alles im connectedCallback, Attribute existieren im Constructor noch nicht zuverlaessig
- link.setAttribute kombiniert die Hinweise 1-3 der Aufgabe: Element erzeugen, Attribute setzen, einhaengen
- classList.add('card') muss zur CSS-Klasse aus profile-card.css passen
- h2 und small matchen die Selektoren aus profile-card.css
- slot mit name="description" muss zum slot="description" im HTML der Aufgabe passen
- Zum Schluss: card an den shadow anhaengen, nicht direkt an this
- Ergebnis zeigen: eine fertige Profilkarte mit Foto, Name, Rolle und Slot-Text
- Kurzer Rueckblick: Custom Element, Shadow DOM, externes Stylesheet und Slot, alles aus dieser Vorlesung kombiniert