jquery制作屬于自己的select自定義樣式
由于原生select在各個(gè)瀏覽器的樣式不統(tǒng)一,特別是在IE67下直接不可以使用樣式控制,當(dāng)PM讓你做一個(gè)樣式的時(shí)候,那是相當(dāng)?shù)耐纯?。最好的辦法就是使用自定義樣式仿select效果。這里寫(xiě)了一個(gè)jquery插件,實(shí)現(xiàn)自定義的select(閹割了不少原生select的事件,但是最主要的都還在)
需要引用的樣式:
.self-select-wrapper{ position: relative; display: inline-block; border: 1px solid #d0d0d0; width: 250px; height:40px; font-size: 14px; } div.self-select-wrapper{ /*解決IE67 塊級(jí)元素不支持display:inline-block*/ *display:inline; } .self-select-wrapper .self-select-display{ display: inline-block; cursor: pointer; width:100%; height:40px; background: -moz-linear-gradient(top, #fff, #eee); background: -o-linear-gradient(top,#fff, #eee); background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#eee)); filter: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#ffffff,endColorStr=#eeeeee); } .self-select-display .self-select-text{ padding-left:10px; display: inline-block; line-height: 40px; width: 210px; } .self-select-display .self-select-arrow-down{ height:0; width:0; overflow: hidden; font-size: 0; line-height: 0; display: inline-block; vertical-align: middle; border-color:#aaa transparent transparent transparent; border-style:solid dashed dashed dashed; border-width:7px; } .self-select-wrapper .self-select-ul{ position: absolute; max-height:200px; _height:200px; border: 1px solid #ccc; background-color: #fff; top:41px; left:0px; overflow-y: auto; _overflow-y:auto !important; padding:0px; margin:0px; width: 100%; z-index:2014; display: none; } .self-select-wrapper .self-select-ul li{ list-style: none; } .self-select-ul .self-select-option{ line-height: 28px; cursor: pointer; display: block; padding-left:10px; text-decoration: none; color:#000; } .self-select-ul .self-select-option:hover, .self-select-ul .current{ background-color: #eee; }
js源碼:
/** * 解決自定義select自定義樣式需求 * select父級(jí)元素謹(jǐn)慎使用z-index */ (function($){ var tpl = '<div class="self-select-wrapper">'+ '<span class="self-select-display">'+ '<span class="self-select-text"></span>'+ '<i class="self-select-arrow-down"></i>'+ '</span>'+ '<ul class="self-select-ul"></ul>'+ '</div>'; $.fn.selfSelect = function(changeHandler){ var name = $(this).attr('name'); var $selects = $(this); function getSourceData($options) { var text = []; var value = []; $.each($options, function() { text.push($(this).html()); value.push($(this).attr('value')); }); return { text: text, value: value }; } function buildTpl($selfSelect, $select) { var valueArr =[]; var textArr = []; var optionTpl = ''; var $options = $select.find('option'); var sourceData = getSourceData($options); valueArr = sourceData.value; textArr = sourceData.text; $select.hide(); $selfSelect.find('.self-select-text').html(textArr[0]); $.each(textArr, function(seq, text) { optionTpl += '<li><a class="self-select-option" href="#" value="'+valueArr[seq]+'">'+text+'</a></li>'; }); $selfSelect.find('.self-select-ul').html(optionTpl); } function initSelect() { //解決多個(gè)select問(wèn)題 $.each($selects, function(i, selectEl) { var $selfSelect; var guid = Math.floor(Math.random()*100); var $select = $(selectEl); var $parent = $select.parent(); if(!$select.prev().hasClass('self-select-wrapper')) { $select.before(tpl); $select.prev().addClass('select-' + guid); $selfSelect = $parent.find('.select-' + guid); }else { $selfSelect = $select.prev(); } buildTpl($selfSelect, $select); initEvent($selfSelect, $select) }); } function initEvent($selfSelect, $select) { $selfSelect.find('.self-select-display').off('click').on('click', function() { var $selfSelects = $('body').find('.self-select-wrapper'); var isCliked = $(this).hasClass('clicked'); if(isCliked) { $(this).removeClass('clicked'); $selfSelect.find('.self-select-ul').slideUp('fast'); }else { $(this).addClass('clicked'); $selfSelect.find('.self-select-ul').slideDown('fast'); } //防止z-index覆蓋問(wèn)題 $.each($selfSelects, function(i, selectEl) { $(selectEl).css('z-index', 0); }); $selfSelect.css('z-index', 1); }); $selfSelect.find('.self-select-option').on('mousedown', function() { var text = $(this).html(); var value = $(this).attr('value'); $(this).parents('ul').slideUp('fast'); $selfSelect.find('.self-select-display').removeClass('clicked'); $selfSelect.find('.self-select-text').html(text); $(this).addClass('current'); $(this).parent().siblings().children().removeClass('current'); //修改select的值,并觸發(fā)change事件 $select.val(value); $select.trigger('change', value); }); $(document).on('mousedown', function(e) { if($(e.target).hasClass('self-select-ul') || $(e.target).parent().hasClass('self-select-display')) return; $selfSelect.find('.self-select-display').removeClass('clicked'); $selfSelect.find('.self-select-ul').slideUp('fast'); }); $select.on('change', function(e, val) { changeHandler && changeHandler(val); }); } initSelect(); return this; }; }(jQuery));
使用效果圖:
第二個(gè)是之前省市聯(lián)動(dòng)的插件生成之后,調(diào)用自定義select生成的
自定義sleect優(yōu)點(diǎn):
- 樣式完全可控
- 兼容IE系列瀏覽器
- 使用方便,不影響默認(rèn)的change事件處理
開(kāi)發(fā)中遇到的問(wèn)題:
1.線性漸變
IE下使用filter: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#ffffff,endColorStr=#eeeeee);解決線性漸變問(wèn)題,詳解請(qǐng)參考下面的資料。
2.IE6 A 標(biāo)簽hover問(wèn)題
IE6不設(shè)置href屬性,不會(huì)觸發(fā):hover樣式
3.IE 67 塊級(jí)元素display:inline-block
4.z-index層級(jí)問(wèn)題
改變處于active狀態(tài)的自定select的z-index
5.css實(shí)現(xiàn)下三角,IE下透明問(wèn)題
設(shè)置透明部分的style值為dashed即可。
border-style:solid dashed dashed dashed;
如果覺(jué)得有用,可以推薦給朋友哦,小編愿意和大家共同進(jìn)步。
以上就是jquery制作select自定義樣式的方法,希望大家喜歡。
相關(guān)文章
jquery select多選框的左右移動(dòng) 具體實(shí)現(xiàn)代碼
這篇文章介紹了jquery實(shí)現(xiàn)select多選框的左右移動(dòng)的方法,有需要的朋友可以參考一下2013-07-07快速實(shí)現(xiàn)jQuery多級(jí)菜單效果
這篇文章主要教大家如何快速實(shí)現(xiàn)jQuery多級(jí)菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02jquery限定文本框只能輸入數(shù)字即整數(shù)和小數(shù)
限定文本框只能輸入數(shù)字即整數(shù)和小數(shù),在某些特殊情況下還是比較實(shí)用的,下面有個(gè)不錯(cuò)的示例,通過(guò)jquery來(lái)簡(jiǎn)單實(shí)現(xiàn)下2013-11-11