在前端开发中,单选按钮(Radio Button)是表单交互中常见的组件,但原生单选按钮的样式往往单调,难以满足现代UI设计的需求。今天,我们将通过纯原生的HTML、CSS和JavaScript,打造一个美观、实用的自定义单选按钮组件,代码简洁,适合初学者上手,也为进阶开发者提供灵感!
为什么要自定义单选按钮?
原生的<input type="radio">
样式受限于浏览器默认设计,难以适配多样化的UI风格。自定义单选按钮的优势在于:
- 高度可定制:通过CSS实现个性化外观,完美融入设计。
- 交互流畅:结合JavaScript实现动态切换,提升用户体验。
- 跨浏览器一致性:避免浏览器间的样式差异,统一视觉效果。
下面,我们将基于一个实际案例,详细解析如何用纯原生方式实现自定义单选按钮。
实现思路
- HTML结构:使用
label
和span
搭建单选按钮的视觉结构,隐藏原生input
。 - CSS样式:通过类切换和伪元素实现选中与未选中状态的样式变化。
- JavaScript交互:监听点击事件,确保同一组内只有一个选项被选中。
代码详解
HTML结构
我们用div.radio-group
作为单选按钮组的容器,每个单选按钮由label.radio
和span
组成,span
负责展示按钮的视觉效果。原生input
被隐藏,样式和交互完全由CSS和JavaScript控制。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自定义单选按钮</title>
</head>
<body>
<div class="radio-group">
<label class="radio checked">
<span></span> 审核
</label>
<label class="radio">
<span></span> 未审核
</label>
</div>
<div class="radio-group">
<label class="radio checked">
<span></span> 男
</label>
<label class="radio">
<span></span> 女
</label>
</div>
</body>
</html>
CSS样式
CSS部分定义了单选按钮的视觉效果,包括默认、选中和禁用状态:
- 默认样式:
span
设置为20x20像素的圆形,灰色边框,模拟单选按钮外观。 - 选中样式:通过
.checked
类改变边框颜色,并用伪元素:after
添加蓝色圆点。 - 禁用样式:通过
.disabled
类降低透明度,禁用交互。
.radio-group {
margin-bottom: 30px;
}
.radio {
cursor: pointer;
user-select: none;
}
.radio input {
display: none;
}
.radio span {
display: inline-block;
width: 20px;
height: 20px;
line-height: 20px;
border: 1px solid #ccc;
border-radius: 50%;
cursor: pointer;
vertical-align: middle;
text-align: center;
}
.radio span:after {
display: block;
content: "";
}
.radio.checked {
color: rgb(0, 174, 255);
}
.radio.checked span {
border-color: rgb(0, 174, 255);
color: white;
text-align: center;
line-height: 1em;
}
.radio.checked span:after {
content: "●";
color: rgb(0, 174, 255);
}
.radio.disabled {
opacity: 0.5;
cursor: not-allowed;
}
JavaScript交互
JavaScript负责处理点击事件,确保同一组内只有一个按钮被选中:
- 获取所有
.radio
元素,绑定onclick
事件。 - 点击时,移除同组内所有按钮的
checked
类,仅为当前按钮添加checked
类。
var radioLis = document.getElementsByClassName('radio');
for (var i = 0; i < radioLis.length; i++) {
radioLis[i].onclick = function () {
var radio_group = this.parentNode;
var radioChilds = radio_group.children;
for (var i = 0; i < radioChilds.length; i++) {
radioChilds[i].className = 'radio';
}
this.className = 'radio checked';
};
}
优化建议
- 性能提升:对于大量单选按钮,可使用事件委托,将事件绑定到
radio-group
,减少监听器数量。 - 样式扩展:通过CSS变量支持动态主题切换,适配不同品牌风格。
- 代码复用:将JavaScript逻辑封装为函数,方便在多个页面调用。
应用场景
这种自定义单选按钮适用于:
- 表单选择(如状态筛选、性别选择)。
- 配置切换(如模式选择)。
- 简单的投票或问卷系统。
总结
通过纯原生的HTML、CSS和JavaScript,我们实现了一个简洁优雅的自定义单选按钮组件。代码简单易懂,样式灵活,交互流畅,非常适合快速集成到项目中。希望这个案例能为你的前端开发带来灵感,动手试试吧!
点个收藏,关注前端结城,一起用代码点亮前端世界!🚀