🪟 Streamlit オーバーレイ&コンテナ ― モーダル・ポップオーバー・タブ・折りたたみ

対象バージョン v1.58 | 最終更新 2026-06-19 | 更新確認の目安:毎月

最新の実バージョンはプレイグラウンドst.__version__ を表示)で常に確認できます。

このページでわかること

  • Streamlit でモーダル・ポップオーバー・タブ・折りたたみが関数だけで組めること
  • 各UIがどのバージョンから使えるか(Tierバッジで明記)
  • 同じUIを React で組む場合との使い分け
  • 実際に触れるプレイグラウンドと、ui-memo の対応ページへの導線

ウィジェット一覧

「重ねて見せる」オーバーレイ(dialogpopover)と、「まとめて整える」コンテナ(tabsexpandercolumnscontainer)。画面の情報量を制御するUIが、Streamlit では関数や with ブロックで完結する。導入バージョンの新しい順に紹介します。

st.dialog のモーダルダイアログ(開いた状態)

st.dialog

Tier A導入 v1.37〜新しめ

画面中央に開くモーダルダイアログ。@st.dialog("タイトル") で関数を装飾し、その関数を呼ぶと開く。中に入力やボタンを置けて、確認・フォーム・詳細表示に使う。v1.37 で GA

python
@st.dialog("確認")
def confirm():
    st.write("削除してよろしいですか?")
    if st.button("OK", type="primary"):
        st.rerun()

if st.button("削除"):
    confirm()

Reactとの比較:モーダルは React なら開閉state・フォーカストラップ・背景クリック制御を組む領域。Streamlit はデコレータ+関数呼び出しで完結する。

モーダル・ダイアログの実装比較を見る →
st.popover で開いた設定パネル

st.popover

Tier B導入 v1.32〜

トリガーボタンの近くに開く小さなパネル。with st.popover("ラベル"): の中に置いた要素が、クリックで開くパネルに表示される。軽い設定や補助操作に。v1.32 で追加

python
with st.popover("設定"):
    st.checkbox("通知")
    st.slider("音量", 0, 100, 60)

Reactとの比較:ポップオーバーは位置調整・外側クリック判定を組む領域。Streamlit は with ブロックで中身を書くだけ。

ネイティブ popover の実装を見る →
st.tabs のタブ切替

st.tabs

Tier C導入 初期〜

横並びのタブで内容を排他的に切り替えるコンテナ。st.tabs([...]) が返すタブオブジェクトに with で中身を書く。

python
t1, t2 = st.tabs(["概要", "詳細"])
with t1:
    st.write("概要")

Reactとの比較:タブUIは自前かライブラリ。Streamlit は配列を渡すだけで切替まで動く。

タブの実装比較を見る →
st.expander の折りたたみセクション(展開状態)

st.expander

Tier C導入 初期〜

クリックで開閉する折りたたみセクション。expanded=True で初期展開。長い補足や詳細を隠しておける。v1.58 で type="compact" も追加。

python
with st.expander("詳細を表示", expanded=True):
    st.write("中身")

Reactとの比較:アコーディオン的な開閉を1行で。

アコーディオンの実装比較を見る →
st.columns の横並びレイアウト

st.columns

Tier C導入 初期〜

横並びレイアウト。st.columns(3) で3等分、st.columns([2,1]) で比率指定。返ったカラムに要素を置く。

python
c1, c2, c3 = st.columns(3)
c1.metric("売上", "¥1.2M")

Reactとの比較:Flex / Grid で組む横並びレイアウトを、関数1つで。

st.container の枠付きコンテナ

st.container

Tier C導入 初期〜

要素をまとめる入れ物。border=True でカード状の枠が付く。関連する要素のグルーピングに。

python
with st.container(border=True):
    st.write("まとまり")

Reactとの比較:<div> でのグルーピングを with ブロックで。

Reactでやるなら(使い分けまとめ)

オーバーレイ・コンテナは、Streamlit の「重ね・まとめ」が関数や with ブロックで完結する手軽さが効く。モーダルやタブ、折りたたみを、開閉stateやフォーカス制御を意識せずに組める。

一方、公開プロダクトでアニメーション・フォーカストラップの細部・モバイルのジェスチャー・凝った配置まで作り込むなら、React のUIライブラリ(Radix UI / Headless UI 等)の自由度が要る。

目安は、社内ツール・ダッシュボードの画面整理なら Streamlit、作り込んだ公開UIなら React(公開Webが求めるSEO・デザイン制御・大量アクセスに Streamlit は構造的に弱く、逆に開発の速さで強いため)。Streamlit と React/Next.js の違いは Streamlit UI ガイド(総括) で詳しく解説。

この分野の深掘りは ui-memo のモーダルタブアコーディオンネイティブpopover比較ページへ。

※トレードオフ(参考):Streamlit のオーバーレイ・コンテナは手軽な反面、アニメーションや配置の作り込み、モバイル最適化は限定的。React は自由度が高い反面、同じUIを出すまでの実装量は多い。

AIプロンプトテンプレ

Streamlit でオーバーレイ・コンテナを使うときの、AIへの指示テンプレ。

確認ダイアログ

text
Streamlit で、削除ボタンを押すと st.dialog で確認モーダルを出し、
OK で実行・キャンセルで閉じる実装を書いて。

タブで画面分割

text
Streamlit で st.tabs を使って「概要」「詳細」「設定」の3タブに内容を分けて。

設定を popover に

text
Streamlit で、設定ボタンを押すと st.popover でパネルを開き、
チェックボックスとスライダーを表示する実装を書いて。

▶ 実際に触ってみる ― オーバーレイ&コンテナ(プレイグラウンド)

本物の Streamlit がブラウザで動く。常に最新の実行バージョンを表示。

よくある質問

st.dialog と st.popover はどう使い分けますか?

st.dialog は画面中央のモーダル(背景を覆う、重要な確認や入力向き)。st.popover はトリガー近くに開く小さなパネル(軽い設定や補助操作向き)です。

st.dialog はいつから使えますか?

v1.37 で GA になりました。@st.dialog デコレータで関数を装飾し、その関数を呼ぶと開きます。

expander と tabs はどう使い分けますか?

expander は縦に折りたたむ(任意で開閉)、tabs は横で排他的に切り替えます。隠しておきたいなら expander、並列に切り替えたいなら tabs です。

st.columns はモバイルで縦積みになりますか?

画面幅に応じて多少縮みますが、自動では縦積みになりません。モバイル重視なら、幅に応じて縦並びへ切り替える設計を別途検討します。