实现两个开关按钮的互斥切换(一个开启时另一个自动关闭)
发布时间 - 2025-12-30 00:00:00 点击率:次本文介绍如何使用 jquery 实现两个自定义样式开关按钮的互斥逻辑:当用户点击任一开关时,另一个自动关闭,确保两者始终处于相反状态。
在构建表单或配置面板时,常需实现“二选一”的开关控制逻辑——例如启用某功能时自动禁用另一功能。本教程将手把手带你完成一个双向互斥切换(exclusive toggle)效果:两个带 CSS 自定义样式的开关按钮,彼此状态严格对立(First Toggle 为 checked 时,Second Toggle 必须为 unchecked,反之亦然)。
✅ 核心思路
利用 jQuery 监听两个 的 click 事件,当任一被点击时,遍历所有目标开关 ID,将其余开关设为 checked = false。由于原生 checkbox 不具备“单选组”语义(name 属性对 type="checkbox" 无效),必须通过 JavaScript 显式控制。
?️ 完整实现代码
1. HTML 结构(保持语义清晰)
⚠️ 注意:已移除冗余 标签(原示例中每个 label 内有两个 ,仅需一个用于滑块),避免样式错位。
2. CSS 样式(精简优化版)
.switcher label {
padding: 0;
cursor: pointer
;
}
.switcher label input {
display: none; /* 隐藏原生 checkbox */
}
.switcher label * {
vertical-align: middle;
}
/* 滑块容器 */
.switcher label input + span {
position: relative;
display: inline-block;
width: 50px;
height: 26px;
background: #ff4d4d; /* 默认红色背景 */
border: 2px solid #ff4d4d;
border-radius: 50px;
transition: all 0.3s ease-in-out;
margin-right: 10px;
}
/* 滑块小圆点 */
.switcher label input + span small {
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 100%;
background: #fff;
border-radius: 50%;
transition: all 0.3s ease-in-out;
}
/* 选中状态:背景变绿,滑块右移 */
.switcher label input:checked + span {
background: #46c146;
border-color: #46c146;
}
.switcher label input:checked + span small {
left: 50%;
}3. jQuery 交互逻辑(简洁可靠)
✅ 优势说明:
- 使用 .prop('checked', false) 而非 .attr(),确保 DOM 状态与 JS 控制一致;
- 采用 $(document).ready() 确保 DOM 加载完成后再绑定事件;
- 支持未来扩展:只需向 toggleIds 数组添加新 ID 即可纳入互斥组。
? 注意事项
- ❌ 不要使用 type="radio" 替代:虽然 radio 天然互斥,但无法实现独立样式控制(尤其滑块动画),且 appearance: none 在部分浏览器中对 radio 支持不稳定;
- ✅ 若需初始状态(如默认第一个开启),直接在 HTML 中添加 checked 属性:;
- ? 兼容性:jQuery 3.3+ 支持 IE9+,如需纯 JS 方案,可用 addEventListener 替代(原理相同)。
通过以上三步,你即可获得一组视觉统一、逻辑严谨、体验流畅的互斥开关组件。此模式广泛适用于功能开关、主题切换、模式选择等场景,是前端交互设计中的经典实践。
# css
# javascript
# java
# jquery
# html
# js
# 前端
# ajax
# 浏览器
# app
# switch
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么使用artisan命令缓存配置和视图
油猴 教程,油猴搜脚本为什么会网页无法显示?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何快速查询域名建站关键信息?
Laravel如何使用.env文件管理环境变量?(最佳实践)
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何处理和验证JSON类型的数据库字段
Laravel如何使用查询构建器?(Query Builder高级用法)
bing浏览器学术搜索入口_bing学术文献检索地址
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
如何快速搭建高效WAP手机网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
Python并发异常传播_错误处理解析【教程】
北京网站制作的公司有哪些,北京白云观官方网站?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
长沙做网站要多少钱,长沙国安网络怎么样?
电商网站制作价格怎么算,网上拍卖流程以及规则?
香港服务器选型指南:免备案配置与高效建站方案解析
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
linux top下的 minerd 木马清除方法
Laravel怎么上传文件_Laravel图片上传及存储配置
Bootstrap CSS布局之列表
Laravel如何使用模型观察者?(Observer代码示例)
魔毅自助建站系统:模板定制与SEO优化一键生成指南
三星、SK海力士获美批准:可向中国出口芯片制造设备
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何快速搭建安全的FTP站点?
java中使用zxing批量生成二维码立牌
昵图网官方站入口 昵图网素材图库官网入口
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
利用JavaScript实现拖拽改变元素大小
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
用v-html解决Vue.js渲染中html标签不被解析的问题
详解vue.js组件化开发实践
如何续费美橙建站之星域名及服务?


;
}
.switcher label input {
display: none; /* 隐藏原生 checkbox */
}
.switcher label * {
vertical-align: middle;
}
/* 滑块容器 */
.switcher label input + span {
position: relative;
display: inline-block;
width: 50px;
height: 26px;
background: #ff4d4d; /* 默认红色背景 */
border: 2px solid #ff4d4d;
border-radius: 50px;
transition: all 0.3s ease-in-out;
margin-right: 10px;
}
/* 滑块小圆点 */
.switcher label input + span small {
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 100%;
background: #fff;
border-radius: 50%;
transition: all 0.3s ease-in-out;
}
/* 选中状态:背景变绿,滑块右移 */
.switcher label input:checked + span {
background: #46c146;
border-color: #46c146;
}
.switcher label input:checked + span small {
left: 50%;
}