這裡要記錄兩種摺疊式選單,都是使用html+css+jquery製作,但主要控制的部分還是在jQuery
一種是常見的Q&A選單,另一種是在製作左側選單列時會出現的垂直型選單。
單層式摺疊選單
在Q&A常常看到這種單層的折疊選單,點選其中一個question會展開answer,再點選其他的question時,會展開該 answer 且原本的會收回。
1.首先,先把html建立起來,這邊會使用一個question包一個Q&A
1 | <div class="list"> |
畫面呈現如下:
2.再來調整CSS,這裡會針對h3:hover
和active
做設定,目的是除了滑鼠移到問題時會有hover效果,以及當點選question展開時會出現效果。
1 | .question h3 { |
除了h3
之外,answer也要做一些調整,因為這裡的p
是要點選後才出現,所以預設要將它先隱藏
1 | .question p { |
3.接著就要開始在jquery做設定
- 首先會做一個點擊事件,點擊該
h3
時會亮起來,其他沒被點擊的h3
移除樣式
1 | $('.question h3').click(function (e) { |
- 目前click的是
h3
,從parent()
找到父元素:question
,再找到question
的子元素p
,用slideToggle()
讓p
能夠收合
1 | $(this).parent().find('p').slideToggle(); |
- 自己以外的
p
隱藏
這邊click的一樣是h3
,用parent()
找到父元素:question,再使用siblings()
找到同層其他的元素:question
,並使用find()
找到question
的子元素p
,做slideUp()
將p
隱藏
1 | $(this).parent().siblings().find('p').slideUp(); |
- 自己以外的h3移除active樣式
最後再把未點選的h3
移除active
樣式
1 | $(this).parent().siblings().find('h3').removeClass('active'); |
這樣就完成簡單的選單收合啦!
二階層層式摺疊選單
接著要記錄的是兩層式的摺疊選單,這裡的二階層式指得是會用兩層的ul
li
製作選單,點開候會有子選單出現。
1.首先,在html做初步的設定,要展現的是使用兩層的ul
li
的選單,所以第二層也會使用ul
li
包覆。
1 | <ul class="cart"> |
2.接著,一樣到CSS做調整,這邊會使用子選擇器(Child combinator)讓只有被選擇到的元素有作用。
1 | .cart > li > a { /* 選擇設定主要選單a元素 */ |
這邊和Q&A選單製作時相同,要先把子選單先隱藏,等到點選時才會出現。
1 | .cart ul { |
3.再來是jquery,這邊相對就簡單一些。一樣是先製作一個點擊事件,但在這邊要注意的是,選取時會用子選擇器去選擇.cart > li > a
,原因是,若是使用.cart a
的話,點選選單時連第二層的子選單都會被點到。
1 | $('.cart > li > a').click(function (e) { |
- 這裡的
this
代表是點選的a
,parent()
找到它的父元素:li
,接著使用siblings()
選擇自己以外的ul
,找到自己以外的ul
後(這邊的ul
代表的是子選單的ul
)做slideUp()
收合效果
1 | $(this).parent().siblings().find('ul').slideUp(); |
- 這裡的
this
代表的是點選的a
,parent()
找到它的父元素:li
,再來找到ul
(這邊的ul
指得是原本的ul
,class="cart"
這個),做slideToggle()
將主要選單做toggle收合
1 | $(this).parent().find('ul').slideToggle(); |
這邊記錄的是垂直選單,但我想常見的水平選單寫法應該…也是類似的吧?找個時間把它寫出來好了~