前天上課時有同學問到是否有水平雙層子選單的範例,所以筆者就把原有的舊範例稍微整理一下,現在要來跟各位分享這有趣的選單效果囉。
一樣是用 ul 及 li 來當母子選單的項目:
檢視原始碼 HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <body> <ul id="menu"> <li><a href="#">jQuery</a> <ul> <li><a href="#">應用範例</a></li> <li><a href="#">使用技巧</a></li> <li><a href="#">相關資源</a></li> </ul> </li> <li> <a href="#">CSS</a> <ul> <li><a href="#">CSS Hack</a></li> <li><a href="#">免費圖示</a></li> </ul> </li> <li><a href="#">其它網站</a> <ul> <li><a href="#">男丁格爾's 脫殼玩</a></li> <li><a href="#">Google</a></li> <li><a href="#">Yahoo!奇摩</a></li> <li><a href="#">原子小金剛</a></li> </ul> </li> <li><a href="#">新年快樂</a></li> </ul> </body> |
子選單可放在第一層 li 的裡面,若沒有子項目的話就單獨就好。接著再用 CSS 把選單排成水平樣式,並把子選單先隱藏起來:
檢視原始碼 CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #menu { margin: 0; padding: 0; list-style: none; position: relative; width: 500px; float: left; background: #000; } #menu li { margin: 0; padding: 0; float: left; border-right: 1px solid #999; } #menu li a { padding: 10px 15px; display: block; color: #fff; text-decoration: none; } #menu li ul { margin: 0; padding: 15px 0; list-style: none; float: left; position: absolute; left: 0; width: 500px; color: #fff; background: #06c url('bottom.gif') no-repeat bottom; display: none; } #menu li ul li { border-right: 1px solid #fff; } #menu li ul li a { display: inline; } #menu li ul li a:hover { text-decoration: underline; } |
子選單的座標系統要設成 absolute,這樣才能讓它浮出整個選單。接著為了讓子選單美觀一點點,所以筆者在第二層 ul 中加入了有圓角效果的背景圖片。
先來看經過 CSS 裝飾過後的效果:
若沒問題的話,就開始動手做最關鍵的程式部份:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $(function(){ // 幫 #menu li 加上 hover 事件 $('#menu li').hover(function(){ // 先找到 li 中的子選單 var _this = $(this), _subnav = _this.children('ul'); // 變更目前母選項的背景顏色 // 同時顯示子選單(如果有的話) _this.css('backgroundColor', '#06c'); _subnav.css('display', 'block'); } , function(){ // 變更目前母選項的背景顏色 // 同時隱藏子選單(如果有的話) // 也可以把整句拆成上面的寫法 $(this).css('backgroundColor', '').children('ul').css('display', 'none'); }); // 取消超連結的虛線框 $('a').focus(function(){ this.blur(); }); }); |
其實因為已經都用 CSS 設計過了,程式這邊只是控制滑鼠移到母選項的時候的動作而已。當移到母選項時則顯示子選單;反之則隱藏起來。
這樣的選單效果是不是也很有意思呢?我們也可以在子選單顯示時加上一些動畫效果:
檢視原始碼 JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $(function(){ // 幫 #menu li 加上 hover 事件 $('#menu li').hover(function(){ // 先找到 li 中的子選單 var _this = $(this), _subnav = _this.children('ul'); // 變更目前母選項的背景顏色 // 同時淡入子選單(如果有的話) _this.css('backgroundColor', '#06c'); _subnav.stop(true, true).fadeIn(400); } , function(){ // 變更目前母選項的背景顏色 // 同時淡出子選單(如果有的話) // 也可以把整句拆成上面的寫法 $(this).css('backgroundColor', '').children('ul').stop(true, true).fadeOut(400); }); // 取消超連結的虛線框 $('a').focus(function(){ this.blur(); }); }); |
筆者使用了淡入淡出的效果來顯示/隱藏子選單,但有個小地方要注意一下,除了要先清除未完成的動畫效果之外;若動畫時間設太長的話,可能會在上一次的子選單未消失前,又讓使用者把滑鼠移上去而產生錯亂的情況喔。
請問有辦法居中子選單的內容嗎?
比如主選單
[選單一][選單二][選單三]
其中[選單二]的子選單選項有[子選項1][子選項2][子選項3]
顯示的結果是:
[選單一][選單二][選單三]
[子選項1][子選項2][子選項3]
就是子選單的內容中間對齊滑到的主選單項目,謝謝@@
以目前 css 來看, 也許得自行計算出每個子選單的寬度, 再來改變每一組子選單的 left 才行~
男丁您好
承這個問題請教
若不用計算方式來決定子選單左邊的位置
而是直接寫死固定的
應該在那邊加註呢?
謝謝
你好
請問這個語法是要貼在哪裡
我想要做網頁的選單
想取代Dreamweaver的 SPRY選單
不知道該如何製作?!
照你說的方式,用 還是無法居中 !? 有其它辦法嗎 ?
.....
男丁老師您好, 我想要在仿htc的那個tab中 加入 點擊後下方出現子選單的功能
// 當選單被點擊時...
_menu.click(function() {
// 先移除上一個有 .selected 的超連結
$('.selected').removeClass('selected');
var _this = $(this),
_subnav = _this.children('ul');
_subnav.stop(true, true).fadeIn(400);
// 把點擊到的項目加上 .selected
var _this = $(this).addClass('selected'),
_link = _this.attr('href');
// 更換選單的背景圖片及移動選單到該選項上
// 如果選項有連結時,則會在動畫移動完後來轉址
_menuMask.css({
backgroundImage: 'url(' + _this.attr('id') + '_black.png)'
}).stop().animate({
width: $(this).width() + _maskWidth,
height: $(this).height() + _maskHeight,
top: $(this).offset().top - _diffHeight,
left: $(this).offset().left - _diffWidth
但點擊時並不會跑出子選單 請問該如何實做呢
已解決囉~~~
您好,請問這個選單,可以用於商業網站使用嗎? (一個小公司的小網站,目前未盈利,之後不一定)
謝謝...
可以~
老師您好,
為了讓子選單與選單的文字對齊,我把#menu li ul裡的left拿掉
但發現他是整個子選單都往右移
會比選單多突出一塊
http://imgur.com/mAVeuqB
如果我想弄成這樣,該從哪下手呢?
那就一一指定每個 #menu li ul 的寬度試試吧XD
Hi,老師我又來了,近日一直在研究jQuery,我也在飛肯學院看到老師的大作呀!!
老師我有些問題想要請教一下!
1.純CSS製作選單與jQuery的不同處是?!
2.如果在業界的話,會選擇jQuery自行製作選單還是使用jQuery Plugin來呈現呢?
謝謝老師的指教!!
1.CSS 的效能基本上會比用 JavaScript 來的好~
2.其實兩者都有哩, 就看開發者熟悉那種方式
男丁老師,突發想到一個,就是如果出現的子選單他的寛度超過是否可以隱藏出現可左右移動的箭頭選擇子選單。
是可以, 但就是還要再加些程式才行XD