layui单选框只显示文字不显示圆圈的根本原因是layui.css隐藏原生radio并用伪元素模拟,若未正确执行form.render()或结构/配置错误则失效。

为什么 layui 单选框只显示文字、不显示圆圈
根本原因是 layui.css 默认隐藏了原生 <input type="radio">,靠伪元素模拟 UI。如果没触发渲染,就只剩裸标签——看着像普通文字,点不动也无反馈。
常见错误包括:漏掉 layui.use('form')、form.render() 没执行、或 DOM 插入后未重新渲染。
- 检查页面是否引入了
layui.css和layui.js,且顺序正确(CSS 在前,JS 在后) - 确认单选框 HTML 结构在
<form class="layui-form"></form>内部,否则 form 模块不接管 -
name属性必须一致(如name="sex"),否则 layui 认为不是一组,不统一渲染 - 不要手动加
display: block或visibility: visible覆盖 layui 样式——会破坏伪元素定位
form.render() 该在哪调、怎么调才生效
form.render() 不是“执行一次就万事大吉”,它只作用于当前已存在的 DOM 节点。动态插入的单选框(比如弹窗里异步加载的表单)必须在插入后立即调用。
- 静态页面:在
layui.use('form', function(){...})回调里调用form.render() - 动态内容(如 layer.open 弹层):等弹层 DOM 渲染完成(可用
success回调或setTimeout微任务),再执行form.render() - 只渲染单选框:用
form.render('radio'),比全量渲染更快,也避免干扰其它组件 - 若用了
layui.all.js,可直接写layui.form().render('radio'),无需use
初始化默认选中但圆圈仍不显示?检查这两点
即使写了 checked 属性,若没走 layui 渲染流程,圆圈也不会出现——因为真正显示的是伪元素,不是原生控件。
- HTML 中写
<input type="radio" name="sex" value="1" checked>是必要但不充分条件 - 必须确保
form.render('radio')在该 DOM 插入后执行,否则checked属性不会被识别为“已选中状态” - 如果用 JS 动态设置(如
$('input[value="1"]').prop('checked', true)),之后一定要补一句form.render('radio'),否则 UI 不同步
表格里的 type: 'radio' 列为啥也不出圆圈
table 的单选列和 form 表单是两套机制。table 的 type: 'radio' 不依赖 form 模块,但它有自己的硬性前提:
- 必须且只能有一列配置
type: 'radio',写两列或混用type: 'checkbox'会导致整个 radio 列渲染失败 - 该列需放在
cols数组靠前位置;若用了fixed: 'left',它得是第一个固定列,否则可能被遮挡 - 千万别在
templet里手写<input type="radio">——layui 会清空其checked属性,导致状态错乱 - 表格初始化后,若要默认选中某行,不能靠数据字段加
checked: true,得在done回调里调setRowChecked()或手动设lay-checked="true"属性再刷新
最常被忽略的是:table 的 radio 列失效时,控制台通常不报错,只是静默不渲染——得回头逐条核对配置是否满足“唯一性”和“位置要求”。











