DIV+CSS實現仿SELECT下拉框程式碼(JQUERY)
阿新 • • 發佈:2019-01-04
wangking 寫道
下拉框特點:
1.可自定義下拉框的高度和寬度。
2.無需使用者寫多餘程式碼,就和用原生態的SELECT一樣的原理,使用簡單。
3.功能強大,在下拉框中增加了extraData DIV層,供使用者自定義特殊需求,當然使用者也可以不選擇使用extraData DIV層,用普通的SELECT即可。
1.可自定義下拉框的高度和寬度。
2.無需使用者寫多餘程式碼,就和用原生態的SELECT一樣的原理,使用簡單。
3.功能強大,在下拉框中增加了extraData DIV層,供使用者自定義特殊需求,當然使用者也可以不選擇使用extraData DIV層,用普通的SELECT即可。
下拉框截圖:
具體程式碼:
<!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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>下拉框測試</title> <script type="text/javascript" src="__JS__/jquery.min.js"></script> <style type="text/css"> <!-- body {padding:10px;} * {margin:0; padding:0; font-size:12px;} ul,li {list-style-type:none;} .select {width:150px; height:25px; border:1px solid #ccc; padding-left:10px;} .defaultItem{background:url(__IMAGE__/select_arrow.gif) no-repeat right center white;} .select span {cursor:pointer; display:block; width:100%; height:100%;overflow:hidden;} .select table {height:100%;} .select td {vertical-align:middle;} .select ul{width:181px;} .select ul li {cursor:pointer;} .select .items {overflow-y: scroll; overflow-x: hidden;max-height:148px; height:148px;width:180px; position:absolute;border:1px dashed #ccc; background:#fff;z-index:999;display:none;} .select .items li {display:block; line-height:25px; padding-left:10px;} .select .hover,.onhover {background:#ccc;} .select .extraData{position:absolute;line-height:20px;padding-left:10px; padding-top:5px; padding-bottom:5px;border:1px dashed #ccc;background:white;display:none;} --> </style> <script type="text/javascript"> var isItemHover = 0; // ITEM是否正在HOVER使用,供清楚ONHOVER狀態 var delayTime4Select = null; //延遲消失下拉框 var selectUsingObj = ""; //正在使用哪個SELECT,供MOUSE OVER AND OUT時使用 var selectCloseUsing = 0; //是否在執行關閉操作 var isClickSelectTextObj = 0; //是否點選了SELECT控制元件裡的輸入框 $(document).ready(function(){ $(".select :text").click(function(){ //當滑鼠點選了.select裡面的任何一個輸入框,則取消掉[滑鼠移出焦點後,自動消失事件] isClickSelectTextObj = 1; }); $('.defaultItem').click(function(event){ //滑鼠點選[請選擇],彈出下拉框 if(selectCloseUsing == 1){ return; } var parentObj = $(this).parent(); if(selectUsingObj != "" && selectUsingObj != parentObj.attr("idtag")){ $("[idtag='"+selectUsingObj+"']").find('ul.items').hide(); $("[idtag='"+selectUsingObj+"']").find('.extraData').hide(); } if(selectUsingObj != ""){ //點選事件[執行關閉SELECT]操作 clearTimeout(delayTime4Select); selectCloseUsing = 1; var itemsOBJ = parentObj.find('ul.items');; itemsOBJ.hide(); var extraOBJ = $("[idtag='"+selectUsingObj+"']").find(".extraData"); extraOBJ.hide(); selectUsingObj = ""; delayTime4Select = setTimeout(function(){ selectCloseUsing = 0; isClickSelectTextObj = 0; },200); }else{ //點選事件[執行開啟SELECT]操作 selectUsingObj = parentObj.attr("idtag"); clearTimeout(delayTime4Select); var selectWidth = parentObj.width(); //動態設定ul.items寬度 var selectHeight = parentObj.height(); //動態設定ul.items的TOP偏移量 var id = parentObj.attr("idtag"); var hiddenVal = ""; //隱藏域的值,用來顯示選中ITEM項 var element=$("#"+id); if(element.length > 0){ hiddenVal = $("#"+id).val(); } var itemsOBJ = parentObj.find('ul.items'); itemsOBJ.css("width",selectWidth+11); itemsOBJ.css({top:parentObj.offset().top+selectHeight,left:parentObj.offset().left}); itemsOBJ.show(); //找到ul.items顯示 var extraOBJ = parentObj.find(".extraData"); if(extraOBJ.length > 0){ //SELECT額外資料DIV存在 extraOBJ.css("width",selectWidth+1); extraOBJ.css({top:parentObj.offset().top+selectHeight+itemsOBJ.height(),left:parentObj.offset().left}); extraOBJ.show(); } parentObj.find('li').hover(function(){ isItemHover = 1; $(this).addClass('hover'); $(this).parent().find('li').removeClass('onhover'); }, function(){ $(this).removeClass('hover'); });//li的hover效果 if(isItemHover == 0){ itemsOBJ.find("li").each(function(){ if(hiddenVal == $(this).attr("value")){ $(this).addClass('onhover'); } }); } } }); $('.select,.extraData').mouseover(function(event){ selectCloseUsing = 0; }); $('.select,.extraData').mouseout(function(event){ selectCloseUsing = 1; var toElement = null; if ($.browser.mozilla){ //火狐下不支援toElement toElement = event.relatedTarget; }else{ toElement = event.toElement; } if($(this)[0].contains(toElement)){ //如果是內部元素,則不執行以下程式碼 return; } var itemsOBJ = null; if($(this).attr("class") == "select"){ itemsOBJ = $(this).find('ul.items'); }else{ itemsOBJ = $(this).parents("div").find('ul.items'); } delayTime4Select = setTimeout(function(){ if(selectCloseUsing == 1 && isClickSelectTextObj == 0){ itemsOBJ.hide(); var extraOBJ = $("[idtag='"+selectUsingObj+"']").find(".extraData"); if (extraOBJ.length > 0) { extraOBJ.hide(); } isItemHover = 0; selectUsingObj = ""; } },3000); }); $('ul.items li').live("click",function(){ selectCloseUsing = 1; var parentDiv = $(this).parents("div"); parentDiv.find('td').html($(this).html()); var id = parentDiv.attr("idtag"); var element=$("#"+id); if(element.length > 0){ $("#"+id).val($(this).attr("value")); }else{ parentDiv.after('<input type="hidden" id="'+id+'" name="'+id+'" value="'+$(this).attr("value")+'"/>'); } parentDiv.find('ul').hide(); var extraOBJ = $("[idtag='"+selectUsingObj+"']").find(".extraData"); if (extraOBJ.length > 0) { extraOBJ.hide(); } selectUsingObj = ""; isItemHover = 0; delayTime4Select = setTimeout(function(){ selectCloseUsing = 0; isClickSelectTextObj = 0; },200); }); }); //給firefox定義contains()方法,ie下不起作用 if(typeof(HTMLElement)!="undefined"){ HTMLElement.prototype.contains=function(obj){ while(obj!=null&&typeof(obj.tagName)!="undefind"){ //通過迴圈對比來判斷是不是obj的父元素 if(obj==this) return true; obj=obj.parentNode; } return false; }; } function closeSelect(obj){ selectCloseUsing = 1; var itemsOBJ = $(obj).parents("div").find('ul.items');; itemsOBJ.hide(); var extraOBJ = $("[idtag='"+selectUsingObj+"']").find(".extraData"); extraOBJ.hide(); selectUsingObj = ""; delayTime4Select = setTimeout(function(){ selectCloseUsing = 0; isClickSelectTextObj = 0; },200); } </script> </head> <body> <div idtag="name" class="select" style="width:521px;height:50px;"> <span class="defaultItem"><table><tr><td>請選擇...</td></tr></table></span> <ul class="items"> <li value="1111">選項一</li> <li value="2222">選項二</li> <li value="3333">選項三</li> <li value="4444">選項四</li> <li value="5555">選項五</li> <li value="6666">選項六</li> <li value="7777">選項七</li> <li value="8888">選項八</li> <li value="9999">選項九</li> <li value="0000">選項十</li> </ul> <div class="extraData"> <input type="text" id="aaa" value="Close"/> 這個DIV層屬於擴充套件層,使用者可根據自己需求確定是否需要這個。<input type="button" id="aaa" value="Close" onclick="closeSelect(this)"/></div> </div> <br/><br/><br/> <!-- SELECT.......[開始] --> <div idtag="users" class="select"> <span class="defaultItem"><table><tr><td>請選擇...</td></tr></table></span> <ul class="items"> <li value="1">wangking</li> <li value="2">jiaojiao</li> </ul> </div> <!-- SELECT.......[結束] --><br/><br/><br/> <input type="text" id="testinput" /><br/><br/><br/> <input type="text" id="haha" /> </body> </html>
怎麼使用?如下:
INCLUDE CSS AND JS。。。。 THEN。。。 這個是原生態的SELECT: <select name="users" id="users"> <option value="1">wangking</option> <option value="2">jiaojiao</option> </select> 則對應改為: <div idtag="users" class="select"> <span class="defaultItem"><table><tr><td>請選擇...</td></tr></table></span> <ul class="items"> <li value="1">wangking</li> <li value="2">jiaojiao</li> </ul> </div>
PS: 歡迎共同討論交流。