如何在Toggle Switch禁用状态下显示叉号?已实现启用时显示对勾
Toggle Switch禁用状态叉号不显示问题修复
问题描述
我正在使用Toggle Switch,希望启用时显示对勾,禁用时显示叉号。目前已成功实现启用时显示对勾,但禁用状态下叉号无法正常显示,需要排查问题。
启用时正常效果:
禁用时期望效果:
原代码
CSS代码
.switch { position: relative; display: inline-block; width: 60px; height: 34px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { position: absolute; content: ""; height: 26px; width: 26px; left: 4px; bottom: 4px; background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked+.slider { background-color: #2196F3; } input:focus+.slider { box-shadow: 0 0 1px #2196F3; } input:checked+.slider:before { -webkit-transform: translateX(26px); -ms-transform: translateX(26px); transform: translateX(26px); } /* Rounded sliders */ .slider.round { border-radius: 34px; } .slider.round:before { border-radius: 50%; } .toggle-switch-container { display: flex; align-items: center; } /* Style the toggle switch label */ .toggle-switch-label { margin-left: 10px; font-size: 20px; } /* Tick and Cross marks */ .tick, .cross { position: absolute; top: 2px; font-size: 22px; color: white; transition: .4s; } .tick { left: 35px; opacity: 0; } input:checked+.slider+.tick { opacity: 1; color: green; } .cross { right: 34px; opacity: 0; } input:not(:checked)+.slider+.cross { color: red; opacity: 1; }
HTML代码
<div class="toggle-switch-container"> <label class="switch"> <input type="checkbox" checked> <span class="slider round"></span> <span class="tick">✓</span> <span class="cross">✕</span> </label> </div>
问题原因
问题出在CSS选择器的使用上:
- 叉号对应的选择器
input:not(:checked)+.slider+.cross使用了相邻兄弟选择器+,该选择器要求目标元素必须是前一个元素的紧接下一个兄弟。但HTML结构中,.slider的下一个兄弟是.tick而非.cross,因此选择器无法匹配到.cross元素,导致叉号无法显示。 - 对勾的选择器能生效是因为
.tick确实是.slider的紧接兄弟,但为了统一健壮性,建议同步调整选择器规则。
修复方案
将选择器中的相邻兄弟选择器+替换为通用兄弟选择器~,它可以匹配同一父元素下的所有后续兄弟元素,无需严格相邻。同时微调叉号的位置让显示更居中:
/* Tick and Cross marks */ .tick, .cross { position: absolute; top: 2px; font-size: 22px; color: white; transition: .4s; } .tick { left: 35px; opacity: 0; } input:checked ~ .tick { opacity: 1; color: green; } .cross { right: 36px; /* 微调位置让叉号更居中 */ opacity: 0; } input:not(:checked) ~ .cross { color: red; opacity: 1; }
修复后效果
- 启用状态:对勾正常显示,位置符合预期;
- 禁用状态:叉号正常显示,位置居中,完全匹配需求效果。
内容的提问来源于stack exchange,提问作者harish nune
相关产品推荐
相关产品推荐

