纯CSS实现可交互开关

效果

HTML

html 复制代码
<label class="switch">
    <input type="checkbox" class="switch__input" />
    <span class="circle"></span>
</label>


<script type="text/javascript">
    document.querySelector('.switch').onclick = function () {
        console.log(document.querySelector('.switch__input').checked)
    }
</script>

实现思路

  • 首先要根据input的值来改变样式
  • input要隐藏,同时需要可以点击

初始化样式

先定义变量

css 复制代码
 :root {
    --border-c: #409eff;
    --checked-c: #409eff;
    --size: 40px;
}

设置label样式,这里border-radius不是百分比,而是近乎无限大的值,这样能仅让两边变圆

css 复制代码
.switch {
    position: relative;
    display: block;
    height: var(--size);
    width: calc(var(--size) * 2);
    border-radius: 9999px;
    border: 1px solid var(--border-c);
}

设置input样式,只需要透明,加上铺满即可

css 复制代码
.switch__input {
    position: absolute;
    inset: 0;
    opacity: 0;
}

.circle {
    position: absolute;
    top: 0;
    left: 0;
    height: var(--size);
    width: var(--size);
    border-radius: 50%;
    background-color: #fff;
    border: 1px solid var(--border-c);
    box-sizing: border-box;
}

现在效果如下

接下来点击时,会改变input的值,所以根据这个值,我们来设置样式

check时,把兄弟元素向右移动即可,再给圆球加个动画

css 复制代码
.switch__input:checked + .circle {
    transform: translateX(100%);
}

.circle {
    transition: transform .3s;
}

效果如下

接下来是重头戏了,那就是背景颜色怎么根据值来改变呢

传统方式是用js控制,不过都什么年代了,还在写传统js

css 复制代码
 .switch:has(.switch__input:checked) {
    background-color: var(--checked-c);
}

这样就能实现了,这是什么意思呢??

:has选择器,即.switch里的元素,被checked就会触发

这时,当按钮被点击背景颜色就会变

最后加个动画就好了

css 复制代码
.switch {
    position: relative;
    display: block;
    height: var(--size);
    width: calc(var(--size) * 2);
    border-radius: 9999px;
    border: 1px solid var(--border-c);
    transition: background-color .6s .1s;
}

总共0.6s的动画,是按钮移动时长了两倍,并且延迟0.1s触发,这样就很丝滑

源码 gitee.com/cjl2385/dig...

相关推荐
木斯佳7 分钟前
前端八股文面经大全:26届秋招滴滴校招前端一面面经-事件循环题解析
前端·状态模式
光影少年27 分钟前
react状态管理都有哪些及优缺点和应用场景
前端·react.js·前端框架
saber_andlibert2 小时前
TCMalloc底层实现
java·前端·网络
逍遥德2 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
冻感糕人~2 小时前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions2 小时前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子2 小时前
cursor-mcp工具使用
java·服务器·前端
晚霞的不甘2 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小迷糊的学习记录3 小时前
0.1 + 0.2 不等于 0.3
前端·javascript·面试
梦帮科技3 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json