使用checkbox label來做switch開關,如下圖

html
<div>
  <label>
    <input type="checkbox" name="" id="">
    <span class="btn-box">
      <span class="btn"></span>      
    </span>
    <span class="text">我是文字</span>
  </label>
</div>
css
.btn-box {
  display:inline-block;
  width: 40px;
  height: 20px;
  border-radius:100px;
  background-color: #ccc;
}
.btn-box .btn {
  display:inline-block;
  width: 20px;
  height: 20px;
  border-radius:50%;
  background-color: #aaa;
}
效果如下:

1.input被checked後
    <input type="checkbox" name="" id="">
2.選到後面的btn-box,裡面的btn會移動位置
    <span class="btn-box">
      <span class="btn"></span>      
    </span>
html
    <input type="checkbox" name="" id="" class="checkbox">
    <span class="btn-box">
      <span class="btn"></span>      
    </span>
css
.checkbox:checked + .btn-box .btn {
  margin-left: 20px;
}
input新增class=”checkbox”,並且在設定css
當checkbox被checked時,後方的btn-box內的btn會margin-left 20px
效果如下:

使用label去控制是因為待會要讓核選框(checkbox)消失
使用絕對定位,讓他不占位置
.checkbox {
  position:absolute;
}
效果如下:

然後用opacity改透明度讓它消失
.checkbox {
  position:absolute;
  opacity:0;
}

小撇步:
1.絕對定位不設方向:
絕對定位如果不設定任何方向(上右下左)的話,他就會在原來資料所應該存在的位置當中,不會亂跑,下圖中即使在外層新增元件,也不會影響到位置
所以基本上不設定上右下左,父層沒設定定位,他還是會在原來位置,因為他不知要去哪裡

2.inline與vertical-align
在此checkbox中,文字和checkbox要對齊有很多方式,但是之前設定的css有讓checkbox使用inline-block,所以可搭配vertical-align使他對齊在此可參考網友文章裡面的「需要使用vertical-align屬性的場景」
https://www.cnblogs.com/kidsitcn/p/5982784.html

  .btn-box .btn {
    margin-left: 0;/*動畫從ml為0開始*/
    transition: .5s;
  }
.checkbox:checked + .btn-box {
  background-color: #8f8;
}
.btn-box {
  box-shadow: 0px 3px 0px rgba(0,0,0,.13) inset;
}
.btn-box .btn {
  background-color: #fff;
  box-shadow:1px 2px 5px rgba(0,0,0,.3);
}

codepen: https://codepen.io/yuski/pen/pxbBgZ
文章取材來源: 阿莫斯の網頁料理室 : CSS checked 選取器的應用