iT邦幫忙

2021 iThome 鐵人賽

DAY 8
2
Modern Web

這個網站也太嗨!30 個網頁動態提案系列 第 9

#7-漢堡Menu動起來!(CSS就搞定啦!)

常常看到有些網站的漢堡選單用換圖的方式從 三 --> X
會覺得有點可惜,其實漢堡選單的動態一樣CSS 就可以搞定!
說不定會因為動得太可愛,讓大家一直點 (!?
用到一點JS只是為了偵測點擊換class的樣式~

就是一個div + 兩個偽元素,讓他們旋轉就可以輕鬆搞定。
不過CSS animation裡面的速度選項都有點平淡,所以這次利用了這個網站:
CSS EASING ANIMATION TOOL
有很多動態的貝茲曲線都算好啦,
選擇了ease-in-out-back 有點彈的活潑感!
另外這個網站也可以用,先備用起來:Easing functions

先來看看成果

第1&2個按鈕原理

點擊之後都加上.open的class讓樣式改變。
第一個和第二個幾乎是一樣的,原理就是讓中間槓槓向左消失,
上下兩個槓槓就是讓她轉成X的樣子
不過第二個多轉了90度。(135deg)

//HTML
<div class="menu-icon" id="icon1">
  <div class="menu-icon_hamburger"></div>
</div>

//SCSS
 &.open{
    .menu-icon_hamburger{
      transform: translateX(-30px); //向左消失
      background: transparent;
      
      &:before{
        transform: translate(30px) rotate(45deg);
        background: $menu-color-close;
      }
      &:after{
        transform: translate(30px) rotate(-45deg);
        background: $menu-color-close;
      }
    }
 }

第3個按鈕原理

第三個的原理就是,讓最外層包一個border點擊後出現,
旋轉的只有最下面和中間的槓槓變成X
最上面那個讓他消失


//HTML
<div class="menu-icon" id="icon3"> //這是最外圍圈圈
  <div class="menu-icon_hamburger"> //中間的槓槓
  這裡面有:before //上面的槓槓
    :after //下面的槓槓
  </div>
</div>

//部分SCSS
&.open{
    &.menu-icon{ 
      border: $fatness solid $menu-color-close; //最外層那個圈圈讓他出現
      
    }
    .menu-icon_hamburger{ //中間那一槓槓讓她轉
      transform: rotate(135deg);
      background: $menu-color-close;
      
      
      &:before{
        transform: scale(0); //讓他消失
      background: transparent;
        
      }
      
      &:after{ //最下面那一個槓槓也讓她轉
        transform: rotate(-90deg);
         background: $menu-color-close;
      }
    }
   }


全部的code

全部的code~

//HTML
<div class="menu-icon" id="icon1">
  <div class="menu-icon_hamburger"></div>
</div>
<div class="menu-icon" id="icon2">
  <div class="menu-icon_hamburger"></div>
</div>
<div class="menu-icon" id="icon3">
  <div class="menu-icon_hamburger"></div>
</div>

//SCSS
$menu-color: rgba(241, 90, 34, 1);
$menu-color-close: rgba(25, 181, 254);
$fatness: 5px;
@mixin transition{
  transition: all 500ms cubic-bezier(0.680, -0.550, 0.265, 1.550);
}

//第一個按鈕
.menu-icon{
  width: 60px;
  height: 60px;
  display: flex;
  justify-content: center;
  align-items: center;
  padding: 10px;
  cursor: pointer;
  margin-left: 5px;
  z-index: 1;
  
  &_hamburger{
    width: 100%;
    height: $fatness;
    background: $menu-color;
    position: relative;
    border-radius: 5px;
    transition: all 500ms cubic-bezier(0.680, -0.550, 0.265, 1.550);
    
    &:before, &:after{
      position: absolute;
      content: '';
      width: 100%;
      height: $fatness;
      background:$menu-color;
      border-radius: 5px;
      transform: translateY(-15px);
      transition: all 500ms cubic-bezier(0.680, -0.550, 0.265, 1.550);
      
    }
    &:before{
      transform: translateY(-15px);
    }
    &:after{
      transform: translateY(15px);
    }
  }
  
  &.open{
    .menu-icon_hamburger{
      transform: translateX(-30px);
      background: transparent;
      &:before{
        transform: translate(30px) rotate(45deg);
        background: $menu-color-close;
      }
      &:after{
        transform: translate(30px) rotate(-45deg);
        background: $menu-color-close;
      }
    }
  }
}

//第二個按鈕,基本上設定都吃第一個,所以把不一樣的地方蓋過而已
#icon2{
  &.open{
    .menu-icon_hamburger{
      transform: translateX(-30px);
      background: transparent;
      &:before{
        transform: translate(30px) rotate(135deg);
        background: $menu-color-close;
      }
      &:after{
        transform: translate(30px) rotate(-135deg);
        background: $menu-color-close;
      }
    }
  }
}

//第三個按鈕,把爸爸層做成一個圓圈圈~
//然後中間那一個bar因為要消失的關係,所以把中間的那個從
//menu-icon_hamburger改成是偽元素,才可以定位

#icon3{
  &.menu-icon{
    border-radius: 50%; 
    margin-left: 0;
    border: $fatness solid transparent;
    @include transition;

  }
  .menu-icon_hamburger{
     width: 100%;
     height: 5px;
     background: $menu-color;
     position: relative;
     border-radius: 5px;
     @include transition;

        &:before, &:after{
          position: absolute;
          content: '';
          width: 100%;
          height: 5px;
          background:$menu-color;
          border-radius: 5px;
          @include transition;

        }
        &:before{
          transform: translateY(-15px);
        }
        &:after{
          transform: translateY(15px);
        }
      }
  
  &.open{
    &.menu-icon{ 
      border: $fatness solid $menu-color-close; //最外層那個圈圈讓他出現
      
    }
    .menu-icon_hamburger{ //中間那一槓槓讓她轉
      transform: rotate(135deg);
      background: $menu-color-close;
      
      
      &:before{
        transform: scale(0); //讓他消失
      background: transparent;
        
      }
      
      &:after{ //最下面那一個槓槓也讓她轉
        transform: rotate(-90deg);
         background: $menu-color-close;
      }
    }
  }
}

//JS
const menuIcons = document.querySelectorAll('.menu-icon')
let isMenuOpen = false;

menuIcons.forEach((icon)=>{
  icon.addEventListener('click',()=>{
  isMenuOpen = !isMenuOpen
  isMenuOpen ? icon.classList.add('open') : icon.classList.remove('open')
})
})

以上!

今天的code

有任何錯誤/問題歡迎留言!


上一篇
#6-無限文字Logo跑馬燈 (不用JS! CSS Animation)
下一篇
#8-選單華麗開起來!超簡單!(animation-delay)
系列文
這個網站也太嗨!30 個網頁動態提案33

1 則留言

0
Mao
iT邦新手 2 級 ‧ 2021-09-23 16:11:40

挖!我還在苦惱貝茲曲線不會算,
原來還有這麼方便的網站可以使用!
/images/emoticon/emoticon33.gif

Rachel ? iT邦新手 5 級 ‧ 2021-09-24 12:39:16 檢舉

要怎麼算啊 XD
sin cos 嗎!哈哈哈

我要留言

立即登入留言