Action one
首先,來看一下我們的第一個特效
注意,這個地方的黃點不是我們特效的一部分,這個黃點之所以存在是我使用的螢幕錄製軟體自帶的。可以很清楚的看到這個特效就是當我們點選的時候,黑點會以一種縮放的動畫顯示出來,下面來看看具體如何實現。
1 2 3 4 5 6 7 8 9 10 |
<div class="radio-1"> <input type="radio" name="radio-1" id="radio-1-1" checked="checked"> <label for="radio-1-1"></label> <input type="radio" name="radio-1" id="radio-1-2"> <label for="radio-1-2"></label> <input type="radio" name="radio-1" id="radio-1-3"> <label for="radio-1-3"></label> </div> |
這裡,我們指定 input 標籤的 type 值為 radio,並且一下所有的 radio 的 name 值都相同,這樣才可以實現單選效果。對於這裡的 label 中的 for 屬性,為什麼這麼設定一開始我也不明白,後來搜尋了一下這個屬性的定義,反正大概的意思就是說,只要設定了這個屬性,當我們點選label 元素的時候,瀏覽器會自動把焦點轉移到 radio 上去。下面用 CSS 對HTML設定效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
.radio-1 { width: 900px; padding: 3% 0%; margin: 10px auto; background-color: darkseagreen; text-align: center; } .radio-1 label { display: inline-block; position: relative; width: 28px; height: 28px; border: 1px solid #cccccc; border-radius: 100%; cursor: pointer; background-color: #ffffff; margin-right: 10px; } |
這裡我們首先看一下對 label 元素的設定,其中大部分屬性我都在以前的文章中介紹過了,唯一一個陌生的屬性就是 cursor,這個屬性是設定滑鼠樣式的,設定成 pointer 之後,當我們的滑鼠放到 label 元素上時,滑鼠樣式就變成了一隻手(在我電腦上是這樣)。好了,下面繼續來看
1 2 3 4 5 6 7 8 9 10 11 12 |
.radio-1 label:after { content: ""; position: absolute; width: 20px; height: 20px; top: 4px; left: 4px; background-color: #666; border-radius: 50%; transform: scale(0); transition: transform .2s ease-out; } |
這裡我們用到了 after 選擇器,為什麼設定這個屬性?就是為了設定如上圖所示的小黑點。首先我們設定 content 屬性為空,意思就是我們不需要填充任何內容,因為我們只是想設定背景色為黑色,僅此而已。還有,剛開始的時候我們設定 transform 的 scale 值為 0 ,其達到的效果就是將小黑點隱藏。
1 2 3 4 5 6 7 8 9 |
.radio-1 [type="radio"]:checked + label { background-color: #eeeeee; transition: background-color .2s ease-in; } .radio-1 [type="radio"]:checked + label:after { transform: scale(1); transition: transform .2s ease-in; } |
注意這裡使用了 + 符號,是什麼意思呢?它的學名叫做 相鄰同胞選擇器,意思就是選擇緊接在另一個元素後的元素,而且二者有相同的父元素,在這裡的意思就是選中在radio 後出現的 label ,有人要問了,這麼設定幹嘛,直接設定 label 就是了。想象一下,在一個 非常龐大的系統中,我們可能多次使用到 label 元素,為了避免混淆,這樣設定將更加準確。這裡我們看到了 transition 屬性,這個屬性是用於設定過渡效果的。最後,將我們的 radio 隱藏掉,就大功告成了。
Action two
1 2 3 |
.radio-1 [type="radio"]{ display: none; } |
Action two
這是我們的第二個特效
其實看到這個動畫的第一感覺就是,和上一個一模一樣,除了將 transform
屬性設定成 rotate
,下面我就不再解釋了,只要你結合上一個例子,就可以很容易做出這麼一個效果,我們直接上程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Radio</title> <style> .radio-2 { width: 900px; padding: 3% 0; margin: 50px auto; background-color: darkseagreen; text-align: center; } .radio-2 label { display: inline-block; width: 28px; height: 28px; overflow: hidden; border: 1px solid #eeeeee; border-radius: 100%; margin-right: 10px; background-color: #ffffff; position: relative; cursor: pointer; } .radio-2 label:after { content: ""; position: absolute; top: 4px; left: 4px; width: 20px; height: 20px; background-color: #666666; border-radius: 50%; transform: rotate(-180deg); transform-origin: -2px 50%; transition: transform .2s ease-in; } .radio-2 [type="radio"] { display: none; } .radio-2 [type="radio"]:checked + label:after{ transform: rotate(0deg); transition: transform .2s ease-out; } </style> </head> <body> <div class="radio-2"> <input type="radio" name="radio-2" id="radio-2-1" checked="checked"> <label for="radio-2-1"></label> <input type="radio" name="radio-2" id="radio-2-2"> <label for="radio-2-2"></label> <input type="radio" name="radio-2" id="radio-2-3"> <label for="radio-2-3"></label> </div> </body> </html> |