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

Vaadin 24:如何实现含可滚动Accordion列的HorizontalLayout?

Vaadin 24 布局问题解决:Accordion 内部滚动不生效

问题核心:Scroller 未生效是因为没有给它设置明确的高度限制,导致它随内容自动扩展,进而触发窗口级滚动。需要给详情列的 Scroller 绑定和表格区域一致的高度(即 100vh - navbarHeight),同时确保 Accordion 占满 Scroller 的可用空间。

解决步骤

  • 给详情列设置固定高度约束,和表格区域保持一致,使用 CSS 计算值绑定高度
  • 让 Accordion 占满 Scroller 的高度,确保内容超出时触发内部滚动
  • 优化表格容器的布局,移除不必要的内边距避免高度溢出

修改后的代码

// 假设 navbarHeight 是已定义的变量,比如 60px
String navbarHeight = "60px";

var grid = new Grid<>(Pojo.class, false);

// 表格容器:设置高度为视口高度减去导航栏高度,移除默认内边距避免溢出
var tableBox = new VerticalLayout(grid);
tableBox.setHeight("calc(100vh - " + navbarHeight + ")");
tableBox.setPadding(false);
tableBox.setSpacing(false);

var accordion = new Accordion();
accordion.setWidthFull();
accordion.setHeightFull(); // 关键:让Accordion占满Scroller的高度

// 详情列容器:设置固定宽度和与表格一致的高度,启用垂直滚动
var detailsBox = new Scroller(accordion);
detailsBox.setScrollDirection(Scroller.ScrollDirection.VERTICAL);
detailsBox.setWidth("450px");
detailsBox.setHeight("calc(100vh - " + navbarHeight + ")");

var layout = new HorizontalLayout();
layout.add(tableBox);
layout.add(detailsBox);
layout.setFlexGrow(1, tableBox);
layout.setFlexGrow(0, detailsBox);
layout.setSizeFull();
layout.setPadding(false);
layout.setSpacing(false);

关键说明

  • calc(100vh - navbarHeight):确保表格和详情列都严格限制在导航栏下方的剩余视口高度内,不会超出
  • accordion.setHeightFull():让 Accordion 填充 Scroller 的全部高度,当面板内容超出时,Scroller 才会触发内部滚动
  • 移除布局的默认 padding/spacing:避免额外的空间占用导致高度溢出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:10