自定义CSS复选框toggle选中时滑块方块消失问题排查
问题排查结果
你的判断完全正确,故障根源就是:before伪元素(滑块方块)的属性配置遗漏,具体有两个错误:
- 滑块的白色背景色仅写在了未选中状态的CSS规则下,
:before的基础样式、选中状态规则都没有定义背景属性。切换到选中状态时,未选中状态的匹配规则失效,滑块背景变为透明,视觉上就像消失了 - 选中状态下你给滑块设置了
border-color: yellow,但全程没有给滑块定义border-width,这个属性本身不会生效,根本无法渲染出边框
修复方法
把滑块的通用固定属性移到:before的公共样式规则里,避免状态切换时属性丢失,同时修正选中状态下的滑块颜色配置,修正后完整CSS代码如下:
body{ background: #485461; font-family: sans-serif; height: 100vh; overflow: hidden; } .container{ margin: 0 auto; text-align: center; padding-top: 30px; color: white; } input[type=checkbox].toggle{ display: none; } input[type=checkbox].toggle + label{ display: inline-block; height: 60px; width: 200px; position: relative; font-size:20px; border: 4px solid white; padding: 0; margin: 0; cursor: pointer; box-sizing: border-box; transition: all 0.3s ease; } input[type=checkbox].toggle + label:before{ position: absolute; top: 4px; height: 44px; width: 44px; content: ''; transition: all 0.3s ease; z-index: 3; background-color: white; } input[type=checkbox].toggle + label:after{ width: 140px; text-align: center; z-index: 2; text-transform: uppercase; position: absolute; top: 50%; transform: translateY(-50%); text-overflow: ellipsis; overflow: hidden; } input[type=checkbox].toggle:not(:checked) + label{ background-color: transparent; text-align: right; } input[type=checkbox].toggle:not(:checked) + label:after{ content: attr(data-unchecked); right: 0; left: auto; opacity: 1; color: white; } input[type=checkbox].toggle:not(:checked) + label:before{ left: 4px; } input[type=checkbox].toggle:checked + label{ text-align: left; border-color: yellow; } input[type=checkbox].toggle:checked + label:after{ content: attr(data-checked); left: 4px; right: auto; opacity: 1; color: white; } input[type=checkbox].toggle:checked + label:before{ left: 144px; background-color: yellow; }
替换原有CSS后,切换开关时滑块会正常左右滑动不会消失,选中状态下外边框和滑块会同步变为黄色,交互和视觉效果都符合预期。
内容的提问来源于stack exchange,提问作者nvhrw
相关产品推荐
相关产品推荐

