#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

有任何错误/问题欢迎留言!


<<:  【Day 11】Variables 变数

>>:  [机派X] Day 11 - 让我们拆了这台无人机

[day-28] U-net Conclusion

前言 要道尾声了,Unet的结论对於这们短的论文来说,其实算是不太重要的(看了也是)。 Conclu...

Day18 认识你的「到达网页」

「到达网页」是消费者按下广告後连到的网页,它的网址通常与广告的最终到达网址相同。 而很多因素都会影响...

Day11 Let's ODOO: Controller

Controller是对URL endpoint处理,我们这里以两支API来做范例: import ...

文件后缀与Mime类型对照表

总觉得有用,先记录下。 以下是一些文件后缀(扩展名)对应的MIME类型的一个对照表,方便iis中或其...

入门魔法 - 常用阵列方法(二)find、findIndex

前情提要 艾草:「不知不觉也累积了不少魔力总量了,我们今天透过魔法阵列来找出你适合的属性值吧!」 「...