zoukankan      html  css  js  c++  java
  • jQuery美化select下拉框

    想必很多朋友都知道,<select />、<input type="file" />默认是不能通过样式美化的。前几天在做一个项目的时候恰巧要用到一个select,并想通过样式美化它。于是在博客园里找了一下相关的解决办法,还好找到了一段比较满意的js。经过修改,现在可以兼容各大浏览器,并完全模仿<select />来实现相关功能。
      
      先看看实现的效果: 

      实现原理:

      模访select的外观,用js再构造一个"select"。原始的select html代码如:

    原始Html
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title></title>
    <style type="text/css">
    /*global css*/
    img
    {border:0}
    ul,li
    {list-style:none; margin:0; padding:0}
    .searchBar
    {width:590px; height:33px; padding-left:60px; padding-top:7px; margin:40px auto; background:url(images/bg02.gif) no-repeat}
    .searchBar .select
    {float:left; margin-right:8px; display:inline}
    .searchBar .text
    {float:left; margin-right:5px}
    .searchBar .text input
    {width:214px; height:20px; padding-left:4px; line-height:20px; border:1px solid #b7d1eb; color:#aaa}
    .btn
    {vertical-align:middle}
    /*---end---*/

    /*beautify select box css start*/
    .selectbox
    {width:82px; height:24px; padding-left:4px; line-height:24px; border:none; display:block; cursor:pointer; background:url(images/bg01.gif) no-repeat}
    div.selectbox-wrapper
    {width:63px; border:1px solid #b7d1eb; border-top:none; margin-top:-3px; position:absolute; text-align:left; background-color:#ffffff}
    div.selectbox-wrapper ul li
    {width:59px; padding-left:4px; cursor:pointer; line-height:20px; font-size:12px}
    div.selectbox-wrapper ul li.selected
    {background-color:#e0ecf7}
    div.selectbox-wrapper ul li.hover
    {color:#ffffff; background-color:#36c}
    /*---end---*/
    </style>
    <script src="../js/jquery-1.5.1.min.js" type="text/javascript"></script>
    <script src="js/beautifySelect.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    $(
    function () {
    $.BeautifySelect(document.getElementById(
    "c"));
    });
    </script>
    </head>
    <body>
    <div class="searchBar">
    <div class="select">
    <select id="c" style="display:none" name="c">
    <option value="1">生活信息</option>
    <option value="2">店铺商家</option>
    <option value="3">新闻资讯</option>
    <option value="4">团购活动</option>
    <option value="5">招聘信息</option>
    </select>
    </div>
    <div class="text">
    <input class="s_t" onblur="if(this.value==''){this.value='shuidd.com';this.style.color='#aaa'}"
    onfocus
    ="if(this.value=='shuidd.com'){this.value='';this.style.color='#000000'}"
    value
    ="shuidd.com" name="keyword"/>
    </div>
    <a href="#" class="btn"><img src="images/btn.gif" alt=""/></a>
    </div>
    </body>
    </html>

      通过js构造出来的"select"代码如:

    通过js构造出来的html
    <div class="searchBar">
    <div class="select">
    <input type="text" id="c_input" class="selectbox" autocomplete="off" readonly="" tabindex="0">
    <div id="c_container" class="selectbox-wrapper" style="display:none">
    <ul>
    <li id="c_input_1" class="selected">生活信息</li>
    <li id="c_input_2" class="">店铺商家</li>
    <li id="c_input_3" class="">新闻资讯</li>
    <li id="c_input_4" class="">团购活动</li>
    <li id="c_input_5" class="">招聘信息</li>
    </ul>
    </div>
    <select name="c" style="display:none" id="c">
    <option value="1">生活信息</option>
    <option value="2">店铺商家</option>
    <option value="3">新闻资讯</option>
    <option value="4">团购活动</option>
    <option value="5">招聘信息</option>
    </select>
    </div>
    <div class="text">
    <input name="keyword" value="shuidd.com" onfocus="if(this.value=='shuidd.com'){this.value='';this.style.color='#000000'}" onblur="if(this.value==''){this.value='shuidd.com';this.style.color='#aaa'}" class="s_t" style="color: rgb(170, 170, 170);">
    </div>
    <a class="btn" href="#"><img alt="" src="images/btn.gif"></a>
    </div>

      然后js将原始select中的项全部复制到一个ul的li中,并附上css样式来实现美化 ul li,来实现美化构造出的"select”,js代码如下:

    beautifySelect.js
    /*!
    * Date: 2011-3-29
    * Author: musical_insect
    * Content: beautify select box by jQuery and css
    */
    jQuery.fn.extend({
    beautifyselect:
    function (options) {
    returnthis.each(function () {
    new jQuery.BeautifySelect(this, options);
    });
    }
    });

    /* pawel maziarz: work around for ie logging */
    if (!window.console) {
    var console = {
    log:
    function (msg) {}
    }
    };

    jQuery.BeautifySelect
    =function (selectobj, options) {
    /// <summary>
    /// beautify select
    /// </summary>
    /// <param name="selectobj" type="Dom">select object</param>
    /// <param name="options" type="object">options,format:{inputClass:selectbox,containerClass:selectbox-wrapper,hoverClass:hover,selectedClass:selected}</param>
    var opt = options || {};
    opt.inputClass
    = opt.inputClass ||"selectbox";
    opt.containerClass
    = opt.containerClass ||"selectbox-wrapper";
    opt.hoverClass
    = opt.hoverClass ||"hover";
    opt.currentClass
    = opt.selectedClass ||"selected";
    opt.debug
    = opt.debug ||false;

    var elm_id = selectobj.id;
    var active =0;
    var hasfocus =0;
    //jquery object for select element
    var $select = $(selectobj);
    // jquery container object
    var $container = setupContainer(opt);
    //jquery input object
    var $input = setupInput(opt);
    // hide select and append newly created elements
    $select.hide().before($input).before($container);

    init();

    $input.click(
    function (event) {
    $container.toggle();
    }).keydown(
    function (event) {
    switch (event.which) {
    case38: // up
    event.preventDefault();
    moveSelect(
    -1);
    break;
    case40: // down
    event.preventDefault();
    moveSelect(
    1);
    break;
    //case 9: // tab
    case13: // enter
    event.preventDefault(); // seems not working in mac !
    $('li.'+ opt.hoverClass).trigger('click');
    break;
    case27: //escape
    hideMe();
    break;
    }
    }).blur(
    function () {
    if ($container.is(':visible') && hasfocus >0) {
    if (opt.debug) console.log('container visible and has focus')
    }
    else {
    try {
    // Workaround for ie scroll - thanks to Bernd Matzner
    if ($.browser.msie || $.browser.safari) { // check for safari too - workaround for webkit
    if (document.activeElement.getAttribute('id').indexOf('_container') ==-1) {
    hideMe();
    }
    else {
    $input.focus();
    }
    }
    else {
    hideMe();
    }
    }
    catch (Error) { hideMe(); }
    }
    });

    //隐藏下拉菜单容器
    function hideMe() {
    hasfocus
    =0;
    $container.hide();
    }

    //初始化下拉菜单
    function init() {
    $container.append(getSelectOptions($input.attr(
    'id'))).hide();
    }

    //初始化下拉菜单容器并进行相关设置
    function setupContainer(options) {
    var container = document.createElement("div");
    $container
    = $(container);
    $container.attr(
    'id', elm_id +'_container');
    $container.addClass(options.containerClass);
    return $container;
    }

    //初始化下拉菜单并进行相关设置
    function setupInput(options) {
    var input = document.createElement("input");
    var $input = $(input);
    $input.attr(
    "id", elm_id +"_input");
    $input.attr(
    "type", "text");
    $input.addClass(options.inputClass);
    $input.attr(
    "autocomplete", "off");
    $input.attr(
    "readonly", "readonly");
    $input.attr(
    "tabIndex", $select.attr("tabindex")); // "I" capital is important for ie
    return $input;
    }

    //处理下拉菜单响应键盘上的上、下键
    function moveSelect(step) {
    var lis = $("li", $container);
    if (!lis || lis.length ==0) returnfalse;
    active
    += step;
    //loop through list
    if (active <0) {
    active
    = lis.size() -1;
    }
    elseif (active > lis.size() -1) {
    active
    =0;
    }
    scroll(lis, active);
    lis.removeClass(opt.hoverClass);

    $(lis[active]).addClass(opt.hoverClass);
    $input.val($(lis[active]).html());
    }

    function scroll(list, active) {
    var el = $(list[active]).get(0);
    var list = $container.get(0);
    if (el.offsetTop + el.offsetHeight > list.scrollTop + list.clientHeight) {
    list.scrollTop
    = el.offsetTop + el.offsetHeight - list.clientHeight;
    }
    elseif (el.offsetTop < list.scrollTop) {
    list.scrollTop
    = el.offsetTop;
    }
    }

    //处理当前选择中的值
    function setCurrent() {
    var li = $("li."+ opt.currentClass, $container).get(0);
    var ar = (''+ li.id).split('_');
    var el = ar[ar.length -1];
    $select.val(el);
    $input.val($(li).html());
    returntrue;
    }

    //获取当前选中项的索引
    function getCurrentSelected() {
    return $select.val();
    }

    //获取当前选中项的值
    function getCurrentValue() {
    return $input.val();
    }

    //获取下拉菜单的选择项
    function getSelectOptions(parentid) {
    var select_options =new Array();
    var ul = document.createElement('ul');
    $select.children(
    'option').each(function () {
    var li = document.createElement('li');
    li.setAttribute(
    'id', parentid +'_'+ $(this).val());
    li.innerHTML
    = $(this).html();
    if ($(this).is(':selected')) {
    $input.val($(
    this).html());
    $(li).addClass(opt.currentClass);
    }
    ul.appendChild(li);
    $(li).mouseover(
    function (event) {
    hasfocus
    =1;
    if (opt.debug) console.log('over on : '+this.id);
    jQuery(event.target, $container).addClass(opt.hoverClass);
    }).mouseout(
    function (event) {
    hasfocus
    =-1;
    if (opt.debug) console.log('out on : '+this.id);
    jQuery(event.target, $container).removeClass(opt.hoverClass);
    }).click(
    function (event) {
    var fl = $('li.'+ opt.hoverClass, $container).get(0);
    if (opt.debug) console.log('click on :'+this.id);
    $(
    '#'+ elm_id +'_container'+' li.'+ opt.currentClass).removeClass(opt.currentClass);
    $(
    this).addClass(opt.currentClass);
    setCurrent();
    //$select.change();
    $select.get(0).blur();
    hideMe();
    });
    });
    return ul;
    }
    };
  • 相关阅读:
    BIEE变量总结
    微信支付回调问题
    内网搭建WEB服务器教程(转载)
    c#简体繁体转换
    js页面之间函数调用
    数据库性能优化一:SQL索引一步到位
    EasyUI兼容IE问题
    SQL函数说明大全
    经典SQL语句大全(绝对的经典)
    Sql Server 常用系统存储过程大全
  • 原文地址:https://www.cnblogs.com/liangle/p/2512533.html
Copyright © 2011-2022 走看看