SUBMENU 的 CSS實現和 點擊判斷javascript
點擊判斷基礎:css
使用 mouseup 事件來控制點擊除了SUBMENU-TITLE和SUBMENU-CONTENT其他文檔隱藏 全部SUBMENU 的操做。html
點擊判斷比較難以理解的部分:前端
點擊SUBMENU-TITLE 和 SUBMENU-CONTENT 從而實現菜單的顯示隱藏操做。java
給每個SUBMENU 添加 flag 屬性,用於判斷下拉菜單的狀態從而根據狀態作出相應的事件反映。jquery
-- 點擊事件瀏覽器
-- click submenu框架
-- judge flagide
-- flag == shown佈局
this hide
this.flag = hidden
-- flag == hidden
close all
all flag = hidden
this show
this.flag = shown
-- click other-place
close all
all flag = hidden
HTML 代碼段以下( 部分CSS 借鑑了一個老外的樣式):
<!DOCTYPE html> <html> <head> <title>dropdownMenu.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script src="http://code.jquery.com/jquery-latest.js"></script> <style type="text/css"> .outBox { margin: 200px auto 0 auto; padding: 0; width: 143px; } .dropdown { color: #555; margin: 0; width: 143px; position: relative; height: 17px; text-align: left; width: 143px; } /* 這裏使用到了 CSS3 的一些技術好比 border-radius box-shadow 可是支持這些 CSS 屬性的瀏覽器目前在國內比較少,IE9+ 纔會有部分兼容 */ .submenu { background: #fff; position: absolute; top: -12px; left: -20px; z-index: 100; width: 135px; display: none; margin-left: 10px; padding: 40px 0 5px; border: 1px solid #6173a3; border-radius: 6px; box-shadow: 0 2px 8px rgba(97, 115, 163, 0.45); } .dropdown li a { color: #555555; display: block; font-family: arial; font-weight: bold; padding: 6px 15px; cursor: pointer; text-decoration: none; } .dropdown li a:hover { background: #6173a3; color: #FFFFFF; text-decoration: none; } a.account { font-size: 11px; line-height: 16px; color: #555555; position: absolute; z-index: 110; display: block; padding: 11px 0 0 20px; height: 28px; width: 121px; margin: -11px 0 0 -10px; text-decoration: none; background: url(arrow.png) 116px 17px no-repeat; cursor: pointer; } .root { list-style: none; margin: 0px; padding: 0px; font-size: 11px; padding: 11px 0 0 0px; border-top: 1px solid #dedede; } .submenus-li{ list-style: none; width: 200px; float: left; } </style> <script type="text/javascript"> $(document).ready(function() { $(".account").click(function() { var flag = $(this).attr("flag"); if (flag == "shown") { $(this).parent().find(".submenu").hide(); $(this).attr("flag", "hidden"); //$(this).parent().find(".submenu").slideUp(100); } else { $(".submenu").hide(); $(".account").attr("flag", "hidden"); $(this).parent().find(".submenu").show(); $(this).attr("flag", "shown"); //$(this).parent().find(".submenu").slideDown(100); } }); //Mouse click on sub menu $(".submenu").mouseup(function() { return false }); //Mouse click on my account link $(".account").mouseup(function() { return false }); //Document Click ,點擊別處隱藏菜單 ... $(document).mouseup(function() { $(".submenu").hide(); $(".account").attr("flag", "hidden"); }); }); </script> </head> <body> <ul id="submenus"> <li class="submenus-li"><div class="dropdown"> <a class="account" flag="hidden">My Account</a> <div class="submenu"> <ul class="root"> <li><a href="#Dashboard">Dashboard</a></li> <li><a href="#Profile">Profile</a></li> <li><a href="#settings">Settings</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> </ul> </div> </div></li> <li class="submenus-li"><div class="dropdown"> <a class="account" flag="hidden">Your Account</a> <div class="submenu"> <ul class="root"> <li><a href="#Dashboard">Dashboard</a></li> <li><a href="#Profile">Profile</a></li> <li><a href="#settings">Settings</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> </ul> </div> </div></li> <li class="submenus-li"><div class="dropdown"> <a class="account" flag="hidden">Our Account</a> <div class="submenu"> <ul class="root"> <li><a href="#Dashboard">Dashboard</a></li> <li><a href="#Profile">Profile</a></li> <li><a href="#settings">Settings</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> <li><a href="#feedback">Send Feedback</a></li> </ul> </div> </div></li> </ul> </body> </html>
另外由於 submenu 的事件控制問題繼續來講下事件的相應判斷。
結論:
整個事件要分紅三段來進行處理
事件的產生
事件的冒泡
和事件的處理
1
首先事件的產生是獨立的
好比鼠標事件中的
mousedown
click
mouseup
這三個事件雖然有前後順序,可是都是獨立的事件
這些事件的冒泡和事件處理是不會由於其餘事件而產生改變的,事件的原子性 ...
2
使用委託的方式來進行事件處理的話
好比經過 delegate 的方式來進行事件委託
$(document).delegate("element","eventType","eventhandle");
這樣的方式來進行事件委託的話
事件確定是要冒泡到 document 以後纔會進行事件的處理的
3
事件的處理
事件的處理頗有意思
針對於一個事件好比 mouseup 事件
假如在父節點和子節點都進行了事件的監聽,可是在子節點進行事件處理的時候 return false 這樣會忽略父節點的事件處理,這個在上一篇日誌當中已經進行了說明,不清楚的同窗能夠去看下。
4
事件委託不會交叉處理
而是一個事件一個事件的進行處理
好比一個 click 事件,這個事件會觸發 3 個事件。
老是先處理 mouseup 而後再處理 click 這個可能和咱們想象中的有所區別
你可能認爲會先處理點擊元素的 mouseup click 而後是 document 的 mouseup click
可是再回憶咱們的原則 1 就豁然開朗了
事件自己就是分離的
從新制做變長的菜單,樣式方面比較醜陋,你們見諒
後來又從新制做了一個 SUBMENU 裏面使用了 ul li 來作定位操做,使用 dl dt dd 來完成內容的點擊擴展。而且使用不一樣寬度的 dt dd 來實現很不一樣通常的菜單樣式。下次再作擴展的話能夠把 dt 換成相對應的 img 便可。
後來製做的菜單詳細可見 dropmenuDesigned By Cherry 裏面有比較詳細的註釋了。裏面比較有意思的就是設置 position 爲 relative 來實現submenu dd 的覆蓋 dt 的操做。
<!DOCTYPE html> <html> <head> <title>dropdownMenuByCherry.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script src="http://code.jquery.com/jquery-latest.js"></script> <!-- TIPS 1 在設計的使用使用 ul li 來進行基本框架的搭建 ul 只是做爲父元素容器存在沒有特殊意義 2 li 設置成 float left ,display block , 設置固定的寬度和高度(這裏要使之和 dt 的寬度和高度一致) 3 具體的下拉菜單的類容使用 dl dt dd 來作,dl 做爲 li 的子容器 dl 由於做爲 sub menu 子容器要始終顯示在最前端 4 dd 要設置背景色,用於遮蓋,固然也能夠不用遮蓋。 5 ul li dl 都是用來進行佈局的。實際的內容都在 dt dd 當中。 6 z-index 屬性對 static 流不起做用,因此須要設置 dt dd 爲 relative 從而完成菜單的覆蓋操做 --> <style type="text/css"> html,body { margin: 0; padding: 0; } #head,#body,#footer { margin: 0 auto; } #head,#footer { font-size: 20px; font-weight: bold; text-align: center; } .ul-box{ margin: 0; padding: 0; height: 42px; } .ul-box .li-box{ margin: 5px; list-style: none; width: 30px; float: left; display: block; height: 20px; } .ul-box .li-box dl { margin: 0; padding: 0 0 10px 0; } .ul-box .li-box dl dt{ padding: 0; margin: 0; width: 30px; border: 1px solid red; cursor: pointer; position: relative; z-index: 1; } .ul-box .li-box dl dd{ padding: 0; margin: 0; display: none; width: 50px; border: 1px solid red; cursor: pointer; background-color: white; position: relative; z-index: 999; } .ul-box .li-box dl dd:HOVER{ background-color: red; color: white; } .clear{ clear: both; border: 1px solid red; } </style> <script type="text/javascript"> $(function(){ /* submenu 點擊彈出菜單事件 */ $("dt").click(function() { var flag = $(this).attr("flag"); if (flag == "shown") { $(this).parent().find("dd").hide(); $(this).attr("flag", "hidden"); //$(".submenu").slideUp(100); } else { $("dd").hide(); $("dt").attr("flag", "hidden"); $(this).parent().find("dd").show(); $(this).attr("flag", "shown"); //$(".submenu").slideDown(100); } }); //Mouse click on sub menu $("dd").mouseup(function() { return false }); //Mouse click on my account link $("dt").mouseup(function() { return false }); //Document Click ,點擊別處隱藏菜單 ... $(document).mouseup(function() { $("dd").hide(); $("dt").attr("flag", "hidden"); }); }) </script> </head> <body> <div id="head">DropBox Designed By Cherry</div> <div id="body"> <ul class="ul-box"> <li class="li-box"> <dl> <dt flag="hidden">a</dt> <dd>num_1</dd> <dd>num_2</dd> <dd>num_3</dd> <dd>num_4</dd> </dl> </li> <li class="li-box"> <dl> <dt flag="hidden">b</dt> <dd>num_2</dd> <dd>num_3</dd> <dd>num_4</dd> <dd>num_5</dd> </dl> </li> <li class="li-box"> <dl> <dt flag="hidden">c</dt> <dd>num_3</dd> <dd>num_4</dd> <dd>num_5</dd> <dd>num_6</dd> </dl> </li> </ul> <div>--------------------------------------</div> <div>--------------------------------------</div> <ul class="ul-box"> <li class="li-box"> <dl> <dt flag="hidden">d</dt> <dd>num_1</dd> <dd>num_2</dd> <dd>num_3</dd> <dd>num_4</dd> </dl> </li> <li class="li-box"> <dl> <dt flag="hidden">e</dt> <dd>num_2</dd> <dd>num_3</dd> <dd>num_4</dd> <dd>num_5</dd> </dl> </li> <li class="li-box"> <dl> <dt flag="hidden">f</dt> <dd>num_3</dd> <dd>num_4</dd> <dd>num_5</dd> <dd>num_6</dd> </dl> </li> </ul> </div> <div id="footer">Cherry_OP@163.com</div> </body> </html>