模擬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 屬性一章節。
相關文章
- HTML select 下拉選單HTML
- HTML select下拉選單HTML
- jQuery 美化select下拉選單jQuery
- 圓角select下拉選單
- JavaScript動態操作select下拉選單JavaScript
- JavaScript二級下拉選單詳解JavaScript
- 選擇select下拉選單網頁跳轉網頁
- select下拉選單跳轉效果程式碼
- jQuery Validate對select下拉選單驗證jQuery
- 設定select下拉選單的預設選中項
- CSS三級下拉導航選單詳解CSS
- 迴圈方式為select下拉選單新增年份
- 二級下拉導航選單製作詳解
- select 下拉框選中事件事件
- bootstrap-select 的多選+模糊查詢下拉框詳解(官方示例文件解讀)boot
- 【antdesign select】下拉選擇-帶選擇序號
- ant design模態框中使用Select元件下拉選框不顯示元件
- jQuery和css3超讚select下拉選單框美化外掛jQueryCSSS3
- vue下拉選單Vue
- kendoUI 多選下拉選單 kendoMultiSelectUI
- SAP UI5 下拉選單(Select) 控制元件的使用方式試讀版UI控制元件
- JavaScript下拉摺疊導航選單講解JavaScript
- AngularJS系列之select下拉選擇第一個選項為空白的解決辦法AngularJS
- select下拉選擇第一個選項為空白、option無法選中的解決辦法,
- jQuery模擬打字機詳解jQuery
- golang select詳解Golang
- select 下拉框用 Select select = new Select (element) 方法失敗
- ant design的Select下拉選擇器 帶搜尋功能
- Element原始碼分析系列7-Select(下拉選擇框)原始碼
- CSS 二級下拉選單CSS
- CSS二級下拉選單CSS
- PHP單例模式模擬Java Bean實現方法示例詳解PHP單例模式JavaBean
- 下拉選單「點選外面關閉」的終極解決方案
- select2 智慧補全模糊查詢select2的下拉選擇框使用
- select下拉選項,點選時,change事件事觸發多次,請求多次。事件
- Ant Design Select元件下拉選項隨頁面滾動與Select框分離問題元件
- a-select由於位置不夠,導致下拉選單擋住搜尋框的問題
- checkbox及css實現點選下拉選單CSS