Opening hours
Mon to Fri, 9 am to 6 pm.
Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine
·
Kursüberblick
Layout
·
Box
·
Flex
·
Stack
·
Grid
·
Container
·
Section
·
Center
·
Spacer
·
Separator
·
Card
·
Inset
·
Aspect Ratio
·
Fragment
Typografie
·
Text
·
Heading
·
Link
·
Code
·
Markdown
·
Blockquote
·
Quote
·
Strong
·
Em
·
Kbd
Formulare
·
Button
·
Input
·
Text Area
·
Checkbox
·
Switch
·
Radio Group
·
Select
·
Slider
·
Form
·
Upload
Datenanzeige
·
Badge
·
Avatar
·
Icon
·
Callout
·
List
·
Data List
·
Code Block
·
Progress
·
Spinner
·
Scroll Area
·
Moment
Auf- und Zuklappen
·
Tabs
·
Accordion
·
Segmented Control
Overlays
·
Tooltip
·
Popover
·
Hover Card
·
Dialog
·
Alert Dialog
·
Drawer
·
Dropdown Menu
·
Context Menu
·
Toast
Dynamisches Rendern
·
Cond
·
Match
·
Foreach
·
Auto Scroll
Medien
·
Image
·
Audio
·
Video
Tabellen und Datengrids
·
Table
·
Data Table
·
Data Editor
Diagramme
·
Area Chart
·
Bar Chart
·
Line Chart
·
Composed Chart
·
Pie Chart
·
Radar Chart
·
Radial Bar Chart
·
Scatter Chart
·
Funnel Chart
·
Treemap
·
Sankey Chart
·
Error Bar
Diagrammbausteine
·
Axis
·
Cartesian Grid
·
Chart Tooltip
·
Legend
·
Label
·
Reference
·
Brush
Andere Diagrammbibliotheken
·
Plotly
·
Pyplot
HTML-Elemente
·
HTML
·
HTML Text
·
HTML Layout
·
HTML Forms
·
HTML Media
·
HTML Tables
·
SVG
Weitere Werkzeuge
·
Theme
·
Skeleton
·
Clipboard
·
Html Embed
·
Script
·
Memo
rx.el.addressrx.el.articlerx.el.asiderx.el.blockquoterx.el.bodyrx.el.ddrx.el.del_rx.el.detailsrx.el.dialogrx.el.dlrx.el.dtrx.el.figcaptionrx.el.footerrx.el.h1 ~ h6rx.el.headrx.el.headerrx.el.hrrx.el.htmlrx.el.lirx.el.linkrx.el.mainrx.el.navrx.el.noscriptrx.el.olrx.el.portalrx.el.prerx.el.scriptrx.el.sectionrx.el.templaterx.el.titlerx.el.ulOffizielle Doku
Werkstattauftrag
Bitte bau einen Beitrag mit Neuigkeiten aus dem Laden als sinnvolle HTML-Struktur auf: Kopf, Haupttext, Tipp am Rand, aufklappbare Frage und Fußzeile mit Kontakt.
Diese HTML-Elemente übernehmen Struktur und Anordnung eines Dokuments. Dazu gehören Elemente, die Bereiche benennen, wie header·main·footer, die Überschriften h1 bis h6, die Listen ul·ol·dl und das aufklappbare details.
Dasselbe Aussehen bekämst du auch mit div, aber mit bedeutungstragenden Elementen verstehen Screenreader und Suchmaschinen den Aufbau der Seite.
Mon to Fri, 9 am to 6 pm.
rx.el.article(
rx.el.header(rx.el.h2("Opening hours", font_weight="bold")),
rx.el.p("Mon to Fri, 9 am to 6 pm."),
rx.el.footer("Updated today", font_size="12px", color="gray"),
padding="12px",
border="1px solid gray",
border_radius="8px",
)Strukturelemente haben meist nur gemeinsame Attribute. Probier die beiden mit eigenen Attributen aus: ol (reversed) und details (open).
Auf dieser Seite entfernt Tailwind preflight die Listenzeichen, sie kommen per CSS list_style_type zurück.
Props ausprobieren
Shown when the details element is open.
reversed
marker
summary
open
rx.el.div(
rx.el.ol(
rx.el.li("Mix"),
rx.el.li("Bake"),
rx.el.li("Serve"),
reversed=False,
list_style_type="decimal",
padding_left="2em",
),
rx.el.details(
rx.el.summary("More info", cursor="pointer"),
rx.el.p("Shown when the details element is open."),
open=False,
),
)| Prop | Werte | Standard | Verwendung |
|---|---|---|---|
start (ol) | Ganzzahl | 1 | Erste Nummer |
reversed (ol) | True / False | False | Rückwärts nummerieren |
type (ol) | "1" "a" "A" "i" "I" | "1" | Nummerierungsart. Mit preflight übernimmt CSS list_style_type |
open (details, dialog) | True / False | False | Aufgeklappt · geöffnet |
cite (blockquote, del_) | URL | keiner | Quelle von Zitat · Änderung |
date_time (del_) | Datums-String | keiner | Zeitpunkt der Löschung |
rel href … (link) | String | keiner | Externe Ressourcen einbinden (für den Dokumentkopf) |
async_ defer src … (script) | bool · String | keiner | Script-Tag (siehe Seite Script) |
header ist der Kopf, nav das Navigationsmenü, main der Hauptinhalt, article ein Text, der auch für sich allein verständlich ist, aside eine Randnotiz, section eine thematische Gruppe, footer der Fuß und address die Kontaktangabe.
Alle sind ungestylte Boxen; die Anordnung legst du per CSS wie display="grid"·"flex" fest.
The main story goes here.
A themed section of the page.
rx.el.div(
rx.el.header(
rx.el.strong("Workshop"),
rx.el.nav(rx.el.span("Home"), rx.el.span("Parts"), rx.el.span("About"), display="flex", gap="12px"),
display="flex",
justify_content="space-between",
padding="8px",
background=rx.color("indigo", 3),
),
rx.el.main(
rx.el.article(rx.el.h3("Post title", font_weight="bold"), rx.el.p("The main story goes here.")),
rx.el.aside("Related links", padding="8px", background=rx.color("gray", 3)),
display="grid",
grid_template_columns="2fr 1fr",
gap="12px",
padding="8px",
),
rx.el.section(rx.el.p("A themed section of the page."), padding="8px", border_top="1px dashed gray"),
rx.el.footer(rx.el.address("hello@example.com"), padding="8px", font_size="13px", color="gray"),
border="1px solid gray",
border_radius="8px",
overflow="hidden",
)Wegen preflight erscheinen h1 und h3 so groß wie der Fließtext. Eine Überschrift ist Bedeutung; die Größe setzt du separat mit font_size.
hr ist eine Linie für einen Themenwechsel, blockquote ein langes Zitat (Quelle in cite), pre Text, der Leerzeichen und Zeilenumbrüche exakt beibehält.
Das Element del kollidiert mit einem Python-Schlüsselwort und heißt in Reflex deshalb rx.el.del_ (in der Liste der offiziellen Doku steht rx.el.Del). Das Gegenstück rx.el.ins markiert neu eingefügten Text.
Make it work, make it right, make it fast.
def hello():
print('hi')Price: $20 $15
rx.el.div(
rx.el.h1("h1 with no style"),
rx.el.h3("h3 with no style"),
rx.el.h2("h2 with style", font_size="24px", font_weight="bold"),
rx.el.hr(margin_y="8px"),
rx.el.blockquote(
"Make it work, make it right, make it fast.",
cite="https://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast",
border_left="4px solid gray",
padding_left="12px",
font_style="italic",
),
rx.el.pre("def hello():\n print('hi')", padding="8px", background=rx.color("gray", 3)),
rx.el.p("Price: ", rx.el.del_("$20", date_time="2026-10-01"), " ", rx.el.ins("$15")),
)ul ist eine ungeordnete Liste, ol eine nummerierte, die Einträge sind li. dl ist eine Beschreibungsliste, die Paare aus Begriff (dt) und Beschreibung (dd) aufreiht.
rx.el.div(
rx.el.ul(rx.el.li("Apples"), rx.el.li("Pears"), list_style_type="disc", padding_left="1.5em"),
rx.el.ol(rx.el.li("Third"), rx.el.li("Fourth"), start=3, list_style_type="decimal", padding_left="1.5em"),
rx.el.dl(
rx.el.dt("Box", font_weight="bold"),
rx.el.dd("A container with no meaning.", margin_left="1.5em"),
rx.el.dt("Flex", font_weight="bold"),
rx.el.dd("A row or column of children.", margin_left="1.5em"),
),
display="flex",
gap="24px",
flex_wrap="wrap",
)Das erste summary in details wird zum Titel, und beim Klick klappt der Browser selbstständig auf und zu. Einen State braucht es nicht.
dialog öffnest du über das Attribut open. So geöffnet ist es ein nicht-modales Fenster, das den Hintergrund nicht sperrt; für einen modalen Dialog, der den Bildschirm überdeckt, ist rx.dialog einfacher.
A box the browser opens and closes by itself.
class HtmlLayoutDialogState(rx.State):
is_open: bool = False
@rx.event
def toggle(self):
self.is_open = not self.is_open
rx.el.div(
rx.el.details(
rx.el.summary("What is details?", cursor="pointer"),
rx.el.p("A box the browser opens and closes by itself."),
),
rx.el.button(
"Toggle dialog",
on_click=HtmlLayoutDialogState.toggle,
padding="4px 12px",
border="1px solid gray",
border_radius="6px",
margin_top="12px",
),
rx.el.dialog(
rx.el.p("A non-modal dialog, opened by the open prop."),
open=HtmlLayoutDialogState.is_open,
padding="12px",
border="1px solid gray",
border_radius="8px",
top="40px",
),
position="relative",
min_height="150px",
)figcaption beschriftet innerhalb von figure Inhalte wie Bilder, Tabellen oder Code.
rx.el.figure(
rx.el.img(src="https://picsum.photos/id/1080/320/160", alt="Strawberries", border_radius="6px"),
rx.el.figcaption("Fig. 1 - Fresh strawberries", font_size="13px", color="gray", margin_top="4px"),
width="320px",
)Der Inhalt von template wird nicht gezeichnet, sondern bleibt nur als Vorlage zum Klonen bestehen. noscript erscheint nur in Browsern mit abgeschaltetem JavaScript. Reflex-Apps laufen mit JavaScript, hier ist es also nicht zu sehen.
Only this line is visible.
rx.el.div(
rx.el.p("Only this line is visible."),
# rx.el.template(...) also keeps its content off the page, but React cannot
# hydrate children inside <template>, so it is left out of this live example.
rx.el.noscript("Please turn on JavaScript."),
)html, head, body, title, link, script und portal sind Elemente für das ganze Dokument oder dessen Kopf. Reflex baut dieses Gerüst bereits, deshalb nutzt man sie innerhalb einer Seite kaum, und auch hier stehen sie nur als Code.
React 19 hebt title·link aus dem Body in den Dokumentkopf; würden sie auf der Seite gerendert, änderte sich der Tab-Titel dieser Website.
# Document-level and head elements: Reflex already renders these, so pages rarely use them
rx.el.html(...) # manifest attribute (removed in HTML5)
rx.el.head(...)
rx.el.body(...)
rx.el.title("Page title") # set page titles with @rx.page(title=...)
rx.el.link(rel="stylesheet", href="/styles.css") # add stylesheets with rx.App(stylesheets=[...])
rx.el.script(src="/my-script.js") # use rx.script for scripts (see the Script page)
rx.el.portal(...) # experimental element that never became a standardDer ganze Beitrag ist ein article, Titel und Datum stehen im header, der Haupttext in einer section, der Tipp im aside, die Frage in details und der Kontakt in einer address im footer.
Three new dishes join the menu this week.
Yes, the soup and rolls are vegan.
rx.el.article(
rx.el.header(
rx.el.h1("Spring menu is here", font_size="22px", font_weight="bold"),
rx.el.p(rx.el.time("Mar 3, 2026", date_time="2026-03-03"), font_size="13px", color="gray"),
),
rx.el.section(
rx.el.p("Three new dishes join the menu this week."),
rx.el.ul(rx.el.li("Spring rolls"), rx.el.li("Pea soup"), rx.el.li("Lemon tart"), list_style_type="disc", padding_left="1.5em"),
margin_y="8px",
),
rx.el.aside("Tip: book a table early.", padding="8px", background=rx.color("amber", 3), border_radius="6px"),
rx.el.details(
rx.el.summary("Do you have vegan options?", cursor="pointer", font_weight="600"),
rx.el.p("Yes, the soup and rolls are vegan."),
margin_y="8px",
),
rx.el.hr(),
rx.el.footer(rx.el.address("12 Market St · hello@example.com"), font_size="13px", color="gray", margin_top="8px"),
padding="16px",
border="1px solid gray",
border_radius="10px",
max_width="420px",
)Werkstattnotizen
header · nav · main · article · section · aside · footer benennen Bereiche. Anordnung per CSS.
h1 bis h6 sind nur Bedeutung. Unter preflight legst du die Größe mit font_size fest.
ul · ol · li, dl · dt · dd. Listenzeichen per list_style_type, ol mit start · reversed.
details + summary klappen ohne State auf. dialog mit open ist nicht-modal, modal geht mit rx.dialog.
del heißt rx.el.del_. html · head · body · title · link übernimmt Reflex, auf der Seite nicht verwenden.
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
R
ReflexKR
Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.
ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee
Hinweis zu Affiliate-Links© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.