視頻地址:http://v.qq.com/page/m/8/c/m0150izlt8c.html
大家好,歡迎來到【三石jQuery視頻教程】,我是您的老朋友 - 三生石上。
今天,我們要通過基本的HTML、CSS、jQuery以及字體庫FontAwesome來實現復選框和單選框,先來看下最終的產品:
需要特別注意的是,在這個例子中,我們可以通過 TAB鍵來使復選框或者單選框獲取焦點,并將其顏色改為綠色。
Step1:網站目錄
網站目錄非常簡單,包含三部分:lesson2.html文件、lib目錄。
其中 lesson1.html 包含了一個頁面最基本的組成部分,正確的設置 DOCTYPE 有助于頁面在現代瀏覽器中正確渲染。
<!DOCTYPE html> <html> <head> <title>02.創建FontAwesome復選框和單選框 - 三石jQuery視頻教程</title> </head> <body> </body> </html>
lib目錄僅包含了最新的 jQuery 庫;以及最新的 FontAwesome 庫(CSS文件和相應的字體文件)。
Step2:頁面結構
為頁面添加基本的 html 標簽,使用列表標簽 ul-li 進行組織。
- 在 label 標簽內放置 input 和文本,可以實現點擊文本時選中相應 input 的效果
- 使用 checked="checked" 屬性,來指定默認的選中項
- 單選框列表通過 name 屬性進行分組(同一個分組內的單選框,同時只能有一個處于選中狀態)
<!DOCTYPE html> <html> <head> <title>02.創建FontAwesome復選框和單選框 - 三石jQuery視頻教程</title> </head> <body> <div id="main"> <h2> 02.創建FontAwesome復選框和單選框 </h2> <h4> 復選框列表 </h4> <ul> <li> <label> <input type="checkbox"> 復選框一 </label> </li> <li> <label> <input type="checkbox" checked="checked"> 復選框二 </label> </li> <li> <label> <input type="checkbox"> 復選框三 </label> </li> </ul> <h4> 單選框列表 </h4> <ul> <li> <label> <input name="group1" type="radio"> 單選框一 </label> </li> <li> <label> <input name="group1" type="radio" checked="checked"> 單選框二 </label> </li> <li> <label> <input name="group1" type="radio"> 單選框三 </label> </li> </ul> </div> </body> </html>
此時的頁面顯示效果:
Step3:CSS樣式
下面我們來創建基本的 CSS 樣式,讓這個默認顯示看起來更加專業和美觀,我們所做的努力包含:
- 頁面背景設為非常淺的灰色(#efefef)
- 主體內容加上了邊框和白色背景
- 主體內容居中(margin-left 和 margin-right 設為 auto)
- 清空無序列表 ul-li 的默認樣式
<style> body { background-color: #efefef; } #main { border: solid 1px #ccc; padding: 10px; background-color: #fff; max-width: 500px; margin: 100px auto; } ul { list-style-type: none; padding: 0; margin: 0; } </style>
此時的頁面顯示效果:
Step4:引入FontAwesome字體
在頁面 head 中添加對 FontAwesome 字體的引用:
<link href="lib/fa/css/font-awesome.css" rel="stylesheet">
在頁面底部引入 jQuery 庫,并在 DOMReady 中動態添加字體圖標到每一個復選框或者單選框的后面:
<script> $(function() { $('[type=checkbox],[type=radio]').each(function() { var checkEl = $(this); $('<i>', { 'class': 'fa fa-check' }).insertAfter(checkEl); }); }); </script>
其中CSS 類 fa 是每個圖標字體所必須的, fa-check 指定了某個具體的圖標字體。
此時的頁面效果:
Step5:自定義復選框和單選框 CSS 類
雖然我們可以直接使用 FontAwesome 預定義的圖標字體 CSS 類,比如:
- 復選框:fa-square-o
- 選中的復選框:fa-check-square-o
- 單選框:fa-circle-o
- 選中的單選框:fa-dot-circle-o
但是如果直接這樣來引用的話,會讓 JavaScript 代碼變得很乏味并且容易出錯,比如將復選框改為選中狀態:
checkIconEl.addClass('fa-check-square-o').removeClass('fa-square-o');
因此,我們決定自定義 CSS 類,來實現復選框的字體圖標,我們所期望的復選框的 HTML 結構:
<label> <input type="checkbox"> <i class="fa checkbox"> 復選框一 </label>
注意:這里使用 checkbox 字符串作為圖標字體的 CSS 類,不是隨意寫的。這個字符串正好就是 input 的 type 屬性,從而可以簡化 JavaScript 代碼。
相應的,選中的復選框的 HTML 結構:
<label class="checked"> <input type="checkbox"> <i class="fa checkbox"> 復選框一 </label>
下面,我們就可以根據 FontAwesome 官網頁面來定義我們自己需要的 CSS 類:
.fa.checkbox:before { content: "\f096"; } label.checked .fa.checkbox:before { content: "\f046"; } .fa.radio:before { content: "\f10c"; } label.checked .fa.radio:before { content: "\f192"; }
Step6:復選框和單選框的初始狀態
根據前面假設的 HTML 結構和自定義圖標 CSS,我們可以完成 DOMReady 的初始化操作:
$(function() { $('[type=checkbox],[type=radio]').each(function() { var checkEl = $(this); $('<i>', { 'class': 'fa ' + checkEl.attr('type') }).insertAfter(checkEl); if(checkEl.is(':checked')) { checkEl.parent('label').addClass('checked'); } }) }); });
這里有幾個注意點:
- input 的 type 屬性剛好作為字體圖標的 CSS 名稱(checkbox 和 radio)
- 使用 jQuery 提供的 is(':checked') 來判斷復選框或者單選框是否處于選中狀態
- 通過 parent 函數來查找某個元素的直接父元素(immediate parent)
頁面的初始效果:
Step7:同步復選框和單選框狀態到字體圖標
下面我們來完整字體圖標的狀態同步,首選注冊 change 事件:
$('[type=checkbox],[type=radio]').change(function() { var checkEl = $(this); var checked = checkEl.is(':checked'); var labelEl = checkEl.parent('label'); if(checkEl.is('[type=checkbox]')) { // checkbox } else { // radio } });
在 change 事件中,需要當前事件的一些上下文變量:
- checkEl:當前點擊的復選框或者單選框
- checked:當前輸入框是否選中
- labelEl:當前輸入框的直接父元素(label標簽)
還需要知道當前點擊的是復選框還是單選框,從而進行不同的處理,復選框的處理比較簡單:
if(checked) { labelEl.addClass('checked'); } else { labelEl.removeClass('checked'); }
單選框的處理相對復雜點,因為我們在每次選中單選框時,都要先清空同一分組內的其他單選框的狀態:
var radioName = checkEl.attr('name'); var radioEls = $('[type=radio][name='+ radioName +']'); radioEls.parent('label').removeClass('checked'); labelEl.addClass('checked');
最后,我們只需要隱藏前面的 input 輸入框就行了:
[type=checkbox], [type=radio] { display: none; }
此時的頁面效果:
Step8:響應TAB鍵,以及焦點樣式
如果我們的示例就此結束,似乎也很完整。但是缺少一個重要的功能,此時的復選框和單選框不再響應 TAB鍵了。
我們分別在頁面頂部和底部放置一個 input[type=text],就能方便的看到效果了,在第一個文本輸入框按下 TAB鍵,會直接跳轉到第二個文本輸入框:
怎么辦?
應該是 display:none 導致 input[type=checkbox] 不再響應 TAB鍵了,但是我們必須要把他隱藏掉才行啊!
沒關系,除了使用 display:none 隱藏掉復選框,我們可以讓復選框顯示出來,但是你卻看不到:
[type=checkbox], [type=radio] { position: absolute; width: 1px; height: 1px; clip: rect(0 0 0 0); }
這里的 CSS 技巧:
- 使用 position:absolute 將復選框浮動起來
- 設置寬度和高度為 1px,使其在頁面顯示為一個像素的小黑點
- 通過 clip:rect(0 0 0 0) 設置裁剪矩形為空,最終讓你看不到這個復選框,但是這個復選框還是存在的
注:clip 屬性僅可用來裁剪絕對定位元素,對于 position:static 或者 position:relative 的元素無效。
這還不算結束,我們還需要復選框獲取焦點時,能有樣式的改變,便于用戶察覺:
$('[type=checkbox],[type=radio]').focus(function(){ $(this).parent('label').addClass('focusit'); }).blur(function() { $(this).parent('label').removeClass('focusit'); });
以及相應的 CSS 樣式:
label.focusit { color: green; }
最終的頁面效果:
Step10:完整的JavaScript代碼
最后,來看下完整的 JavaScript 代碼:
<script> $(function() { $('[type=checkbox],[type=radio]').each(function() { var checkEl = $(this); $('<i>', { 'class': 'fa ' + checkEl.attr('type') }).insertAfter(checkEl); if(checkEl.is(':checked')) { checkEl.parent('label').addClass('checked'); } }).change(function() { var checkEl = $(this); var checked = checkEl.is(':checked'); var labelEl = checkEl.parent('label'); if(checkEl.is('[type=checkbox]')) { if(checked) { labelEl.addClass('checked'); } else { labelEl.removeClass('checked'); } } else { var radioName = checkEl.attr('name'); var radioEls = $('[type=radio][name='+ radioName +']'); radioEls.parent('label').removeClass('checked'); labelEl.addClass('checked'); } }).focus(function(){ $(this).parent('label').addClass('focusit'); }).blur(function() { $(this).parent('label').removeClass('focusit'); }); }); </script>
源碼和視頻下載
三石出品,必屬精品!
如果本文對你有所幫助,請點擊 [推薦] 按鈕來鼓勵作者,你的支持是我們前進的動力!
文章列表