コンポーネント工房:Reflexライブラリ100
·
講座の概要
レイアウト
·
Box
·
Flex
·
Stack
·
Grid
·
Container
·
Section
·
Center
·
Spacer
·
Separator
·
Card
·
Inset
·
Aspect Ratio
·
Fragment
タイポグラフィ
·
Text
·
Heading
·
Link
·
Code
·
Markdown
·
Blockquote
·
Quote
·
Strong
·
Em
·
Kbd
フォーム
·
Button
·
Input
·
Text Area
·
Checkbox
·
Switch
·
Radio Group
·
Select
·
Slider
·
Form
·
Upload
データ表示
·
Badge
·
Avatar
·
Icon
·
Callout
·
List
·
Data List
·
Code Block
·
Progress
·
Spinner
·
Scroll Area
·
Moment
開閉と切り替え
·
Tabs
·
Accordion
·
Segmented Control
オーバーレイ
·
Tooltip
·
Popover
·
Hover Card
·
Dialog
·
Alert Dialog
·
Drawer
·
Dropdown Menu
·
Context Menu
·
Toast
動的レンダリング
·
Cond
·
Match
·
Foreach
·
Auto Scroll
メディア
·
Image
·
Audio
·
Video
表とデータグリッド
·
Table
·
Data Table
·
Data Editor
チャート
·
Area Chart
·
Bar Chart
·
Line Chart
·
Composed Chart
·
Pie Chart
·
Radar Chart
·
Radial Bar Chart
·
Scatter Chart
·
Funnel Chart
·
Treemap
·
Sankey Chart
·
Error Bar
チャートの部品
·
Axis
·
Cartesian Grid
·
Chart Tooltip
·
Legend
·
Label
·
Reference
·
Brush
ほかのチャートライブラリ
·
Plotly
·
Pyplot
HTML要素
·
HTML
·
HTML Text
·
HTML Layout
·
HTML Forms
·
HTML Media
·
HTML Tables
·
SVG
そのほかの道具
·
Theme
·
Skeleton
·
Clipboard
·
Html Embed
·
Script
·
Memo
rx.auto_scroll公式ドキュメント
工房の注文書
カスタマーサポートのチャット画面を作ってください。新しいメッセージが来たら一番下までついて行き、上にスクロールして過去の会話を読んでいるときは引き下ろさないようにしてください。
rx.auto_scrollは、新しい内容が加わると自動で一番下までスクロールするボックス(div)です。チャット、ログ、フィードのように下へどんどん積み重なる内容で、常に最新のものを見せたいときに使います。スクロール位置を扱うコードを自分で書く必要はありません。
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",
)Add Message を押すたびにメッセージが加わり、ボックスからあふれ始めると、新しいメッセージが見えるように自動で下がります。
rx.auto_scrollはrx.el.divをもとにしているので、div のプロパティとスタイルをすべて受け取ります。スクロールするボックスなので、いちばん大事なのはheightです。下のボックスには20行入っていますが、最初から最後の行(Line 20)が見えています。高さを縮めてあふれさせても、下のほうが見えたままになります。
プロパティを変えてみる
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",
)| プロパティ | 値 | 既定値 | 用途 |
|---|---|---|---|
height | CSS の長さ | なし | スクロールするボックスの高さ。ないと内容の分だけ伸びてスクロールが生まれない |
width | CSS の長さ | なし | 幅 |
overflow | CSS の値 | "auto" | あふれた内容の扱い。既定はスクロール |
padding, border, border_radius | CSS の値 | なし | 内側の余白、枠線、角の丸み |
id | 文字列 | 自動 | 指定しなければ一意の id が自動で付く |
| そのほかの div のプロパティ | title, role, on_click … | rx.el.divと同じ |
内容が加わったとき、次の2つの場合にだけ一番下まで下がります。
そのため、ユーザーが上にスクロールして過去の内容を読んでいる間は、無理に引き下ろしません。下のログのボックスを上にスクロールしたまま Add 10 を押してみてください。位置はそのままです。一番下まで戻してから押すと、ついて下がります。
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にdisplay="flex"とflex_direction="column"を渡して吹き出しを縦に積み、送信者によってrx.condで配置と色を変えます。メッセージを送ると自分の発言と返事が一緒に加わり、画面がついて下がります。上にスクロールして読んでいるときはそのままにします。
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",
)工房ノート
rx.auto_scroll(...) は新しい内容ができると一番下までついて行く div。
height は必ず渡す。overflow="auto" は既定で設定されている。
一番下の近く(50px)にいるとき、またはスクロールバーが新しくできたときだけ下がる。
上にスクロールして読んでいるユーザーは引き下ろさない。チャット・ログ・フィードに向いている。
新しい授業・講座のお知らせを受け取る
この講座に授業が追加されたり、続きの講座が公開されたりしたらメールでお知らせします。
R
ReflexKR
触って学ぶPythonとReflex。すべての例はReflex 0.10.0で実際に動かして確認しています。
ReflexKRはバナー広告なし・無料で運営しています。役に立ったら、コーヒー一杯で応援してください。 ☕ コーヒーで応援する
アフィリエイトと支援について© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
質問と回答
この回について気になることを書き込んでください。すべての言語のページの質問がここに集まります。