zoukankan      html  css  js  c++  java
  • select添加皮肤 jquery

    由于select修改样式不能兼容浏览器,也不能随意修改,那么就需要模拟select,给select添加皮肤了,代码如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
    	<meta charset="UTF-8">
    	<title>Document</title>
    	<script src="js/jquery-1.8.2.min.js"></script>
    	<style>
    	*{ margin:0; padding:0; }
    	.mydiv{ 350px; margin-top:100px; }
    	select{ margin:10px; }
    	/*js相关css*/
    	.cl{ zoom:1; }
    	.cl:after{ display:block; 0; height:0; content:''; clear:both; overflow:hidden; }
    	.js-select-box{ position:relative; display:inline-block; }
    	.js-select-box ul,.js-select-box li{ list-style:none; }
    	.js-select-box a{ text-decoration:none; }
    	.js-select-tit{ cursor:pointer; 100%; height:100%; border:1px solid #eee; height:30px; line-height:30px; }
    	.js-select-tit span{ display:inline-block; text-overflow:ellipsis; white-space:nowrap; margin-left:5px; height:100%; }
    	.js-select-tit .js-arr{ position:absolute; top:50%; margin-top:-3px; right:5px; display:inline-block; 0; height:0; border:6px solid transparent; border-top:6px solid #aaa; }
    	.js-select-menu{ 100%; border:1px solid #eee; position:absolute; top:33px; background-color:#fff; display:none; max-height:150px; overflow-y:auto; }
    	.js-select-menu li a{ display:block; padding:0 10px; height:25px; line-height:25px; text-overflow:ellipsis; white-space:nowrap; }
    	.js-select-menu li a:hover,.js-select-menu li.active a{ background-color:#f4f4f4; }
    	
    	.select1{ height:40px; line-height:40px; }
    	</style>
    </head>
    <body>
    <div class="mydiv cl">
    	<select style="150px;">
    		<option value="1">aaaa</option>
    		<option value="2">bbbb</option>
    		<option value="3">cccc</option>
    	</select>
    	
    	<select style="150px;" id="select2">
    		<option value="21">aaaa2</option>
    		<option value="22">bbbb2</option>
    		<option value="23">cccc2</option>
    		<option value="24">dddd2</option>
    	</select>
    </div>
    	<select style="120px;" class="select3">
    		<option value="31">aaaa3</option>
    		<option value="32">bbbb3</option>
    	</select>
    	<div class="cl">
    		<select style="120px;" class="select1">
    			<option value="11">aaaa1</option>
    			<option value="12">bbbb1</option>
    			<option value="13">cccc1</option>
    			<option value="14">dddd1</option>
    			<option value="15">eeee1</option>
    			<option value="16">ffff1</option>
    			<option value="17">gggg1</option>
    			<option value="18">hhhh1</option>
    			<option value="19">iiii1</option>
    			<option value="101">jjjj1</option>
    			<option value="102">kkkk1</option>
    		</select>
    	</div>
    	<script>
    	//创建节点
    	function selectFun(dom,opt){
    		var $dom = $(dom);
    		var dtw = this.dtw = $dom.outerWidth();//宽度
    		this.box = $('<div class="js-select-box"></div>');
    		this.tit = $('<div class="js-select-tit" style="'+(dtw-2)+'px"><i class="js-arr"></i></div>');
    		this.titSpan = $('<span style="'+(dtw-7)+'px"></span>');
    		this.menu = $('<div class="js-select-menu"></div>');
    
    		this.box.append(this.tit.append(this.titSpan)).append(this.menu);
    
    		this.dom = dom;
    		this.cfg = this.getConfig(opt);
    		
    		//追加节点
    		if($dom.attr("data-skin") === "true"){
    			$dom.next("div.js-select-box").remove();
    		}else{
    			$dom.attr("data-skin","true");
    		}
    		$dom.after(this.box);
    		$dom.hide();
    		
    		//设置样式
    		this.box.css({"margin-top":$dom.css("marginTop"),"margin-right":$dom.css("marginRight"),"margin-bottom":$dom.css("marginBottom"),"margin-left":$dom.css("marginLeft"),"width":dtw});
    		this.tit.addClass($dom.prop("className"));
    		$dom.prop("id") ? this.tit.prop("id",$dom.prop("id")) : "";
    		this.addMenu(dom);
    
    		//事件
    		this.bindEvent(dom);
    	}
    	var selectDom = null;
    	selectFun.create = function(dom,opt){
    		return new selectFun(dom,opt);
    	}
    	selectFun.prototype.getConfig = function(opt){
    		var cfg = $.extend({
    			val: "",//默认值
    			clsName: "active",//当前class
    			inx: 0,//已选择的索引
    			callback: null //返回函数
    		},opt || {});
    		return cfg;
    	}
    	selectFun.prototype.setPosition = function(sibMenu){//设置下拉位置
    		var wth = $(window).height();
    		var ty = sibMenu.offset().top;
    		var domth = sibMenu.outerHeight(true);
    		var titTh = sibMenu.siblings("div.js-select-tit").outerHeight(true);
    		
    		if((ty+domth) > wth){
    			sibMenu.css({"top":"auto","bottom":(titTh+1)+"px"});
    		}else{
    			sibMenu.css({"top":(titTh+1)+"px","bottom":"auto"});
    		}
    	}
    	selectFun.prototype.addMenu = function(dom){//添加下拉
    		var optDoms = $(dom).find("option");
    		var ulDom = $("<ul></ul>");
    		var liDom = "";
    		var val = this.cfg.val;//已选择的value
    		for(var i=0; i<optDoms.length; i++){//创建li
    			if(val === ""){
    				this.titSpan.text(optDoms.eq(0).text());
    				this.cfg.inx = 0;
    			}else if(optDoms[i].value == val){
    				this.titSpan.text(optDoms.eq(i).text());
    				this.cfg.inx = i;
    			}
    			liDom += '<li class="js-select-items" data-val="'+optDoms[i].value+'"><a href="javascript:;">'+optDoms.eq(i).text()+'</a></li>'
    		}
    		ulDom.html(liDom);
    		this.menu.append(ulDom).width(this.dtw-2);//添加下拉
    
    		ulDom.find("li").eq(this.cfg.inx).addClass(this.cfg.clsName);//添加class
    	}
    	selectFun.prototype.hideEvent = function(sibMenu,selectBox){//隐藏(下拉,select框)
    		if(selectBox){
    			selectBox = sibMenu.parent("div.js-select-box");
    		}
    		sibMenu.hide().css({"top":(sibMenu.siblings("div.js-select-tit").outerHeight(true)+1)+"px","bottom":"auto"});;
    		selectBox.css("z-index",1);	
    	}
    	selectFun.prototype.bindEvent = function(dom){
    		var self = this;
    		self.tit.click(function(){
    			var $tTit = $(this);
    			var $tp = $tTit.parent("div.js-select-box");
    			var sib = $tTit.siblings("div.js-select-menu");
    			var tpSib = $("div.js-select-box");
    			if(sib.is(":hidden")){
    				//隐藏已展开的select
    				var sibMenu = tpSib.find("div.js-select-menu").not(":hidden");
    				
    				self.hideEvent(sibMenu,sibMenu.parents("div.js-select-box"));//隐藏
    
    				sib.show();
    				$tp.css("z-index",9);
    
    				self.setPosition(sib);//位置
    				selectDom = self;
    			}else{
    				self.hideEvent(sib,$tp);//隐藏
    				selectDom = null;
    			}
    		});
    		self.menu.on("click","li",function(){
    			self.setVal($(this),self.dom);
    		});
    		$(document).click(function(e){
    			var tag = $(e.target || window.event.srcElement);
    			var boxDom = $("div.js-select-box").not(":hidden");
    			if(tag.hasClass("js-select-box") || tag.parents("div.js-select-box").length > 0){
    				return;
    			}else{
    				self.hideEvent(boxDom.find("div.js-select-menu"),boxDom);//隐藏
    			}
    		});
    	}
    	selectFun.keyDownFun = function(e){
    		var self = selectDom;
    		var sib = $("div.js-select-menu").not(":hidden");
    		var sibTp = sib.parents("div.js-select-box");
    		var dom = sibTp.prev("select")[0];
    		var lis = sib.find("li.active");
    		var code = e.keyCode;
    		var nextOrPrev,clsName;
    		if(!self){
    			return;
    		}
    		clsName = self.cfg.clsName;
    		switch(code){
    		  case 40:
    			nextOrPrev = self.nextOrPrevDom(lis,true);//添加class
    			nextOrPrev.addClass(clsName).siblings("li").removeClass(clsName);
    			self._scrollToItem(nextOrPrev);
    			break;
    		  case 38:
    		    nextOrPrev = self.nextOrPrevDom(lis,false);//添加class
    			nextOrPrev.addClass(clsName).siblings("li").removeClass(clsName);
    			self._scrollToItem(nextOrPrev);
    			break;
    		  case 13:
    		  	self.setVal(lis,dom);
    		    break;
    		  case 27:
    		  	self.hideEvent(sib,sibTp);//隐藏
    		    break;
    		  default:break;
    		}
    	}
    	selectFun.prototype.nextOrPrevDom = function(curDom,isNext){
    		var obj = null;
    		if(isNext){
    			obj = curDom.next();
    			if(obj.length <= 0){
    				obj = curDom.parents("div.js-select-menu").find("li").eq(0);
    			}
    		}else{
    			obj = curDom.prev();
    			if(obj.length <= 0){
    				obj = curDom.parents("div.js-select-menu").find("li:last");
    			}
    		}
    		return obj;
    	}
    	selectFun.prototype._scrollToItem = function(item){
    		var menuDom = item.parents(".js-select-menu");
    		menuDom.scrollTop((menuDom.find("li").height()*item.index())/2);
    	};
    	selectFun.prototype.setVal = function(t,dom){//设置内容
    		var inx = t.index();
    		var txt = t.text();
    		var dataVal = t.data("val");
    		var tp = t.parents("div.js-select-menu");
    		var fn = new Function();
    		tp.siblings("div.js-select-tit").find("span").text(txt);
    		this.hideEvent(tp,tp.parent("div.js-select-box"));//隐藏
    		t.addClass(this.cfg.clsName).siblings("li").removeClass(this.cfg.clsName);//添加class
    		$(dom).find("option").eq(inx).prop("selected",true);//select赋值
    		if((typeof this.cfg.callback).toLowerCase() === "function"){
    			this.cfg.callback(dataVal,txt,inx);//已选择的:val,text,索引	
    		}
    		$(dom).trigger("change");
    	}
    
    	$.fn.extend({
    		selecter : function(options){
    			this.each(function(i,dom){
    				selectFun.create(dom,options);
    			});
    		}
    	});
    	$(document).on("keydown",selectFun.keyDownFun);
    	$("select").selecter();
    	$(".select1").selecter({"callback":function(v,txt,i){
    		console.log(v,txt,i);
    	}});
    	$("select").change(function(){
    		alert($(this).val());
    	});
    	</script>
    </body>
    </html>
    

      但在这在ie7上有点儿小样式问题,不过可以通过修改样式解决,从而到达自己想要的效果。

    select的onchange事件的函数,可以通过callback来完成。

  • 相关阅读:
    第六次学习笔记
    第四篇笔记
    第三篇学习笔记
    第二篇学习笔记
    第一篇学习笔记
    px与dp、sp之间的转换
    SQLite的使用(二):数据增删改查
    Logcat的级别以及Logcat的调试使用
    Android 创建服务(一)
    简说SQLite
  • 原文地址:https://www.cnblogs.com/cyj7/p/4633954.html
Copyright © 2011-2022 走看看