模擬select下拉選單詳解
本章節分享一段程式碼例項,它模擬紅絲線了select下拉選單效果。
畢竟自帶的<select>下拉控制元件不夠美觀。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼執行程式碼<!DOCTYPE html> <html> <head> <title>模擬select</title> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <style type="text/css"> * { margin: 0; padding: 0; } a { text-decoration: none; } body { background-color: #dadada; } li { list-style: none; } .select_div { position: relative; width: 250px; margin: 50px auto; border: 1px solid #d2d2d2; background-color: #fff; -webkit-user-select: none; /* Chrome all / Safari all */ -moz-user-select: none; /* Firefox all */ -ms-user-select: none; /* IE 10+ */ user-select: none; } .select_spn { display: block; padding: 10px; padding-right: 20%; background: url(images/icon1.png) no-repeat; background-position: 95% center; background-size: 0.8em; cursor: pointer; } .option_list { position: absolute; left: 0; bottom: -97px; width: 100%; background-color: #fff; border-bottom: 1px solid #d2d2d2; display: none; } .option_list > li { padding: 5px 10px; } .option_list > li:hover { background-color: #23d; color: #fff; } </style> <script type="text/javascript"> window.onload=function(){ // 自執行 (function(){ // 獲取元素 支援ie8+ var aBtn1=$(".select_spn"); var aBox=$(".option_list"); var aLi=null; // 迴圈繫結事件 for (var index = 0, len = aBtn1.length; index < len; index++) { // 開關 aBtn1[index].isShow = true; // 繫結開啟框子 aBtn1[index].onclick = function (e) { for(var j=0;j<len;j++){ aBtn1[j].parentNode.style.zIndex=1; } this.parentNode.style.zIndex=100; var list_obj=getNextEle(this); // 先關閉所有的框子 list_obj.style.display="none"; if(this.isShow){ this.isShow=false; list_obj.style.display="block"; } else { this.isShow=true; list_obj.style.display="none"; } // 取消事件冒泡 stopBubble(e); } } // 點選任意一處關閉框子 document.onclick=function(e){ for (var index = 0, len = aBox.length; index < len; index++) { aBox[index].style.display = "none"; aBtn1[index].isShow = true; } } // 選中專案 for (var index = 0, len = aBox.length; index < len; index++) { var aLi = $("li", aBox[index]); for(var j=0,li_len=aLi.length;j<li_len;j++){ aLi[j].point_ele = index; aLi[j].onclick=function(){ var txt=this.getAttribute("value")?this.getAttribute("value"):""; aBtn1[this.point_ele].innerHTML=txt; aBtn1[this.point_ele].setAttribute("value",txt); } } } })(); } // 獲取元素 function $(str,oPar){ var a=oPar?oPar.querySelectorAll(str):document.querySelectorAll(str); if(str.indexOf("#")!=-1){ a[0].index=0; return a[0] } else { for (var index = 0, len = a.length; index < len; index++) { a[index].index = index; } return a; } } function getNextEle(obj){ if(obj.nextSibling!="undefined"){ if(obj.nextSibling.nodeType==1){ return obj.nextSibling; } else { return arguments.callee(obj.nextSibling); } }else { return null } } // 阻止事件冒泡 function stopBubble(e){ if(e && e.stopPropagation){ e.stopPropagation(); } else{ window.event.cancelBubble=true; } return false; } </script> </head> <body> <div class="select_div" id="div1"> <span class="select_spn" value="value">我是選中項</span> <ul class="option_list"> <li value="上海">上海</li> <li value="廣東">廣東</li> <li value="南京">南京</li> </ul> </div> <div class="select_div" id="div2"> <span class="select_spn" value="value">我是選中項</span> <ul class="option_list"> <li value="上海">上海</li> <li value="廣東">廣東</li> <li value="南京">南京</li> </ul> </div> </body> </html>
上面的程式碼實現了我們的要求,下面介紹一下它的實現過程。
一.程式碼註釋:
(1).window.onload=function(){},當文件內容完全載入完畢再去執行函式中的程式碼。
(2).(function(){})(),一個匿名自執行函式。
(3).var aBtn1=$(".select_spn"),獲取指定的元素,$()函式在後面會介紹。
(4).var aLi=null,宣告一個變數,並賦值為null。
(5).for (var index = 0, len = aBtn1.length; index < len; index++) {},遍歷集合中的每一個元素,這裡是模擬實現的select下拉選單的span元素。
(6).aBtn1[index].isShow = true,為當前元素物件新增一個isShow屬性,並賦值為true,作用後面介紹。
(7).aBtn1[index].onclick = function (e) {},為span元素註冊onclick事件處理函式。
(8)for(var j=0;j<len;j++){
aBtn1[j].parentNode.style.zIndex=1;
},將所有span元素的父元素,也就是div元素的z-index屬性值設定為1。
(9).this.parentNode.style.zIndex=100,將當前span元素的父元素的z-index屬性值設定為100,當前下拉選單就可以覆蓋另一個。
(10).var list_obj=getNextEle(this),獲取span元素的下一個元素,也就是下拉選單ul元素。
(11).list_obj.style.display="none",下拉選單隱藏。
(12).if(this.isShow){
this.isShow=false;
list_obj.style.display="block";
}
else {
this.isShow=true;
list_obj.style.display="none";
},根據isShow識別符號的值,來設定下拉選單的隱藏和顯示。
(13).stopBubble(e),取消時間冒泡,因為在後面程式碼中,document也註冊有onclick事件處理函式。
(14).document.onclick=function(e){
for (var index = 0, len = aBox.length; index < len; index++) {
aBox[index].style.display = "none";
aBtn1[index].isShow = true;
}
},點選文件任意地方可以隱藏下拉選單。
(15).for (var index = 0, len = aBox.length; index < len; index++) {
var aLi = $("li", aBox[index]);
for(var j=0,li_len=aLi.length;j<li_len;j++){
aLi[j].point_ele = index;
aLi[j].onclick=function(){
var txt=this.getAttribute("value")?this.getAttribute("value"):"";
aBtn1[this.point_ele].innerHTML=txt;
aBtn1[this.point_ele].setAttribute("value",txt);
}
}
},遍歷每一個ul元素,並且獲取其中的li元素集合。
然後為這些li元素註冊click事件處理函式,規定當點選li元素的時候來設定span元素的html內容和value屬性值。
(16).關於$()方法和getNextEle()方法實現了參閱相關閱讀。
二.相關閱讀:
(1).parentNode參閱JavaScript parentNode 屬性一章節。
(2).getAttribute()參閱JavaScript getAttribute()一章節。
(3).setAttribute()參閱JavaScript setAttribute()一章節。
(4).innerHTML參閱JavaScript innerHTML 屬性一章節。
相關文章
- javascript模擬美化select下拉選單效果詳解JavaScript
- 模擬select下拉選單程式碼例項
- 模擬美化select下拉選單程式碼例項
- 模擬實現select下拉選單例項程式碼單例
- 模擬帶有滾動條的select下拉選單
- js模擬實現select下拉選單程式碼例項JS
- JS模擬下拉框selectJS
- HTML select下拉選單HTML
- HTML select 下拉選單HTML
- jQuery 美化select下拉選單jQuery
- 圓角select下拉選單
- select下拉選單 change事件事件
- 選中select下拉選單項提交表單
- 可以輸入select下拉選單
- jquery如何操作select下拉選單jQuery
- 下拉選單框select常用點
- JavaScript二級下拉選單詳解JavaScript
- 利用jQuery模擬實現select下拉框jQuery
- JavaScript動態操作select下拉選單JavaScript
- jQuery select下拉選單復位效果jQuery
- select下拉選單二級聯動
- select下拉選單新增不重複項
- js自定義select下拉選單效果JS
- jQuery操作select下拉選單程式碼jQuery
- JavaScript 動態生成select下拉選單JavaScript
- select下拉選單 readonly 只讀
- JavaScript動態建立select下拉選單JavaScript
- 選擇select下拉選單網頁跳轉網頁
- 如何設定select下拉選單可以多選
- jquery操作select下拉選單簡單介紹jQuery
- select下拉選單跳轉效果程式碼
- jQuery操作select下拉選單常用程式碼jQuery
- JavaScript 獲取select下拉選單所有optionJavaScript
- jQuery select下拉選單readonly只讀jQuery
- select下拉選單美化程式碼例項
- jQuery select下拉選單的相關操作jQuery
- CSS三級下拉導航選單詳解CSS
- jquery二級下拉導航選單詳解jQuery