1. 程式人生 > >CSS---checkbox美化,ios風格的開關按鈕

CSS---checkbox美化,ios風格的開關按鈕

這段時間工作的新需求,是做一個類似IOS開關按鈕。用來顯示是否選中。
如:
這裡寫圖片描述 預設未選中

這裡寫圖片描述 預設選中

方法一:

CSS中通過:before、:after偽類美化checkbox按鈕,來實現;

HTML:<input type="checkbox" class="check-switch check-switch-anim"/>

通過設定appearance屬性值賦值為none;清楚原有checkbox的瀏覽器預設樣式
注意:
所有主流瀏覽器都不支援 appearance 屬性。
Firefox 支援替代的 -moz-appearance 屬性。
Safari 和 Chrome 支援替代的 -webkit-appearance 屬性。
IE各版本是徹底的不支援,沒有替代屬性。

CSS:
.check-switch {
  // 清除原有樣式
  -moz-appearance: none;
  -webkit-appearance: none;
  // 清除元素外邊款輪廓線
  outline: none; 
  // 設定具備區塊元素屬性
  display: inline-block;
  // 按鈕設定為手型
  cursor:pointer;
  // 設定寬度
  width: 39px;
  // 設定高度
  height: 20px;
  position: relative;
  // 邊框
  border: 1px solid #dfdfdf;
  // 背景
  background-color
: #fdfdfd; // 設定陰影效果 box-shadow: #dfdfdf 0 0 0 0 inset; // 圓角 border-radius: 20px; // 設定背景的繪製區域 background-clip: content-box; } // 中間圓圈樣式 .check-switch:before { // content 屬性與 :before 及 :after 偽元素配合使用,來插入生成內容。 // 此元素值為'' ,但是必須存在,否則將不顯示中間那個圓圈 content: ''; width: 17px; height: 17px; // 脫離文件流
position: absolute; // 設定位置 top: 0px; left: 0; // 圓角 border-radius: 20px; // 顏色 background-color: #fff; // 陰影效果 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); } //checkbox元素被選中時的樣式 .check-switch:checked { // 邊框顏色 border-color: #64bd63; // 選中後的陰影效果 box-shadow: #64bd63 0 0 0 16px inset; // 選中後的北京色 background-color: #64bd63; } // 在checkbox選中後,中間圓圈的便宜位置 .check-switch:checked:before { left: 21px; } // 增加動畫效果 .check-switch-anim { transition: border cubic-bezier(0, 0, 0, 1) 0.4s, box-shadow cubic-bezier(0, 0, 0, 1) 0.4s; } .check-switch-anim:before { transition: left 0.3s; } .check-switch-anim:checked { box-shadow: #3C92DC 0 0 0 16px inset; background-color: #3C92DC; transition: border ease 0.4s, box-shadow ease 0.4s, background-color ease 1.2s; } .check-switch-anim:checked:before { transition: left 0.3s; }

方法二:
由於方法一IE瀏覽器不支援appearance 屬性並且沒有替代屬性,方法一不通過;
第二種方法,使用了label標籤,使用label中的for屬性關聯checkbox,當label被點選時會觸發checkbox
的點選事件,在同過CSS美化label。達到開關效果;label中的for可是很強大的,很好用

瀏覽器支援:
Firefox 支援。
Safari 支援
Chrome 支援
由於IE8及IE8以下不支援border-radius屬性,沒有圓角。

HTML:
<input type="checkbox" class="ch_t" id="ch1"/>
<label class="ch_label" for="ch1"></label>

邏輯:
1.將標籤checkbox隱藏
2.label中for元素關聯checkbox的id
3.設定label元素樣式,before樣式。。。

CSS:
.ch_t{
    // 隱藏
    display:none;
}
.ch_label{
    // 設定label為塊區域
    display: inline-block;
    width: 40px;
    height: 19px;
    // 背景色
    background-color: #ccc;
    // 圓角
    border-radius: 20px;
    // 去掉外邊款樣式
    outline:none;
    border: 1px solid #ccc;
}
// 獲取checkbox是否選擇並且關聯到label標籤上 
.ch_t:checked + .ch_label{
    background-color: #3C92DC;
}
// 選中後中間圓圈的便宜位置
.ch_t:checked + .ch_label:before{
    left:44%;
}
// 通過before偽類實現
.ch_label:before{
    position:relative;
    top:-1px;
    // content 屬性與 :before 及 :after 偽元素配合使用,來插入生成內容。
        // 此元素值為'' ,但是必須存在,否則將不顯示中間那個圓圈 
    content: "";
    display: block;
    width:50%;
    height:100%;
    background-color:#fff;
    border-radius:20px;
    border: 1px solid #ccc;
}

方法三:

由於IE瀏覽器版本比較多,各個IE的版本對CSS和HTML的支援都不同,很多屬性都不可用。
雖然現在微軟已經停止對IE各個版本的維護及更新,東家都放棄了,我們還在繼續堅持相容,悲劇。
所以要實現這種IOS開關的按鈕功能,最簡單最直接最粗暴的方法就是img,把它做成兩張圖片,通過JS點選事件控制圖片顯示隱藏。暴露的問題就是沒有互動效果,而且圖片載入也需要時間,佔用的資源也大。

結語:還會繼續尋找方法四、方法五。。。會持續更新。。。。