You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dash Loading组件:如何让加载动画在初始加载时显示在正确位置

解决Dash初始加载时Loading动画位置偏移的问题

初始加载时Loading动画跑到顶部,核心原因是承载图表的my_figure容器在没有内容的情况下没有高度,导致dcc.Loading的动画找不到正确的占位空间。后续切换选项时,容器因为之前渲染过图表已经有了高度,所以动画位置正常。

给你两种简单的解决方法:

方法一:给容器设置最小高度

直接给承载图表的dmc.Box添加最小高度样式,让容器在空状态下也能占据固定空间,Loading动画就会在容器内居中显示:

import time
import plotly.express as px
import dash_mantine_components as dmc
import dash
from dash import dcc, callback, Output, Input

dash.register_page(module=__name__)

layout = dmc.MantineProvider(
    children=[
        dmc.Select(
            id="dropdown",
            data=["bar", "scatter", "none"],
            value="bar",
        ),
        dcc.Loading(
            type="graph",
            # 添加最小高度样式,确保容器始终有占位
            children=dmc.Box(id="my_figure", style={"minHeight": "400px"})
        )
    ]
)


@callback(
    Output("my_figure", "children"),
    Input("dropdown", "value")
)
def show_fig(value):
    if value == "bar":
        time.sleep(5)
        return dcc.Graph(figure=px.bar())
    elif value == "scatter":
        time.sleep(5)
        return dcc.Graph(figure=px.scatter())
    else:
        return []

方法二:初始渲染空Graph占位

在布局里直接给my_figure添加一个空的dcc.Graph作为初始内容,利用Graph组件的默认高度让容器一开始就有正确的尺寸:

import time
import plotly.express as px
import dash_mantine_components as dmc
import dash
from dash import dcc, callback, Output, Input

dash.register_page(module=__name__)

layout = dmc.MantineProvider(
    children=[
        dmc.Select(
            id="dropdown",
            data=["bar", "scatter", "none"],
            value="bar",
        ),
        dcc.Loading(
            type="graph",
            # 初始放一个空Graph占位
            children=dmc.Box(id="my_figure", children=dcc.Graph())
        )
    ]
)


@callback(
    Output("my_figure", "children"),
    Input("dropdown", "value")
)
def show_fig(value):
    if value == "bar":
        time.sleep(5)
        return dcc.Graph(figure=px.bar())
    elif value == "scatter":
        time.sleep(5)
        return dcc.Graph(figure=px.scatter())
    else:
        return []

两种方法都能解决问题,你可以根据实际需求选择:方法一不用提前渲染Graph,更灵活;方法二的容器高度会和实际图表高度更匹配。

内容的提问来源于stack exchange,提问作者Free Palestine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:37:15