【每日一练】136—一个侧边栏导航菜单效果的实现

58f73935b53af199be907de877fa9afc.png

写在前面

侧边导航栏在很多后台项目中比较常用,主要是为了方便我们快速找到需要的内容,可以一步到位,因此,今天我们就来练习一个这样的侧边导航栏效果,希望这个效果对你有用,现在,我们一起来看一下它的最终效果:

920734377cc69c0719cebbe1e5fc9763.gif

HTML代码:

<!DOCTYPE html>
<html>
<head>
<title>【每日一练】136—一个侧边栏导航菜单效果的实现</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="navigation">
    <div class="menuToggle"></div>
    <ul>
      <li class="list active">
        <a href="http://www.webqdkf.com" style="--clr:#f44336;">
          <span class="icon"><ion-icon name="home-outline"></ion-icon></span>
          <span class="text">Home</span>
        </a>
      </li>
      <li class="list">
        <a href="http://www.webqdkf.com" style="--clr:#ffa117;">
          <span class="icon"><ion-icon name="person-outline"></ion-icon></span>
          <span class="text">About</span>
        </a>
      </li>
      <li class="list">
        <a href="http://www.webqdkf.com" style="--clr:#0fc70f;">
          <span class="icon"><ion-icon name="chatbubble-outline"></ion-icon></span>
          <span class="text">Messages</span>
        </a>
      </li>
      <li class="list">
        <a href="http://www.webqdkf.com" style="--clr:#2196f3;">
          <span class="icon"><ion-icon name="camera-outline"></ion-icon></span>
          <span class="text">Photos</span>
        </a>
      <li class="list">
        <a href="http://www.webqdkf.com" style="--clr:#b145e9;">
          <span class="icon"><ion-icon name="settings-outline"></ion-icon></span>
          <span class="text">Settings</span>
        </a>
      </li>
      <div class="indicator"></div>
    </ul>
  </div>


  <script>
    const menuToggle = document.querySelector('.menuToggle');
    const navigation = document.querySelector('.navigation');
    menuToggle.onclick = function(){
      navigation.classList.toggle('active')
    }


    const list = document.querySelectorAll('.list');
    function activeLink(){
      list.forEach((item) =>
      item.classList.remove('active'));
      this.classList.add('active')
    }
    list.forEach((item) =>
    item.addEventListener('click',activeLink));
</script>


  <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
  <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
</body>
</html>

CSS代码:

*
{
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  font-family: 'Poppins', sans-serif;
}
:root
{
  --bg: #2f323f;
}
body 
{
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: var(--bg);
}
.navigation 
{
  position: fixed;
  inset: 40px 0 40px 20px;
  width: 75px;
  background: #fff;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: 0.5s;
}
.navigation.active 
{
  width: 250px;
}
.menuToggle 
{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 60px;
  padding: 0 23px;
  border-bottom: 1px solid rgba(0,0,0,0.25);
  display: flex;
  justify-content: flex-start;
  align-items: center;
  cursor: pointer;
}
.menuToggle::before 
{
  content: '';
  position: absolute;
  width: 30px;
  height: 2px;
  background: #333;
  transform: translateY(-8px);
  transition:0.5s
}
.navigation.active .menuToggle::before 
{
  transform:  translateY(0px) rotate(45deg);
}
.menuToggle::after 
{
  content: '';
  position: absolute;
  width: 30px;
  height: 2px;
  background: #333;
  transform: translateY(8px);
  box-shadow: 0 -8px 0 #333;
  transition:0.5s
}
.navigation.active .menuToggle::after 
{
  transform:  translateY(0px) rotate(-45deg);
  box-shadow: 0 0 0 #333;
}
.navigation ul 
{
  display: flex;
  flex-direction: column;
  width: 100%;
}
.navigation ul li 
{
  list-style: none;
  position: relative;
  width: 100%;
  height: 76px;
  border-radius: 12px;
  transition: 0.5s;
  border: 8px solid transparent;
}
.navigation ul li.active
{
  transform: translateX(30px);
  background: var(--bg);
}


.navigation ul li::before 
{
  content: '';
  position: absolute;
  top: -28px;
  right: -10px;
  width: 20px;
  height: 20px;
  background: transparent;
  border-bottom-right-radius: 20px;
  box-shadow: 6px 5px 0 5px var(--bg);
  transform: scale(0);
  transform-origin: bottom right;
  transition: 0.5s;
}
.navigation ul li.active::before 
{
  right: 22px;
  transform: scale(1);
}
.navigation ul li::after 
{
  content: '';
  position: absolute;
  bottom: -28px;
  right: -10px;
  width: 20px;
  height: 20px;
  background: transparent;
  border-top-right-radius: 20px;
  box-shadow: 6px -3px 0 3px var(--bg);
  transform: scale(0);
  transform-origin: top right;
  transition: 0.5s;
}
.navigation ul li.active::after 
{
  right: 22px;
  transform: scale(1);
}




.navigation ul li a 
{
  position: relative;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  width: 100px;
  text-align: center;
  text-decoration: none;
  z-index: 100;
}
.navigation ul li a .icon 
{
  position: relative;
  display: block;
  line-height: 60px;
  font-size: 1.75em;
  min-width: 60px;
  height: 60px;
  border-radius: 10px;
  color: #222327;
  transition: 0.5s;
  border: 6px solid transparent;
}
.navigation ul li.active a .icon 
{
  color: #fff;
  background: var(--clr);


}
.navigation ul li a .icon::before
{
  content: '';
  position: absolute;
  top: 12px;
  left: 0px;
  width: 100%;
  height: 100%;
  background: var(--clr);
  filter: blur(8px);
  opacity: 0;
  transition: 0.5s;
}
.navigation ul li.active a .icon::before
{
  opacity: 0.5;
}
.navigation ul li.active a .icon::after
{
  content: '';
  position: absolute;
  top: 10px;
  width: 15px;
  height: 15px;
  background: var(--clr);
  border: 8px solid var(--bg);
  left: -62px;
  border-radius: 50%;
}
.navigation ul li a .text 
{
  position: relative;
  padding: 0 15px;
  height: 60px;
  color: #333;
  display: flex;
  align-items: center;
  visibility: hidden;
  opacity: 0;
  transition: 0.5s;
} 
.navigation.active ul li a .text 
{
  visibility: visible;
  opacity: 1;
}
.navigation ul li.active a .text 
{
  color: #fff;
}

写在最后

以上就是每日一练的全部内容,希望今天的小练习对你有用,如果你觉得有帮助的话,请点赞我,关注我,并将它分享给你身边做开发的朋友,也许能够帮助到他。

我是杨小爱,我们明天见。

推荐阅读

【每日一练】01~100练大合集汇总

学习更多技能

请点击下方公众号

8a8f457367f817329ef3ad3bdc5da0b5.gif

8b3ce74784d4ec4af08e3d083759b96a.jpeg

0948cd24c6e212a6999f6c306537a1f1.png

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值