基于jquery实现下拉框美化特效


Posted in Javascript onFebruary 02, 2016

平常我们用的原生select下拉框,大部分样式没办法修改,导致在不同的浏览器里面会跟设计图的风格大相径庭。所以为了能让它美化起来,就用JQ模拟了一个下拉框,可以随意定义样式。原生的下拉框也保留在div里面隐藏着,方便后台开发人员对其进行操作。

效果图如下:

基于jquery实现下拉框美化特效

HTML代码如下:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>下拉框美化</title>
 <link href="css/style.css" rel="stylesheet"/>
 <script src="js/jquery-1.9.1.min.js"></script>
 <script src="js/simSelect.js"></script>
 <script>
 $(function(){
 //下面是调用初始化语句,class名可通用,也可以ID单独定义
 $(".select-box").simSelect();  //什么参数都不带,默认样式。建议用这个,参数都写在div上面好了,比较直观。

 $(".slt-box01").simSelect({  //所有参数如下:
  maxNum: 4,      //最大下拉个数(超过则显示滚动条),默认为5 
  width: 250,      //下拉框盒子宽度,默认为200px。为避免过多的设置宽度,尽量依照项目中最常见的宽度设定css样式。
  direction: "down",    //下拉方向,默认down,另一个是up
  disabled: false     //是否禁用,默认不禁,禁的话是true
 });

 $(".slt-box02").simSelect({  //举例:这里写参数,div上面也写参数的情况。结果是:会以div上面的为准
  maxNum: 4,      
  width: 250,      
  direction: "down"
 });

 $(".slt-box03").simSelect({  //禁用下拉框的话,有三种写法,任选。建议第二种:
  disabled: true,     //一:这里的参数写disabled:true 二:给div加class="disabled" 三:给原生select加disabled="true"
  width: 250      
 });

 $("#slt-box04").simSelect();  //ID单独定义。单个option可以禁用
 });
</script>
</head>
<body>
 <!-- wrap和table非必需,用于布局而已 --> 
 <div class="wrap">
 <table width="600">
  <tbody>
  <tr>
   <th>不带参数:</th>
   <td><div class="select-box">
   <select>
    <option>第一个选项</option>
    <option>第二个选项</option>
    <option>第三个选项</option>
    <option>第四个选项</option>
    <option>第五个选项</option>
    <option>第六个选项</option>
   </select>
   </div></td>
  </tr>
  <tr>
   <th>初始化语句写了参数:</th>
   <td><div class="slt-box01">
   <select>
    <option>第一个选项</option>
    <option>第二个选项</option>
    <option>第三个选项</option>
    <option>第四个选项</option>
    <option>第五个选项</option>
    <option>第六个选项</option>
   </select>
   </div></td>
  </tr>
  <tr>
   <th>在div上面写参数:</th>
   <td><div class="slt-box02 up" max-num="6" width="300">
   <select>
    <option>第一个选项</option>
    <option>第二个选项</option>
    <option>第三个选项</option>
    <option>第四个选项</option>
    <option>第五个选项</option>
    <option>第六个选项</option>
   </select>
   </div></td>
  </tr>
  <tr>
   <th>禁用的样式:</th>
   <td><div class="slt-box03">
   <select>
    <option>第一个选项</option>
    <option>第二个选项</option>
    <option>第三个选项</option>
    <option>第四个选项</option>
    <option>第五个选项</option>
    <option>第六个选项</option>
   </select>
   </div></td>
  </tr>
  <tr>
   <th>其中一个选项禁用:</th>
   <td><div id="slt-box04" class="up" max-num="4" width="200">
   <select>
    <option>第一个选项</option>
    <option>第二个选项超长超长超长超长长啊</option>
    <option disabled="true">第三个选项</option>
    <option>第四个选项</option>
    <option>第五个选项</option>
    <option>第六个选项</option>
   </select>
   </div></td>
  </tr>
  </tbody>
 </table>
 </div>
</body>
</html>

CSS样式如下:

@charset "utf-8";
/* 简单reset */
body, ul, li {
 margin: 0;
 padding: 0;
}
body {
 font: 14px/24px Microsoft YaHei;
 color: #333;
}
ul { list-style: none; }
a {
 color: #333;
 outline: none;
 text-decoration: none;
}
table {
 border-collapse: collapse;
 border-spacing: 0;
 text-align: left;
}
/* 布局样式,非必须 */
.wrap {
 width: 600px;
 margin: 100px auto 0;
 padding: 20px;
 background-color: #d3f3dd;
}
.wrap table th, .wrap table td { padding: 8px 2px; }
.wrap table th {
 font-weight: normal;
 text-align: right;
}
/* 下拉框样式 必须 */
.select-style ul {
 list-style: none;
 padding: 0;
 margin: 0;
}
.select-style select { display: none; }
.select-style {
 position: relative;
 display: inline-block;
 font-family: Microsoft YaHei;
 color: #666;
 font-size: 14px;
 text-align: left;
 vertical-align: middle;
 z-index: 50;
}
.select-style.focus { z-index: 51; }
.select-style .slt-wrap {
 display: inline-block;
 width: 200px;
 border: solid 1px #d6d6d6;
 vertical-align: middle;
}
.select-style.focus .slt-wrap { border: solid 1px #53a8df; }
.select-style .slt-title {
 position: relative;
 display: block;
 padding: 0 36px 0 5px;
 line-height: 30px;
 height: 30px;
 text-decoration: none;
 background-color: #fff;
 word-break: break-all;
 color: #666;
 overflow: hidden;
}
.select-style .slt-title .slt-text {
 display: inline-block;
 height: 30px;
 *cursor: pointer;
}
.select-style .slt-title i {
 position: absolute;
 right: 0;
 top: 0;
 display: inline-block;
 width: 30px;
 height: 30px;
 background: url(../images/ico-select.png) 0 0 no-repeat;
 *cursor: pointer;
}
.select-style.focus .slt-title i { background-position: 0 -30px; }
.select-style.disabled .slt-title i { 
 background-position: 0 -60px;
 *cursor: default; 
}
.select-style .opn-box {
 display: none;
 position: absolute;
 left: 0;
 top: 31px;
 width: 100%;
}
.select-style.up .opn-box {
 top: auto;
 bottom: 31px;
}
.select-style .opn-box .opn-list {
 position: relative;
 _width: 100%;
 max-height: 130px;
 border: 1px solid #d6d6d6;
 background: #fff;
 overflow-y: auto;
 overflow-x: hidden;
}
.select-style.focus .opn-box .opn-list { border-color: #53a8df; }
.select-style .opn-box .opn-list li {
 display: block;
 _width: 100%;
 padding-left: 5px;
 line-height: 26px;
 height: 26px;
 overflow: hidden;
 white-space: nowrap;
 text-overflow: ellipsis;
 cursor: pointer;
}
.select-style .opn-box .opn-list .selected { background: #d4edfe; }
.select-style .opn-box .opn-list li:hover {
 color: #fff;
 background: #65abda;
}
.select-style .opn-box .opn-list li.disabled {
 color: #cacaca;
 background: #f0f0f0;
 cursor: default;
}
.select-style.disabled .slt-wrap { border: 1px solid #d6d6d6; }
.select-style.disabled .slt-title {
 color: #cacaca;
 background-color: #f0f0f0;
 cursor: default;
}
.select-style.disabled .slt-title .slt-text { *cursor: default; }
/* 下拉框样式 结束 */

Jquery代码如下:

/** 
 * Name : 美化下拉框 
 **/
 (function(jQuery){
  $.fn.simSelect = function (o) {
  o = $.extend({         //设置默认参数 
   maxNum: 5,         //最大显示5个
   width: 200,         //默认宽200px。为避免过多的设置宽度,尽量依照项目中最常见的宽度设定css样式。
   direction: "down",       //向下拉,另一个是up 
   disabled: false        //不可用时为true
  },o || {});
  return this.each(function(){     //构造开始
   if($(this).children(".slt-wrap")){   //去重复 
    $(this).children(".slt-wrap").remove();
   };
   var $ts = $(this),
    $select = $ts.find("select").eq(0),
    wid = parseFloat($ts.attr("width")),
    num = parseFloat($ts.attr("max-num")),
    $sltWrap = $("<div class='slt-wrap'></div>").prependTo($ts),
    $sltTit = $("<a class='slt-title' hidefocus='true' href='javascript:void(0);'><span class='slt-text'></span><i></i></a>").prependTo($sltWrap),
    $sltText = $(".slt-text", $sltTit),
    $opnBox = $("<div class='opn-box'><ul class='opn-list'></ul></div>").appendTo($sltWrap),
    $opnList = $(".opn-list", $opnBox);
   $ts.addClass("select-style");        //增加一个class专门作为写css样式用
   $select.find("option").each(function(i){     //循环生成li标签 
    var text = $(this).text(),
     $li = $("<li title='"+text+"'>"+text+"</li>").appendTo($opnList);
    if(this.selected){
     $li.addClass("selected");
     $sltText.text(text).attr("title",text); 
    };
    if(this.disabled){
     $li.addClass("disabled");
     return;
    };
   });
   var $li = $("li",$opnList),
    hei = $li.height();
   if(wid){             //设置宽度
    $ts.css("width",wid+"px");       //兼容IE6、7
    $sltWrap.css("width",wid-2+"px");        
   }else{
    $ts.css("width",o.width+"px");      //兼容IE6、7
    $sltWrap.css("width",o.width-2+"px");
   }; 
   if(num){             //设置高度
    $opnList.css("max-height", hei*num+"px");
   }
   else{
    $opnList.css("max-height", hei*o.maxNum+"px");
   };
   if(o.direction == "up"){         //设置上、下拉方向
    $ts.addClass("up");
   };
   $li.on("click",function(){         //li标签的点击事件,传给原生select
    var index = $opnList.find("li").index(this),
     text = $(this).text();
    if($(this).hasClass("disabled")){
     return false;
    };
    $(this).addClass("selected").siblings().removeClass("selected");
    $select.find("option").prop("selected",false).eq(index).prop("selected",true);
    $sltText.text(text).attr("title",text);
    $opnBox.hide();
    $ts.removeClass("focus");
   });
   $sltTit.on("click",function(e){        //a标签的点击下拉事件
    e.stopPropagation();         //阻止a标签的点击冒泡  
    if($opnBox.is(":hidden")){
     $(".select-style .opn-box").hide();     
     $(".select-style").removeClass("focus");
     $opnBox.show();
     $ts.addClass("focus");
    }
    else{
     $opnBox.hide();
     $ts.removeClass("focus");
    }
   });
   $select.on("change",function(){        //原生select的点击事件,传给ul
    var index = $(this).find("option:selected").index(),
     text = $li.eq(index).text();
    $li.eq(index).addClass("selected").siblings().removeClass("selected");
    $sltText.text(text).attr("title",text);
   });
   $(document).on("click",function(e){       //点击其他地方收起下拉框
    if($opnBox.is(":visible")){
     $opnBox.hide();
     $ts.removeClass("focus");
    } 
   });
   if($select.prop("disabled") == true || o.disabled == true || $ts.hasClass("disabled")){
    $sltTit.off("click");         //设置禁用状态
    $select.prop("disabled",true);
    $ts.addClass("disabled");
   };
  });
 };
})(jQuery);

兼容到IE7+(IE6其实也行,只是选项多于5个下面不会出现滚动条)。

如果大家还想深入学习,可以点击jquery下拉框效果汇总、JavaScript下拉框效果汇总进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
Ctrl+Enter提交内容信息
Jun 26 Javascript
锋利的jQuery jQuery中的DOM操作
Mar 21 Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 Javascript
js文件包含的几种方式介绍
Sep 28 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
Bootstrap基本样式学习笔记之图片(6)
Dec 07 Javascript
详解Vue 非父子组件通信方法(非Vuex)
May 24 Javascript
JS实现点击Radio动态更新table数据
Jul 18 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
AngularJS自动表单验证
Feb 01 #Javascript
javascript实现右侧弹出“分享到”窗口效果
Feb 01 #Javascript
AngularJS手动表单验证
Feb 01 #Javascript
基于JavaScript实现动态添加删除表格的行
Feb 01 #Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 #Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 #Javascript
理解javascript中的严格模式
Feb 01 #Javascript
You might like
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP将整数数字转换为罗马数字实例分享
2019/03/17 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
ES6的新特性概览
2016/03/10 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
浅谈Vue.nextTick 的实现方法
2017/10/25 Javascript
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
Python continue语句用法实例
2014/03/11 Python
python登陆asp网站页面的实现代码
2015/01/14 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Python分治法定义与应用实例详解
2017/07/28 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
python中eval与int的区别浅析
2019/08/11 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
学期个人工作总结
2015/02/13 职场文书
2015年度党员个人总结
2015/02/14 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Docker部署Mysql8的实现步骤
2022/07/07 Servers
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL