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.auto_scrollOffizielle Doku
Werkstattauftrag
Bitte baue ein Kundensupport-Chatfenster. Bei neuen Nachrichten soll es nach unten mitscrollen, aber nicht nach unten ziehen, wenn jemand gerade hochgescrollt hat, um ältere Nachrichten zu lesen.
rx.auto_scroll ist eine Box (div), die automatisch ganz nach unten scrollt, wenn neuer Inhalt hinzukommt. Du nimmst sie für Inhalte, die sich unten immer weiter stapeln, wie Chats, Logs oder Feeds, damit das Neueste stets sichtbar bleibt. Code für die Scrollposition musst du nicht selbst schreiben.
class AutoScrollBasicState(rx.State):
messages: list[str] = ["Initial message"]
count: int = 1
@rx.event
def add_message(self):
self.count += 1
self.messages = (self.messages + [f"New message #{self.count}"])[-50:]
rx.vstack(
rx.auto_scroll(
rx.foreach(
AutoScrollBasicState.messages,
lambda message: rx.box(
message,
padding="0.5em",
border_bottom=f"1px solid {rx.color('gray', 4)}",
width="100%",
),
),
height="200px",
width="300px",
border=f"1px solid {rx.color('gray', 6)}",
border_radius="8px",
),
rx.button("Add Message", on_click=AutoScrollBasicState.add_message),
width="300px",
align_items="center",
)Bei jedem Klick auf Add Message kommt eine Nachricht dazu, und sobald die Box überläuft, scrollt sie von selbst nach unten, damit die neue Nachricht sichtbar ist.
rx.auto_scroll basiert auf rx.el.div und nimmt alle Attribute und Stile eines div. Da es eine Scrollbox ist, zählt height am meisten. Die Box unten enthält zwanzig Zeilen, und von Anfang an ist die letzte (Line 20) zu sehen. Auch wenn du die Höhe verringerst, bis sie überläuft, bleibt das untere Ende sichtbar.
Props ausprobieren
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
Line 12
Line 13
Line 14
Line 15
Line 16
Line 17
Line 18
Line 19
Line 20
height
padding
radius
rx.auto_scroll(
*[rx.text("Line " + str(i), size="2") for i in range(1, 21)],
height="160px",
padding="8px",
border_radius="8px",
border=f"1px solid {rx.color('gray', 6)}",
width="260px",
)| Prop | Werte | Standard | Verwendung |
|---|---|---|---|
height | CSS-Länge | keiner | Höhe der Scrollbox. Ohne sie wächst die Box mit dem Inhalt und scrollt nie |
width | CSS-Länge | keiner | Breite |
overflow | CSS-Wert | "auto" | Umgang mit überlaufendem Inhalt. Standard ist Scrollen |
padding, border, border_radius | CSS-Wert | keiner | Innenabstand, Rahmen, Ecken |
id | String | automatisch | Ohne Angabe wird automatisch eine eindeutige id vergeben |
| Weitere div-Attribute | title, role, on_click … | Wie bei rx.el.div |
Wenn Inhalt hinzukommt, scrollt die Box nur in diesen zwei Fällen nach unten:
Wer also hochgescrollt hat, um Älteres zu lesen, wird nicht zwangsweise nach unten gezogen. Scroll in der Log-Box unten nach oben und klick dann auf Add 10: Die Position bleibt. Scrollst du wieder ganz nach unten und klickst, scrollt sie mit.
import random
class AutoScrollLogState(rx.State):
lines: list[str] = []
count: int = 0
@rx.event
def add(self, n: int):
levels = ["INFO", "INFO", "INFO", "WARN", "ERROR"]
new = []
for _ in range(n):
self.count += 1
new.append(f"{self.count:04d} {random.choice(levels)} request handled")
self.lines = (self.lines + new)[-100:]
@rx.event
def clear(self):
self.lines = []
self.count = 0
rx.vstack(
rx.auto_scroll(
rx.foreach(AutoScrollLogState.lines, lambda line: rx.text(line, size="1", font_family="var(--code-font-family)")),
height="160px",
width="100%",
padding="8px 10px",
background=rx.color("gray", 2),
border=f"1px solid {rx.color('gray', 6)}",
border_radius="8px",
),
rx.hstack(
rx.button("Add 1", on_click=AutoScrollLogState.add(1), size="1"),
rx.button("Add 10", on_click=AutoScrollLogState.add(10), size="1", variant="soft"),
rx.button("Clear", on_click=AutoScrollLogState.clear, size="1", variant="soft", color_scheme="gray"),
),
width="100%",
max_width="420px",
)rx.auto_scroll bekommt display="flex" und flex_direction="column", damit die Sprechblasen untereinander stehen, und rx.cond wechselt je nach Absender Ausrichtung und Farbe. Beim Senden kommen die eigene Nachricht und die Antwort zusammen dazu, und das Fenster scrollt mit. Liest jemand gerade weiter oben, bleibt es, wo es ist.
class AutoScrollChatState(rx.State):
messages: list[dict[str, str]] = [{"who": "bot", "text": "Hi! Ask me about your order."}]
@rx.event
def send(self, form_data: dict):
text = form_data.get("text", "").strip()[:200]
if not text:
return
reply = {"who": "bot", "text": f"Got it: {text}"}
self.messages = (self.messages + [{"who": "me", "text": text}, reply])[-40:]
rx.vstack(
rx.auto_scroll(
rx.foreach(
AutoScrollChatState.messages,
lambda m: rx.flex(
rx.box(
m["text"],
padding="6px 10px",
border_radius="12px",
max_width="80%",
background=rx.cond(m["who"] == "me", rx.color("indigo", 9), rx.color("gray", 4)),
color=rx.cond(m["who"] == "me", "white", rx.color("gray", 12)),
),
justify=rx.cond(m["who"] == "me", "end", "start"),
width="100%",
),
),
display="flex",
flex_direction="column",
gap="6px",
height="240px",
width="100%",
padding="10px",
border=f"1px solid {rx.color('gray', 6)}",
border_radius="10px",
),
rx.form(
rx.hstack(
rx.input(name="text", placeholder="Type a message", flex="1", auto_complete=False),
rx.button(rx.icon("send", size=16), type="submit", aria_label="Send"),
width="100%",
),
on_submit=AutoScrollChatState.send,
reset_on_submit=True,
width="100%",
),
width="100%",
max_width="360px",
)Werkstattnotizen
rx.auto_scroll(...) ist ein div, das bei neuem Inhalt nach unten mitscrollt.
height unbedingt setzen. overflow="auto" ist schon voreingestellt.
Scrollt nur, wenn man nahe am Ende ist (50px) oder gerade eine Scrollleiste entsteht.
Wer zum Lesen hochgescrollt hat, wird nicht heruntergezogen. Ideal für Chats · Logs · Feeds.
Ü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.