<input type="checkbox"> 是否同意...
由於勾選框本身不大,因此很多開發者都期許一種更方便作法 - 當使用者點選說明文字時,同時觸發這個勾選框,因此誕生了 label 標籤:
<!-- label 標籤有一個屬性 for,需填入與之互動的 input id --> <input id="test" type="checkbox"><label for="test">是否同意...</label>
當使用者點選了 label 標籤,相當於點選了 input,是不是很方便呢?
也因為 label 的這個特性,讓我們能使用純 html + css 來實現 ios 的開關。
首先我們使用一個 ::before 偽元素,當作勾選框的底:
#test {
}
#test + label { /* + 號代表 "下一個",意指 #test 的下一個節點 label */
display: block;
position: relative;
font-size: 16px;
line-height: 20px; /* 將 label 的高設為 20px */
padding-left: 50px; /* 避開勾選框 */
}
#test + label::before { /* 勾選框的底 */
content: '';
position: absolute;
top: 0;
left: 0;
width: 40px;
height: 20px;
background-color: #CC4541;
}
我把 label 設為 relative,讓 ::before 偽元素設為 absolute ,對齊 label 的左邊。接著,我們使用 ::after 偽元素來製作撥動按鈕的開關,對齊 label 的左上角:
#test + label::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 18px; /* 製作一個 20px * 20px 的開關 */
height: 18px;
border-width: 1px;
border-style: solid;
border-color: #CC4541;
background-color: #fff;
}
此時,已經可以得到一個概略的雛型如下:
接著,我們需要依照 input 勾選的狀態,來改變這組開關的樣式。這時可以使用 :checked 選擇器,:checked 有點類似 :hover (當指標滑入) ,都是在表示元素的某種狀態。 :checked 表示的是 當物件被勾選的狀態 。
當 #test 被勾選時,我們去改變 #text 的下一個 label 的 ::before 與 ::after 偽元素:
#test:checked + label::before {
background-color: #83cc41;
}
#test:checked + label::after {
border-color: #83cc41;
left: 20px; /* 開關往左移動 20px */
}
到此,我們已經得到了一個可以用的 ios 開關,到這個階段,別忘了把原本醜醜的 input 給隱藏起來:
#test {
display: none;
}
如果你想要補間動畫,可以使用 CSS transition,也可以為它加上圓角、陰影等裝飾。以下是我使用的代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
#test {
display: none;
}
#test + label {
display: block;
position: relative;
font-size: 16px;
line-height: 20px;
padding-left: 50px;
cursor: pointer;
}
#test + label::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 40px;
height: 20px;
background-color: #CC4541;
border-radius: 10px;
transition: 300ms;
}
#test:checked + label::before {
background-color: #83cc41;
}
#test + label::after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 18px;
height: 18px;
border-style: solid;
border-width: 1px;
border-color: #CC4541;
background-color: #fff;
border-radius: 10px;
transition: 300ms;
}
#test:checked + label::after {
border-color: #83cc41;
left: 20px;
}
</style>
</head>
<body>
<input id="test" type="checkbox"><label for="test">是否同意...</label>
</body>
</html>
這個方法還可以用於多選選單 <input type="radio"> ,試試看吧!






沒有留言:
張貼留言