{ "$schema": "../../schemas/code-crispies-module-schema.json", "id": "flexbox", "title": "CSS Flexbox", "description": "Beherrsche das flexible Box-Layout-Modell für moderne responsive Designs", "difficulty": "intermediate", "lessons": [ { "id": "flexbox-1", "title": "Flex Container", "description": "Flexbox ist ein eindimensionales Layout-System. Mit display: flex wird ein Element zum Flex-Container. Alle direkten Kinder werden automatisch zu Flex-Items und richten sich horizontal (Hauptachse) aus. Die Querachse verläuft senkrecht dazu.", "task": "Füge display: flex zu .wrap hinzu.", "previewHTML": "
1
2
3
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; }", "codePrefix": ".wrap {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "display", "expected": "flex" }, "message": "Setze display auf flex" } ] }, { "id": "flexbox-2", "title": "Direction & Wrap", "description": "flex-direction bestimmt die Hauptachse: row (horizontal, Standard) oder column (vertikal). Mit flex-wrap: wrap brechen Items in die nächste Zeile/Spalte um, wenn der Platz nicht reicht.", "task": "Füge flex-direction: column und flex-wrap: wrap zu .wrap hinzu.", "previewHTML": "
1
2
3
4
5
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; height: 16rem; display: flex; }", "codePrefix": ".wrap {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "flex-direction", "expected": "column" }, "message": "Setze flex-direction auf column" }, { "type": "property_value", "value": { "property": "flex-wrap", "expected": "wrap" }, "message": "Setze flex-wrap auf wrap" } ] }, { "id": "flexbox-3", "title": "Justify Content", "description": "justify-content verteilt Items entlang der Hauptachse. Werte: flex-start (Anfang), flex-end (Ende), center (Mitte), space-between (gleichmäßig mit Abstand), space-around (gleichmäßig mit Rand).", "task": "Füge justify-content: space-between zu .wrap hinzu.", "previewHTML": "
1
2
3
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "codePrefix": ".wrap {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "justify-content", "expected": "space-between" }, "message": "Setze justify-content auf space-between" } ] }, { "id": "flexbox-4", "title": "Align Items", "description": "align-items richtet Items entlang der Querachse aus (bei row: vertikal). Werte: stretch (Standard, füllt Höhe), flex-start (oben), flex-end (unten), center (Mitte), baseline (Textlinie).", "task": "Füge align-items: center zu .wrap hinzu.", "previewHTML": "
1
2
3
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; display: flex; justify-content: center; } .tall { height: 6rem; } .short { height: 3rem; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 10rem; }", "codePrefix": ".wrap {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "align-items", "expected": "center" }, "message": "Setze align-items auf center" } ] }, { "id": "flexbox-5", "title": "Flex Grow", "description": "Die flex-Eigenschaft ist eine Kurzform für flex-grow, flex-shrink und flex-basis. Ein höherer Wert bedeutet, dass das Element mehr vom verfügbaren Platz einnimmt. flex: 2 wächst doppelt so schnell wie flex: 1.", "task": "Füge flex: 2 zu .green hinzu.", "previewHTML": "
1
2
3
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; display: flex; align-items: center; justify-content: center; } .red { background: coral; flex: 1; } .green { background: mediumseagreen; } .yellow { background: gold; flex: 1; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; }", "codePrefix": ".green {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "flex", "expected": "2" }, "message": "Setze flex auf 2" } ] }, { "id": "flexbox-6", "title": "Align Self", "description": "align-self überschreibt align-items für ein einzelnes Element. So kannst du ein Item individuell auf der Querachse positionieren, während alle anderen Items ihrer Standard-Ausrichtung folgen.", "task": "Füge align-self: flex-start zu .middle hinzu.", "previewHTML": "
1
2
3
", "previewBaseCSS": "body { font-family: system-ui, sans-serif; padding: 1rem; } .box { background: steelblue; color: white; padding: 1rem; margin: 8px; text-align: center; font-weight: bold; width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; } .middle { background: mediumseagreen; }", "sandboxCSS": ".wrap { border: 2px dashed #aaa; padding: 1rem; display: flex; height: 12rem; align-items: center; }", "codePrefix": ".middle {\n ", "initialCode": "", "codeSuffix": "\n}", "previewContainer": "preview-area", "validations": [ { "type": "property_value", "value": { "property": "align-self", "expected": "flex-start" }, "message": "Setze align-self auf flex-start" } ] } ] }