這是一款效果超讚的jQuery和css3 select下拉選單框美化外掛。這個select下拉選單框外掛沒有使用任何的圖片,純css製作,還使用了一點jQuery來完成動作互動。
線上演示 下載
有兩個地方需要做下說明:
- 下面的程式碼中沒有使用任何廠商的字首。
- 在外掛中使用了CSS盒子模式(box-model): [width] = [element-width] + [padding] + [borders]。看下面程式碼:
*, *:after, *:before { box-sizing : border-box; } |
HTML結構
首先要了解我們的select下拉選單框的html結構是怎麼樣的。我們使用的結構是一個div做wrapper,裡面有一個span和一個無序列表。
< div class = "wrapper-dropdown" > < span >I'm kinda the label!</ span > < ul class = "dropdown" > < li >I'm hidden!</ li > < li >Me too!</ li > < li >So do I.</ li > </ ul > </ div > |
JAVASCRIPT
我們需要一些js程式碼來使select下拉選單框能正常工作,下面的js程式碼是所有的demo都使用的程式碼:
//... obj.dd.on( 'click' , function (event){ $( this ).toggleClass( 'active' ); return false ; }); //... $( function () { var dd = new DropDown( $( '#dd' ) ); $(document).click( function () { // all dropdowns $( '.wrapper-dropdown-1' ).removeClass( 'active' ); }); }); |
在上面的程式碼中,當你點選了wrapper時,它會切換class為.active。如果wrapper已經處於啟用狀態,它會移除class .active。
另外,如果你在下拉選單框外任何地方點選,都會關閉下拉選單框。
EXAMPLE 1
下面來看一些第一個demo的程式碼:
HTML
在第一個demo中,我們需要一個wrapper div,一個隱藏的下拉選單,還有一個在span中的“label”。
< div id = "dd" class = "wrapper-dropdown-1" tabindex = "1" > < span >Gender</ span > < ul class = "dropdown" > < li >< a href = "#" >Male</ a ></ li > < li >< a href = "#" >Female</ a ></ li > </ ul > </ div > |
CSS
首先從wrapper開始:
.wrapper-dropdown { /* Size and position */ position : relative ; /* Enable absolute positioning for children and pseudo elements */ width : 200px ; padding : 10px ; margin : 0 auto ; /* Styles */ background : #9bc7de ; color : #fff ; outline : none ; cursor : pointer ; /* Font settings */ font-weight : bold ; } |
在"label"上透過偽元素來新增小箭頭:
.wrapper-dropdown:after { content : "" ; width : 0 ; height : 0 ; position : absolute ; right : 16px ; top : 50% ; margin-top : -6px ; border-width : 6px 0 6px 6px ; border-style : solid ; border-color : transparent #fff ; } |
下面是下拉選單的樣式
.wrapper-dropdown -1 .dropdown { /* Size & position */ position : absolute ; top : 100% ; left : 0 ; /* Size */ right : 0 ; /* Size */ /* Styles */ background : #fff ; font-weight : normal ; /* Overwrites previous font-weight: bold; */ /* Hiding */ opacity : 0 ; pointer-events : none ; } |
再來給下拉選單中的元素一些樣式
.wrapper-dropdown -1 .dropdown li a { display : block ; text-decoration : none ; color : #9e9e9e ; padding : 10px 20px ; } /* Hover state */ .wrapper-dropdown -1 .dropdown li:hover a { background : #f3f8f8 ; } |
透過上面的CSS,我們有了一個很好看的按鈕和一個隱藏的下拉選單。下面要處理的是當點選了下拉選單主按鈕時,下拉選單框展開出現的效果。
我們使用javascript來在點選按鈕時切換class.active。
/* Active state */ .wrapper-dropdown -1 .active .dropdown { opacity : 1 ; pointer-events : auto ; } .wrapper-dropdown -1 .active:after { border-color : #9bc7de transparent ; border-width : 6px 6px 0 6px ; margin-top : -3px ; } .wrapper-dropdown -1 .active { background : #9bc7de ; background : linear-gradient(to right , #9bc7de 0% , #9bc7de 78% , #ffffff 78% , #ffffff 100% ); } |
這裡要注意三個地方:
- 1、我們使用將透明度設定為1是下拉選單框出現。這裡不要忘記設定pointer-event 為auto。
- 2、我們改變了小箭頭的方向和顏色。
- 3、我們使用一個漸變來修改了箭頭羨慕的背景色。
JAVASCRIPT
我們還需要javascript來顯示下拉選單項的值
function DropDown(el) { this .dd = el; this .placeholder = this .dd.children( 'span' ); this .opts = this .dd.find( 'ul.dropdown > li' ); this .val = '' ; this .index = -1; this .initEvents(); } DropDown.prototype = { initEvents : function () { var obj = this ; obj.dd.on( 'click' , function (event){ $( this ).toggleClass( 'active' ); return false ; }); obj.opts.on( 'click' , function (){ var opt = $( this ); obj.val = opt.text(); obj.index = opt.index(); obj.placeholder.text( 'Gender: ' + obj.val); }); }, getValue : function () { return this .val; }, getIndex : function () { return this .index; } } |
第一個demo的程式碼就這麼多,其餘幾個demo的程式碼請參考下載檔案。
FALLBACKS
為了相容所有的瀏覽器,這個外掛中做了一些回退處理。我們使用的是 Modernizr。Modernizr是一個用於檢測使用者瀏覽器是否支援html5和css3的javascript庫,他的基本思想是“如果瀏覽器不支援XXX,那麼我們就這樣這樣做。。。”。透過Modernizr,我們能為html新增class,例如:如果瀏覽器不支援 pointer-events ,就新增一個“no-pointerevents”的class。下面的例子說明了我們在瀏覽器不支援某些屬性時,如何管理我們的回退程式碼:
/* No CSS3 support */ .no-opacity .wrapper-dropdown-1 .dropdown, .no-pointerevents .wrapper-dropdown-1 .dropdown { display: none; opacity: 1; /* If opacity support but no pointer-events support */ pointer-events: auto; /* If pointer-events support but no pointer-events support */ } .no-opacity .wrapper-dropdown-1.active .dropdown, .no-pointerevents .wrapper-dropdown-1.active .dropdown { display: block; } |
如果瀏覽器不支援透明度或pointer-events,那麼簡單的將下拉選單框隱藏:display: none;。
如果瀏覽器支援透明度但是不支援pointer-events,在使用者點選選單時,我們將他們設定為auto,以使選單展開。
另外,如果瀏覽器支援pointer-events但不支援透明度,我們設定透明度為1來使下拉選單在切換為.active是立刻出現。
當.active被切換時,我們使用display: block;來顯示下拉選單框。