jQuery實現(xiàn)自定義checkbox和radio樣式
1,起因
最近在工作中要實現(xiàn)自定義式的radio樣式,而我們通常使用的時默認的樣式,因為自己實在想不到解決的方法,于是開始搜索,最終看到了不錯的解決辦法,可以完美解決我們遇到的問題。
2,原理
大家都知道在寫結(jié)構(gòu)的時候,radio或checkbox都會跟隨label一起使用,label的for屬性值和input的id值相同的情況下,點擊label就可以選中input,這里正是利用label 來覆蓋我們的input默認樣式,通過給label添加背景圖片(美化的checkbox或radio),也就是在點擊的過程中,我們是看不到默認的input的(給input設置z-index:-1),而點擊的是label,通過不同的事件,加載不同的背景圖片(這里是改變背景圖片的位置)
3,設置美化checkbox或radio的默認樣式
(1)頁面結(jié)構(gòu)
<form class="form" method="post"> <fieldset> <legend>Which genres do you like?</legend> <input type="checkbox" value="action" id="check-1" name="genre"><label for="check-1" class="">Action / Adventure</label> <input type="checkbox" value="comedy" id="check-2" name="genre"><label for="check-2" class="">Comedy</label> <input type="checkbox" value="epic" id="check-3" name="genre"><label for="check-3" class="">Epic / Historical</label> <input type="checkbox" value="science" id="check-4" name="genre"><label for="check-4" class="">Science Fiction</label> <input type="checkbox" value="romance" id="check-5" name="genre"><label for="check-5" class="">Romance</label> <input type="checkbox" value="western" id="check-6" name="genre"><label for="check-6" class="">Western</label> </fieldset> <fieldset> <legend>Caddyshack is the greatest movie of all time, right?</legend> <input type="radio" value="1" id="radio-1" name="opinions"><label for="radio-1" class="">Totally</label> <input type="radio" value="1" id="radio-2" name="opinions"><label for="radio-2" class="">You must be kidding</label> <input type="radio" value="1" id="radio-3" name="opinions"><label for="radio-3" class="">What's Caddyshack?</label> </fieldset> </form>
(2)jquery code(前提必須引入jquery庫)
jQuery.fn.customInput = function(){ $(this).each(function(i){ if($(this).is('[type=checkbox],[type=radio]')){ var input = $(this); //get the associated label using the input's id var label = $('label[for='+input.attr('id')+']'); //get type,for classname suffix var inputType = (input.is('[type=checkbox]')) ? 'checkbox' : 'radio'; //wrap the input + label in a div $('<div class="custom-'+ inputType +'"></div>').insertBefore(input).append(input,label); //find all inputs in this set using the shared name attribute var allInputs = $('input[name='+input.attr('name')+']'); //necessary for browsers that don't support the :hover pseudo class on labels label.hover(function(){ $(this).addClass('hover'); if(inputType == 'checkbox' && input.is(':checked')) { $(this).addClass('checkedHover'); } },function(){ $(this).removeClass('hover checkedHover'); }); //bind custom event, trigger it, bind click,focus,blur events input.bind('updateState',function(){ if(input.is(':checked')){ if(input.is(':radio')){ allInputs.each(function(){ $('label[for='+$(this).attr('id')+']').removeClass('checked'); }); }; label.addClass('checked'); } else { label.removeClass('checked checkedHover checkedFocus'); } }) .trigger('updateState') .click(function(){ $(this).trigger('updateState'); }) .focus(function(){ label.addClass('focus'); if(inputType == 'checkbox' && input.is(':checked')) { $(this).addClass('checkedFocus'); } }) .blur(function(){ label.removeClass('focus checkedFocus'); }); } }); }
引入jquery庫,再引入上面的代碼后,就可以執(zhí)行下面的代碼
$('input').customInput();
(3)生成的外層div
如果你的代碼結(jié)構(gòu)是label和input成對寫的話,那么在它們的外層就會生成一個div,如圖
(4)設置自定義默認樣式
準備好一張圖,如下:
你可能會問,為什么上面沒有在頂端,而是有一定的距離,因為我們的input選項多是居中的,而我們是使用label的背景圖片來模擬的,所以我們是為了讓input選項居中顯示??傊篿co小圖標一定要垂直排列,一定要留有一定的距離來達到居中顯示。
/* wrapper divs */ .custom-checkbox, .custom-radio { position: relative; display: inline-block; } /* input, label positioning */ .custom-checkbox input, .custom-radio input { position: absolute; left: 2px; top: 3px; margin: 0; z-index: -1; } .custom-checkbox label, .custom-radio label { display: block; position: relative; z-index: 1; font-size: 1.3em; padding-right: 1em; line-height: 1; padding: .5em 0 .5em 30px; margin: 0 0 .3em; cursor: pointer; }
這是最外層的一些設置,當然你可以自己修改
/* ==默認狀態(tài)效果== */ .custom-checkbox label { background: url(images/checkbox.gif) no-repeat; } .custom-radio label { background: url(images/button-radio.png) no-repeat; } .custom-checkbox label, .custom-radio label { background-position: 0px 0px; }
/*==鼠標懸停和得到焦點狀態(tài)==*/ .custom-checkbox label.hover, .custom-checkbox label.focus, .custom-radio label.hover, .custom-radio label.focus { /*background-position: -10px -114px;*/ } /*==選中狀態(tài)==*/ .custom-checkbox label.checked, .custom-radio label.checked { background-position: 0px -47px; } .custom-checkbox label.checkedHover, .custom-checkbox label.checkedFocus { /*background-position: -10px -314px;*/ } .custom-checkbox label.focus, .custom-radio label.focus { outline: 1px dotted #ccc; }
結(jié)尾:總之,我是完美的解決了我的問題,順便截圖發(fā)一個看看
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關文章
jQuery動態(tài)生成不規(guī)則表格(前后端)
這篇文章主要介紹了jQuery動態(tài)生成不規(guī)則表格的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下2017-02-02jQuery Json數(shù)據(jù)格式排版高亮插件json-viewer.js使用方法詳解
這篇文章主要為大家詳細介紹了jQuery Json數(shù)據(jù)格式排版高亮插件json-viewer.js的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06jquery插件制作 自增長輸入框?qū)崿F(xiàn)代碼
本章我們將創(chuàng)建一個自增長的輸入框插件,jquery.aotogrow.js2012-08-08