R

ReflexKR

Reflex-Dokumentation

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

Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine
Dynamisches Rendern

Auto Scroll

rx.auto_scroll

Offizielle 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.

Initial message
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.

Props ausprobieren

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",
)
Standardmäßig ist overflow="auto" gesetzt, Inhalt jenseits der Höhe scrollt also innerhalb der Box.
PropWerteStandardVerwendung
heightCSS-LängekeinerHöhe der Scrollbox. Ohne sie wächst die Box mit dem Inhalt und scrollt nie
widthCSS-LängekeinerBreite
overflowCSS-Wert"auto"Umgang mit überlaufendem Inhalt. Standard ist Scrollen
padding, border, border_radiusCSS-WertkeinerInnenabstand, Rahmen, Ecken
idStringautomatischOhne Angabe wird automatisch eine eindeutige id vergeben
Weitere div-Attributetitle, role, on_click …Wie bei rx.el.div

Wofür

  • Chat: Das Gesprächsfenster zeigt immer die neueste Nachricht.
  • Log-Ansicht: Bei neuen Logzeilen scrollt sie mit.
  • Feed: In einer ständig aktualisierten Liste bleibt Neues sichtbar.

Funktionsweise

Wenn Inhalt hinzukommt, scrollt die Box nur in diesen zwei Fällen nach unten:

  1. Der Nutzer ist schon nahe am unteren Ende (innerhalb von 50 Pixeln).
  2. Vorher gab es keine Scrollleiste, und durch den neuen Inhalt entsteht eine.

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",
)

Auftrag erledigt

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.

Hi! Ask me about your order.
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.

← Zurück

Dynamisches Rendern · Foreach

Weiter →

Medien · Image

Über neue Lektionen informiert werden

Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.

Erhoben: deine E-Mail-Adresse · Zweck: Hinweise auf neue Lektionen oder den Start dieses Kurses · Speicherdauer: bis du die Löschung verlangst. Keine andere Nutzung, keine Weitergabe. Antworte einfach auf eine Benachrichtigung, dann löschen wir sie sofort.

Fragen & Antworten

Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.

Wird als reiner Text angezeigt, ohne Links oder Formatierung.

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
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex