使用CSS实现switch切换开关

文章作者:最后的阿莫西林

发布时间:2022-04-25 14:52

switch开关

switch开关的原理其实就是改变input type="checkbox"的样式,这里我利用的是伪元素。


1.创建HTML结构

代码如下:

<div>
<input type="checkbox" id="switch" name="switch">
<label for="switch">
<span data-off="正文" data-on="草稿">switch</span>
</label>
</div>

这里使用了HTML5的data-*属性,它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力,在这里就是获取正文和草稿。

默认switch样式

2.调整样式

首先我们要隐藏掉input的默认样式,再给label添加背景和切换球样式。

div{
display: flex;
flex-direction: column;
min-height: 100vh;
justify-content: center;
align-items: center;
}

input[type="checkbox"]{
width: 0;
height: 0;
visibility: hidden;
}

label{
display: block;
width: 300px;
height: 150px;
background-color: #28a745!important;
border-radius: 100px;
position: relative;
cursor: pointer;
transition: 0.5s;
}
label::after{
content: "";
width: 120px;
height: 120px;
background-color: #e8f5f7;
position: absolute;
border-radius: 70px;
top: 15px;
left: 15px;
transition: 0.5s;
}

switch调整后的样式


3.设置label和span样式

使用css3 attr()获取data属性,也就是获取“正文”和“草稿”

label > span{
position: relative;
display: flex;
justify-content: center;
align-items: center;
height: inherit;
font-size: 3rem;
color: #fff;
} label > span:before{
display: flex;
content: attr(data-off);
position: absolute;
top: 50%;
right: 10%;
transform: translateY(-50%);
opacity: 1;
}
label > span:after{
display: flex;
content: attr(data-on);
position: absolute;
top: 50%;
left: 10%;
transform: translateY(-50%);
opacity: 0;
color: black;
}

switch


4.添加选中状态样式

给input添加选中状态的样式和过度动画,就是当input选中后,设置label和span标签样式

input:checked + label{
background-color: #ffc107!important;
}
input:checked +label:after{
left: calc(100% - 15px);
transform: translateX(-100%);
}
input:checked +label>span::after{
opacity: 1;
transition: 0.5s;
}

label:active::after{
width: 160px;

}

switch选中后

选中后

input样式还可以优化,上述样式是让元素不可见,有个缺点就是无法用键盘上的Tab键选中,也不利于阅读器识别,可以参考以下方法:

input[type="checkbox"]{
    clip: rect(0 0 0 0);
clip-path: inset(50%);
height: 1px;
overflow: hidden;
position: absolute;
white-space: nowrap;
width: 1px; }


如果这篇文章对你有帮助,那真是开心极了~