jquery制作属于自己的select自定义样式

由于原生select在各个浏览器的样式不统一,特别是在IE67下直接不可以使用样式控制,当PM让你做一个样式的时候,那是相当的痛苦。最好的办法就是使用自定义样式仿select效果。这里写了一个jquery插件,实现自定义的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 块级元素不支持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父级元素谨慎使用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() {

//解决多个select问题

$.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覆盖问题

$.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的值,并触发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));

使用效果图:

第二个是之前省市联动的插件生成之后,调用自定义select生成的 

自定义sleect优点:

  • 样式完全可控
  • 兼容IE系列浏览器
  • 使用方便,不影响默认的change事件处理

开发中遇到的问题:

1.线性渐变

    IE下使用filter: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#ffffff,endColorStr=#eeeeee);解决线性渐变问题,详解请参考下面的资料。

2.IE6 A 标签hover问题

    IE6不设置href属性,不会触发:hover样式

3.IE 67 块级元素display:inline-block

4.z-index层级问题

    改变处于active状态的自定select的z-index

5.css实现下三角,IE下透明问题

    设置透明部分的style值为dashed即可。

    border-style:solid dashed dashed dashed; 

如果觉得有用,可以推荐给朋友哦,小编愿意和大家共同进步。

以上是 jquery制作属于自己的select自定义样式 的全部内容, 来源链接: utcz.com/z/334214.html

回到顶部