vertical-align: middle失效是因为td的display被破坏为非table-cell,需检查全局CSS、templet、媒体查询或第三方样式;修复后通过cellStyle返回{'vertical-align':'middle'}对象或列style字符串实现居中。
为什么vertical-align: middle突然不生效了
不是 layui 没写对齐,而是你无意中破坏了它起效的前提:td 必须是 display: table-cell。常见破坏点包括:
• 全局 css 里写了 td { display: block } 或 flex
• 列配置用了 templet 返回一个 <div>(默认 <code>display: block,撑高单元格但不继承对齐)
• 媒体查询在响应式断点下改了 td 的 display 值
• 第三方 ui 库注入重置样式,覆盖了 .layui-table td 的原始声明
验证方法:打开开发者工具,选中目标 <td>,看 computed 面板里的 <code>display 是否仍是 table-cell。不是?先修这个。
cellStyle 是唯一可控入口,但写法必须严格
layui 不提供列级 vertical-align 配置项,所有单元格级垂直对齐都得靠 cellStyle 函数返回内联样式。关键细节:
• 必须返回对象,不能 return 'vertical-align: top' 字符串
• 属性名是 'vertical-align'(带短横线),不是 verticalAlign 或 VerticalAlign
• 值必须是字符串:{'vertical-align': 'middle'},不是 {verticalAlign: 'middle'}
• 每列都要显式声明 cellStyle,否则继承表格默认(即 middle)
• 不要 return null 或空对象 {},layui 会忽略
用 cols.style 实现单列居中(最稳妥)
在列定义里加 style 是最干净的做法,不影响其他列,也不依赖全局样式污染:
• 示例:让「用户名」列文字上下左右居中:{field:'username', title:'用户名', style:'text-align: center; vertical-align: middle;'}
• style 值必须是字符串,不能写对象
• vertical-align: middle 只对 td 生效,对 th 无效(表头需另加)
• 如果列启用了 toolbar 或 checkbox,这些内置元素的对齐不受该 style 影响,得单独处理
遇到 templet 渲染组件时居中失效怎么办
当单元格里用 templet 渲染 Vue 组件、按钮或下拉框时,vertical-align: middle 通常不起作用——因为子元素是 inline-block 或 flex 容器,自身有默认基线。解决办法不是调父级 td,而是控制子元素:
• 推荐用 flex:templet: function(d) { return '<div style="display: flex; align-items: center; justify-content: center; height: 100%;"><el-button size="mini">操作</el-button></div>'; }
• 不要只设 height: 100%,必须配合 display: flex 和 align-items: center
• 若组件本身高度不可控(如异步加载的弹窗按钮),建议加 min-height 或固定行高避免塌陷
td 的 display 值是否还是 table-cell。











