layui tree 的 icon 属性支持三类值:字符串 Unicode(如"")、iconSkin 类名(需全局 CSS 定义 ::before)、或留空由 layui 自动推导;icon 优先级高于 iconSkin,推荐用 iconSkin 配合 iconfont 实现可控图标。
layui tree 的 icon 属性到底支持哪些值
layui 的 tree 组件默认用 unicode 字符(如 )渲染图标,但文档没说清哪些能直接填、哪些必须配合 css。实际只认三类:icon 填字符串(如 "")、iconskin 填 class 名(如 "custom-folder")、或者留空让 layui 自动根据 spread 和层级推导。填错会显示方块或空白,不是报错——这点容易误判为代码没生效。
-
icon必须是合法 HTML 实体或纯文本字符,不能写成"fa-folder"这种 Font Awesome 类名 -
iconSkin对应的 class 必须在全局 CSS 里定义,且要带::before伪元素和content - 如果节点数据里同时有
icon和iconSkin,icon优先级更高,会覆盖后者
用 iconSkin 加载自定义字体图标(比如 iconfont)
这是最可控的方式:不碰 layui 内部 Unicode 映射,靠 CSS 注入。关键在两步——先注册字体,再绑定伪元素。很多人漏掉 @font-face 或写错 font-family 名,导致图标不显示但控制台无报错。
- 确保 iconfont 的
font-family和 CSS 中iconSkin的 class 定义一致,例如:.custom-file::before { content: "\e60a"; font-family: "iconfont" !important; } - layui 渲染时会给节点加
layui-tree-icon类,所以自定义 class 要比它权重高,建议加!important - 注意路径问题:如果 iconfont 的
.woff文件放在/static/fonts/,CSS 里的url()必须写对相对路径,否则字体加载失败
动态节点下 icon 不更新的常见原因
树节点通过 tree.setChecked 或重新渲染数据后,图标没变,不是 bug,是 layui 默认不重绘 icon——它只在初始渲染时读一次 icon 或 iconSkin 字段。
- 手动触发重绘:调用
tree.render()并传入完整新数据,不能只改单个节点的icon字段再setData - 如果用
tree.updateNode(id, { icon: "" }),必须确保第二个参数包含全部需要更新的字段,layui 不做 diff 合并 - 异步加载子节点时(
isAsync: true),返回的数据里必须显式带上icon或iconSkin,父节点的配置不会继承
兼容性与性能提醒
IE11 下 iconSkin 的 ::before 如果用了 SVG data URI,可能渲染异常;移动端 Safari 对某些 Unicode 字符支持不稳定。别为了省事全用 icon 字符串,复杂项目建议统一走 iconSkin + 字体图标方案。
- 避免在每个节点数据里重复写长 Unicode,比如
"",既难维护又增大 JSON 体积 - 如果树节点超 500 个,用
iconSkin比内联icon更快,因为浏览器只需解析一次字体文件 - layui 2.8+ 开始支持
iconHtml(自定义 HTML 片段),但仅限基础版,Pro 版才开放,别在社区版里瞎试
真正卡住人的,往往是字体文件路径不对、CSS 选择器权重不够、或者以为改了数据就自动刷新图标——其实得主动 render。











