網(wǎng)教程 類似的多級(jí)浮動(dòng)菜單網(wǎng)上也很多實(shí)例,但大部分都是只針對(duì)一種情況或不夠靈活,簡(jiǎn)單說(shuō)就是做死了的。所以我就想到做一個(gè)能夠自定義菜單的,有更多功能的多級(jí)浮動(dòng)菜單。而其中的關(guān)鍵就是怎么根據(jù)自定義的菜單結(jié)構(gòu)來(lái)生成新菜單,關(guān)鍵中的難點(diǎn)就是怎么得到下級(jí)菜單結(jié)構(gòu)和容器對(duì)象的使用。
理想的做法是每次有下級(jí)菜單時(shí),從對(duì)象直接取得下級(jí)菜單結(jié)構(gòu),放到容器對(duì)象中,并且容器能重用,而不是每次都重新生成。但想了很久也想不到適合的做法,直到做了多級(jí)聯(lián)動(dòng)下拉菜單終于得到了靈感。放棄了直接取得下級(jí)菜單結(jié)構(gòu),而是每次都從原來(lái)的菜單結(jié)構(gòu)中獲取當(dāng)前需要的下級(jí)菜單結(jié)構(gòu)。容器對(duì)象也不是自動(dòng)生成,而是由用戶先定義好(后來(lái)也做到能自動(dòng)生成了)。
先來(lái)看一下演示:
提示:可修改后代碼再運(yùn)行!
放下了這些包袱后,后面的開發(fā)就順暢了。
特點(diǎn):
1.根據(jù)自定義菜單結(jié)構(gòu)生成菜單;
2.多級(jí)聯(lián)動(dòng)功能;
3.自定義浮動(dòng)位置(上下左右);
4.自定義延遲效果;
5.js控制編輯菜單;
6.可根據(jù)需要自動(dòng)生產(chǎn)容器對(duì)象
程序原理
程序是根據(jù)傳統(tǒng)浮動(dòng)菜單擴(kuò)展而來(lái),這里說(shuō)一下幾個(gè)比較關(guān)鍵或有用的地方:
【延時(shí)功能】
這個(gè)很多人都懂,就是設(shè)個(gè)setTimeout計(jì)時(shí)器,這里有兩個(gè)計(jì)時(shí)器,分別是容器計(jì)時(shí)器和菜單計(jì)時(shí)器。容器計(jì)時(shí)器的作用是鼠標(biāo)移到容器外面時(shí)隱藏容器,難點(diǎn)是如何判斷當(dāng)前鼠標(biāo)是不是在容器外面。一般的方法是設(shè)個(gè)bool參數(shù),mouseout時(shí)設(shè)為false,mouseover時(shí)設(shè)為true(or倒過(guò)來(lái)),再根據(jù)這個(gè)參數(shù)判斷,但這個(gè)方法在這個(gè)不行,經(jīng)過(guò)容器里的菜單對(duì)象時(shí)會(huì)觸發(fā)容器mouseout,由于事件冒泡,菜單對(duì)象的mouseout也會(huì)觸發(fā)容器的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> |
這里推薦一個(gè)方法,使用contains(ff是compareDocumentPosition)方法。
這個(gè)方法是我做圖片滑動(dòng)展示效果時(shí)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; } }); |
詳細(xì)參考仿LightBox內(nèi)容顯示效果,而菜單計(jì)時(shí)器就沒(méi)什么特別,就是用來(lái)設(shè)置菜單內(nèi)容。