BACK
Featured image of post 免JS!純CSS就可打造出,開合式的漢堡選單功能

免JS!純CSS就可打造出,開合式的漢堡選單功能

最近發現一個超酷的寫法,直接透過 HTML 中的 checkbox,就可判斷目前是開啟還是關閉,再搭配 CSS 就可實作出展開與收合,甚至連漢堡選單的那圖示,也可透過 CSS 繪製出來,且當選單開啟時,還可透過動畫將選單變叉叉的圖示,因此現在就一塊來看看,如何透過純 CSS 打造出開合式漢堡選單吧!

參考網站


前言

選單一直是製作網頁最基本的功能需求之一,因此對於許多的套件內建都會提供選單的功能,且這些滑動式選單,大部分都是透過 Javascript 所製作而成,最主要的原因就在於,透過 Javascript 可以精準的知道,目前使用是點選開啟還是關閉

而最近發現一個超酷的寫法,直接透過 HTML 中的核許框,就可判斷目前是開啟還是關閉,再搭配 CSS 就可實作出展開與收合,甚至連漢堡選單的那圖示,也可透過 CSS 繪製出來,且當選單開啟時,還可透過動畫將選單變叉叉的圖示,因此現在就一塊來看看,如何透過純 CSS 打造出開合式漢堡選單吧!


做法

1. 加入以下的 HTML 架構

首先,先在HTML中加入以下的HTML架構。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<nav class="nav-box">
  <input type="checkbox" id="menu">
  <label for="menu" class="line">
    <div class="menu"></div>
  </label>

  <div class="menu-list">
    <ul>
      <li>選單1</li>
      <li>選單2</li>
      <li>選單3</li>
    </ul>
</div>
</nav>

2. 加入 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
/*
選單線
*/
.line {
  width: 24px;
  height: 24px;
  background: #FFF;
  cursor: pointer;
  display: block;
  padding: 16px;
  position: fixed;
  z-index: 2;
}
.line .menu,
.line .menu::before,
.line .menu::after {
  background: #222;
  content: '';
  display: block;
  height: 1px;
  position: absolute;
  transition: background ease .15s, top ease .15s .15s, transform ease .15s;
  width: 20px;
}
.line .menu {
  left: 18px;
  top: 27px;
}

.line .menu::before {
  top: -6px;
}

.line .menu::after {
  top: 6px;
}

3. 加入 :checked 屬性的判斷

接著再透過 :checked 的屬性,來判斷目前為開啟狀態,當選單開啟時,原來的三條線就變成叉叉。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/*
點選選單變叉叉
*/
#menu:checked + .line .menu {
  background: transparent;
}

#menu:checked + .line .menu::before {
  transform: rotate(45deg);
}

#menu:checked + .line .menu::after {
  transform: rotate(-45deg);
}

#menu:checked + .line .menu::before,
#menu:checked + .line .menu::after {
  top: 0;
  transition: top ease .15s, transform ease .15s .15s;
}

4. 設定開合樣式

當選單按鈕處理好後,一樣用 :checked 來設定選單展開(200px)與收合(60px)。

 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
/*
選單開合
*/
#menu:checked ~ .menu-list {
  width: 200px;
}

.menu-list {
  width: 60px;
  height: 100vh;
  background: #FFF;
  box-shadow: 0 2px 4px rgba(0, 0, 0, .1);
  padding-top: 60px;
  position: fixed;
  z-index: 1;
  transition: all .3s;
  overflow: hidden;
}

/*
選單向外推
*/
.menu-list ul {
    list-style: none;
    margin-left:70px;
    padding: 0;
}
.menu-list ul>li{
    display:block;
    width:100px;
}

5. 隱藏 checkbox

都弄好後,再把 input 的核許框給隱藏起來,這樣就可透過純CSS打造出滑動式的漢堡選單啦!


範例預覽


Licensed under CC BY-NC-SA 4.0
comments powered by Disqus