• jquery插件-自定义select


        由于原生select在各个浏览器的样式不统一,特别是在IE67下直接不可以使用样式控制,当PM让你做一个样式的时候,那是相当的痛苦。最好的办法就是使用自定义样式仿select效果。这里写了一个jquery插件,实现自定义的select(阉割了不少原生select的事件,但是最主要的都还在)
     
        需要引用的样式:
       
     .self-select-wrapper{
        position: relative;
        display: inline-block;
        border: 1px solid #d0d0d0;
         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;
        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;
         210px;
    }
     
    .self-select-display .self-select-arrow-down{
        height:0;
        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-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;
         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;
     
    如果觉得有用,可以推荐一下~ 如果有问题,请回复共同探讨~
     
     
    参考资料:
    http://www.colorzilla.com/gradient-editor/ -- css3线性变化兼容各浏览器
    http://www.cnblogs.com/leejersey/archive/2012/07/11/2586506.html -- IE67下block元素设置成inline-block解决方案
    https://github.com/doyoe/blog/blob/master/posts/css/2014-01-21-你需要了解的z-index世界.md  -- z-index层级
  • 相关阅读:
    初始JSON
    JS异步加载的三种方式
    JS之事件
    关于null == 0?返回false的问题
    JS之类型转换
    金融(一)
    使用var声明的变量 和 直接赋值并未声明的变量的区别
    POJ2594 Treasure Exploration
    POJ1422 Air Raid
    Codevs1922 骑士共存问题
  • 原文地址:https://www.cnblogs.com/xiaoheimiaoer/p/3834356.html
Copyright © 2020-2023  润新知