32.选择器

选择器

html部分

复制代码
<div class="toggle-container">
    <input type="checkbox" id="good" class="toggle">
    <label for="good" class="label">
        <div class="ball"></div>
    </label>
    <span>good</span>
</div>
<div class="toggle-container">
    <input type="checkbox" id="cheap" class="toggle">
    <label for="cheap" class="label">
        <div class="ball"></div>
    </label>
    <span>cheap</span>
</div>
<div class="toggle-container">
    <input type="checkbox" id="fast" class="toggle">
    <label for="fast" class="label">
        <div class="ball"></div>
    </label>
    <span>fast</span>
</div>

css部分

复制代码
*{
    margin: 0;
    padding: 0 ;
}
body{
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    overflow: hidden;
}

.toggle-container{
    display: flex;
    align-items: center;
    margin: 10px 0;
    width: 200px;
}
.label{
    position: relative;
    background-color: #d0d0d0;
    border-radius: 50px;
    cursor: pointer;
    display: inline-block;
    margin: 0 15px 0;
    width: 80px;
    height: 40px;
}
.toggle{
    visibility: hidden;
}
.toggle:checked + .label{
    background-color: #8e44ad;
}
.ball{
    background-color: #fff;
    height: 34px;
    width: 34px;
    border-radius: 50%;
    position: absolute;
    top: 3px;
    left: 3px;
    animation: scrollOff .3s linear forwards;
}
.toggle:checked + .label .ball{
    animation: scrollOn .3s linear forwards;
}

@keyframes scrollOff{
    100%{
        transform: translateX(0) scale(1);
    } 
    50%{
        transform: translateX(20px) scale(1.2);
    }
    0%{
        transform: translateX(40px) scale(1);
    }
}
@keyframes scrollOn {
    50%{
        transform: translateX(20px) scale(1.2);
    }
    100%{
        transform: translateX(40px) scale(1);
    }
}

js部分

复制代码
// 获取dom
let toggles=document.querySelectorAll(".toggle")
toggles=Array.from(toggles)


// 按钮绑定事件
toggles.forEach((item)=>{
    item.addEventListener("change",(e)=>{
        const {checked,id}=e.target
        
        if(all()){
            if(id=='good'){
                toggles[1].checked=false
            }
            if(id=='cheap'){
                toggles[2].checked=false
            }
            if(id=='fast'){
                toggles[0].checked=false
            }
        }
    })
})

// 是否全选
function all(){
   return toggles.every((item)=>{
        return item.checked
    })
}

效果

相关推荐
风骏时光牛马15 分钟前
智能赋能型AI办公一体化系统架构
前端
满栀58534 分钟前
vue动态路由效果
前端·javascript·vue.js·前端框架·vue
土豆~43 分钟前
文件名没后缀就打不开:前端文件预览的内容嗅探改造
前端·状态模式
Euato_Key1 小时前
全栈视野学习Cookie——理解 Cookie 的本质
前端
前端开发呀1 小时前
我的 AI 终端配置清单
前端
敲代码的玉米C2 小时前
测试一直在写你的真实数据根
前端·人工智能·架构
jjw_zyfx2 小时前
css vue vite实现闪烁的呼吸效果
javascript·css·vue.js
执子念的飞鱼2 小时前
File Viewer 进入 2K 节点后,我更在意这 3 条回归
前端·typescript
richdata2 小时前
动态OTB vs 静态OTB:鞋服零售该选哪种管理模式?
前端·html·零售