網教程 類似的多級浮動菜單網上也很多實例,但大部分都是只針對一種情況或不夠靈活,簡單說就是做死了的。所以我就想到做一個能夠自定義菜單的,有更多功能的多級浮動菜單。而其中的關鍵就是怎么根據自定義的菜單結構來生成新菜單,關鍵中的難點就是怎么得到下級菜單結構和容器對象的使用。
理想的做法是每次有下級菜單時,從對象直接取得下級菜單結構,放到容器對象中,并且容器能重用,而不是每次都重新生成。但想了很久也想不到適合的做法,直到做了多級聯動下拉菜單終于得到了靈感。放棄了直接取得下級菜單結構,而是每次都從原來的菜單結構中獲取當前需要的下級菜單結構。容器對象也不是自動生成,而是由用戶先定義好(后來也做到能自動生成了)。
先來看一下演示:
提示:可修改后代碼再運行!
放下了這些包袱后,后面的開發就順暢了。
特點:
1.根據自定義菜單結構生成菜單;
2.多級聯動功能;
3.自定義浮動位置(上下左右);
4.自定義延遲效果;
5.js控制編輯菜單;
6.可根據需要自動生產容器對象
程序原理
程序是根據傳統浮動菜單擴展而來,這里說一下幾個比較關鍵或有用的地方:
【延時功能】
這個很多人都懂,就是設個setTimeout計時器,這里有兩個計時器,分別是容器計時器和菜單計時器。容器計時器的作用是鼠標移到容器外面時隱藏容器,難點是如何判斷當前鼠標是不是在容器外面。一般的方法是設個bool參數,mouseout時設為false,mouseover時設為true(or倒過來),再根據這個參數判斷,但這個方法在這個不行,經過容器里的菜單對象時會觸發容器mouseout,由于事件冒泡,菜單對象的mouseout也會觸發容器的mouseout。
<div style="height:100px; width:100px; background:#000000;" onmouseout="alert(2)"> <div style="height:50px; width:50px; background:#FF0000;" onmouseout="alert(1)"> </div> </div> |
這里推薦一個方法,使用contains(ff是compareDocumentPosition)方法。
這個方法是我做圖片滑動展示效果時muxrwc教我的。
var isIn = false, oT = Event(e).relatedTarget; Each(oThis.Container, function(o, i){ if(o.contains ? o.contains(oT) || o == oT : o.compareDocumentPosition(oT) & 16){ isIn = true; } }); |
詳細參考仿LightBox內容顯示效果,而菜單計時器就沒什么特別,就是用來設置菜單內容。