{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "box-model", "title": "Padding, Borders und Margins", "description": "Beherrsche die Grundprinzipien der Raumverwaltung im Webdesign durch das CSS Box-Modell.", "difficulty": "beginner", "lessons": [ { "id": "box-model-1", "title": "Box-Modell Komponenten", "description": "Das CSS Box-Modell besteht aus vier konzentrischen Schichten: Inhalt (innerste), Padding, Border und Margin (äußerste). Zu verstehen, wie diese Komponenten zusammenwirken, ist essentiell für präzise Layout-Kontrolle.", "task": "Füge padding: 1rem zu .box hinzu, um Abstand zwischen Inhalt und Rahmen zu schaffen.", "previewHTML": "
Box-Modell Komponenten
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background-color: lavender; border: 2px dashed slategray; }", "sandboxCSS": "", "codePrefix": ".box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "padding", "expected": "1rem" }, "message": "Setze padding auf '1rem'" } ] }, { "id": "box-model-2", "title": "Rahmen hinzufügen", "description": "Rahmen umranden ein Element und schaffen visuelle Trennung. Die border-Kurzschreibweise akzeptiert drei Werte: Breite, Stil und Farbe.", "task": "Füge border: 2px solid darkslategray zu .box hinzu.", "previewHTML": "
Diese Box braucht einen Rahmen
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background-color: mintcream; padding: 1rem; }", "sandboxCSS": "", "codePrefix": ".box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "regex", "value": "border:\\s*2px\\s+solid\\s+darkslategray", "message": "Setze border auf '2px solid darkslategray'", "options": { "caseSensitive": false } } ] }, { "id": "box-model-3", "title": "Außenabstände hinzufügen", "description": "Margins schaffen Abstand zwischen Elementen. Anders als Padding (das den inneren Abstand beeinflusst) existiert Margin außerhalb des Rahmens.", "task": "Füge margin: 1rem zu .margin-box hinzu, um Abstand zum benachbarten Element zu schaffen.", "previewHTML": "
Diese Box braucht Margins
Benachbartes Element
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .container { background-color: whitesmoke; padding: 8px; } .margin-box { background-color: plum; padding: 1rem; border: 2px solid orchid; } .neighbor { background-color: lightblue; padding: 1rem; border: 2px solid steelblue; }", "sandboxCSS": "", "codePrefix": ".margin-box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "margin", "expected": "1rem" }, "message": "Setze margin auf '1rem'" } ] }, { "id": "box-model-4", "title": "Box-Sizing: Border-Box", "description": "Die box-sizing Eigenschaft bestimmt, wie Elementdimensionen berechnet werden. 'content-box' (Standard) schließt Padding und Border aus, während 'border-box' sie einschließt.", "task": "Füge box-sizing: border-box zu .border-box hinzu, damit Padding und Border in die Breite einbezogen werden.", "previewHTML": "
Content-box (Standard)
Border-box
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .sizing-demo { display: flex; gap: 1rem; } .box { width: 200px; padding: 1rem; border: 4px solid teal; background: lightcyan; } .content-box { box-sizing: content-box; }", "sandboxCSS": "", "codePrefix": ".border-box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "box-sizing", "expected": "border-box" }, "message": "Setze box-sizing auf 'border-box'" } ] }, { "id": "box-model-5", "title": "Margin-Kollaps", "description": "Wenn zwei vertikale Margins aufeinandertreffen, kollabieren sie zum größeren der beiden Werte statt zu addieren.", "task": "Füge margin-bottom: 2rem zu .first hinzu. Der Abstand zwischen den Absätzen beträgt 2rem (nicht 3rem) durch Margin-Kollaps.", "previewHTML": "

Dieser Absatz hat einen Bottom-Margin.

Dieser Absatz hat einen Top-Margin von 1rem.

", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .collapse-demo { border: 1px solid silver; padding: 8px; background: ghostwhite; } .second { margin-top: 1rem; background: linen; }", "sandboxCSS": "", "codePrefix": ".first {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "margin-bottom", "expected": "2rem" }, "message": "Setze margin-bottom auf '2rem'" } ] }, { "id": "box-model-6", "title": "Margin-Kurzschreibweise", "description": "Die Margin-Kurzschreibweise kann alle vier Seiten setzen. Zwei Werte setzen vertikale (oben/unten) und horizontale (links/rechts) Margins.", "task": "Füge margin: 1rem 2rem zu .shorthand-box hinzu für 1rem oben/unten und 2rem links/rechts.", "previewHTML": "
Diese Box braucht Margins: 1rem oben/unten, 2rem links/rechts
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .container { background-color: whitesmoke; padding: 8px; } .shorthand-box { background-color: honeydew; border: 2px solid mediumseagreen; padding: 1rem; }", "sandboxCSS": "", "codePrefix": ".shorthand-box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "regex", "value": "margin:\\s*1rem\\s+2rem", "message": "Setze margin auf '1rem 2rem'", "options": { "caseSensitive": false } } ] }, { "id": "box-model-7", "title": "Padding-Kurzschreibweise", "description": "Wie Margin erlaubt Padding-Kurzschreibweise das Setzen aller Seiten. Ein einzelner Wert gilt für alle vier Seiten.", "task": "Füge padding: 1.5rem zu .padding-box hinzu für gleichmäßiges Padding.", "previewHTML": "
Diese Box braucht gleichmäßiges Padding
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .padding-box { background-color: papayawhip; border: 2px solid orange; }", "sandboxCSS": "", "codePrefix": ".padding-box {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "padding", "expected": "1.5rem" }, "message": "Setze padding auf '1.5rem'" } ] }, { "id": "box-model-8", "title": "Rahmen auf einzelnen Seiten", "description": "Für feinere Kontrolle können einzelne Seiten mit border-top, border-right, border-bottom oder border-left angesprochen werden.", "task": "Füge border-bottom: 4px solid dodgerblue zu .border-demo hinzu.", "previewHTML": "
Dieses Element braucht nur einen unteren Rahmen
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .border-demo { padding: 1rem; background-color: aliceblue; }", "sandboxCSS": "", "codePrefix": ".border-demo {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "regex", "value": "border-bottom:\\s*4px\\s+solid\\s+dodgerblue", "message": "Setze border-bottom auf '4px solid dodgerblue'", "options": { "caseSensitive": false } } ] } ] }