今天在用el-switch
的时候遇到点小问题,而后想着本身写一个css的吧。css
其实写过不知几次了,纯当记录一下。html
结合switch开关的样子,其实用css实现挺简单的。shell
原理:spa
先分两个步骤:code
若是只是单纯画一个开和一个关:htm
<div for="switcher-check" class="switcher-layer"> <span class="switcher-point"></span> </div>
那只要每个只须要:一个椭圆外壳加一个内部小圈圈,改变一下颜色,调整一下小圈圈在内部的左边距,开和关就出来了。get
好比,赋予上面元素这样的css,就出来一个关按钮了。input
.switcher-layer{ cursor: pointer; width: 80px; height: 40px; display: block; border-radius: 20px; background-color: #aaa; } .switcher-point{ width: 30px; height: 30px; display: inline-block; background-color: white; border-radius: 50px; margin: 5px; }
至于开,只须要外壳改一下background-color
,圈圈调一下margin-left
便可it
从第一个步骤说的实现,只要能掌控好,开关的状态和元素的样式类对应变化便可。io
开关的状态好办,checkbox 当它的勾选状态由checked属性控制,可是checkbox有本身的样式,和第一部分的样式冲突咋办呢?利用label for和input的关系,把checkbox藏起来,留下label来给checkbox作门面展现,把第一部分的样式往label身上套便可。
此时关于勾选状态,那是checkbox和他家checked的事,label做为触发状态变动,那怎么让状态对应的影响label呢?
那就该相邻元素和:checked伪类选择器出场了。
且先看看html标签怎么写
<div class="switcher"> <input id="switcher-check" type="checkbox" checked /> <label for="switcher-check" class="switcher-layer"> <span class="switcher-point"></span> </label> </div>
关键是这里的input和label之间的相邻以及顺序,结合兄弟选择器来看样式
.switcher{ } /*把input藏起来~*/ .switcher input[type="checkbox"] { display: none; } .switcher-layer{ cursor: pointer; width: 80px; height: 40px; display: block; border-radius: 20px; background-color: #aaa; transition: background .6s; } .switcher-point{ width: 30px; height: 30px; display: inline-block; background-color: white; border-radius: 50px; margin: 5px; transition: margin .6s; } /*checkbox勾选状态下,它兄弟换了个背景色*/ .switcher input[type="checkbox"]:checked ~ .switcher-layer{ background-color: green; } /*并且兄弟家小圈还跑右边去了*/ .switcher input[type="checkbox"]:checked ~ .switcher-layer .switcher-point{ margin-left: 45px; }
在未选中状态下,展现标签只是一个“关”的状态,展现“关”的效果,当checkbox勾选状态下,:checked伪类生效了,和它一块的兄弟选择器收到了“呼唤”,因而就有了“开”的效果~
印象中相邻选择器本身用的少,可是利用相邻选择器和:checked伪类来实现状态切换确实是个不错的实践,不仅checkbox,还有radio也能够,能够用来作tab切换的效果。