CSS 实现伸缩导航仪表板侧边栏菜单

news/2024/6/16 18:18:56 标签: css, 前端

CSS 实现伸缩导航仪表板侧边栏菜单

效果展示

  • 展开状态
    在这里插入图片描述

  • 收起状态
    在这里插入图片描述

CSS 知识点

  • 回顾曲面圆角的实现知识点

字体库准备

菜单的图标使用的是ionicons的图标库,所以需要页面需要引入对应的文件。

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

整体页面布局

菜单名称的隐藏,我们是通过控制菜单容器的宽度来实现的。

<div class="menuToggle"></div>
<div class="sidebar">
  <ul>
    <li class="logo" style="css language-css">--bg:#333">
      <a href="#">
        <div class="icon">
          <ion-icon name="logo-apple"></ion-icon>
        </div>
        <div class="text">Website Logo</div>
      </a>
    </li>
    <div class="Menulist">
      <li style="css language-css">--bg:#f44336" class="active">
        <a hred="#">
          <div class="icon">
            <ion-icon name="home-outline"></ion-icon>
          </div>
          <div class="text">Home</div>
        </a>
      </li>
      <li style="css language-css">--bg:#ffa117">
        <a hred="#">
          <div class="icon">
            <ion-icon name="person-outline"></ion-icon>
          </div>
          <div class="text">Profile</div>
        </a>
      </li>
      <!-- 此处省略了其他菜单项 -->
    </div>
    <div class="bottom">
      <!-- 用户信息 -->
      <li style="css language-css">--bg:#333">
        <a href="#">
          <div class="icon">
            <div class="imgBx">
              <img src="./user.jpg" />
            </div>
          </div>
          <div class="text">Muhammea Irshad</div>
        </a>
      </li>
      <!-- 退出按钮 -->
      <li style="css language-css">--bg:#333">
        <a href="#">
          <div class="icon">
            <ion-icon name="log-out-outline"></ion-icon>
          </div>
          <div class="text">LogOut</div>
        </a>
      </li>
    </div>
  </ul>
</div>

实现整体页面样式

css">:root {
  --clr: #14161e;
}

body {
  min-height: 100vh;
  background: var(--clr);
}

.sidebar {
  position: absolute;
  width: 80px;
  height: 100vh;
  background: #fff;
  transition: 0.5s;
  padding-left: 10px;
  overflow: hidden;
}

编写菜单展开时的样式

首先我们现在页面中添加菜单激活的类,具体代码如下:

<div class="sidebar active">
  <!-- 省略内容代码 -->
</div>

然后编写菜单展开的样式

css">.sidebar.active {
  width: 300px;
}

.sidebar ul {
  position: relative;
  height: 100vh;
}

.sidebar ul li {
  position: relative;
  list-style: none;
}

.sidebar ul li.active {
  background: var(--clr);
  border-top-left-radius: 50px;
  border-bottom-left-radius: 50px;
}

.sidebar ul li.active::before {
  content: "";
  position: absolute;
  top: -20px;
  right: 0;
  width: 20px;
  height: 20px;
  border-bottom-right-radius: 20px;
  /* 使用 box-shadow 属性上曲面 */
  box-shadow: 5px 5px 0 5px var(--clr);
  background: transparent;
}

.sidebar ul li.active::after {
  content: "";
  position: absolute;
  bottom: -20px;
  right: 0;
  width: 20px;
  height: 20px;
  border-top-right-radius: 20px;
  /* 使用 box-shadow 属性下曲面 */
  box-shadow: 5px -5px 0 5px var(--clr);
  background: transparent;
}

代码实现后效果如下:

在这里插入图片描述

编写菜单导航项的样式

我这里先把用户的头像图片隐藏了,便于查看效果。

css">.sidebar ul li.logo {
  margin-bottom: 50px;
}

.sidebar ul li.logo .icon {
  font-size: 2em;
  counter-reset: var(--clr);
}

.sidebar ul li.logo .text {
  font-size: 1.2em;
  font-weight: 500;
  color: var(--clr);
}

.sidebar ul li a {
  position: relative;
  display: flex;
  white-space: nowrap;
  text-decoration: none;
}

.sidebar ul li a .icon {
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  min-width: 60px;
  height: 70px;
  font-size: 1.5em;
  color: #333;
  transition: 0.5s;
  padding-left: 10px;
}

.sidebar ul li a .text {
  position: relative;
  height: 70px;
  display: flex;
  align-items: center;
  font-size: 1em;
  color: #333;
  padding-left: 15px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  transition: 0.5s;
}

.sidebar ul li.active a .icon {
  color: #fff;
}

.sidebar ul li.active a .text {
  color: var(--bg);
}

.sidebar ul li:hover a .icon,
.sidebar ul li:hover a .text {
  color: var(--bg);
  cursor: pointer;
}

.sidebar ul li.active a .icon::before {
  content: "";
  position: absolute;
  inset: 5px;
  width: 60px;
  height: 60px;
  background: var(--bg);
  border-radius: 50%;
  transition: 0.5s;
}

.sidebar ul li:hover.active a .icon::before {
  background: #fff;
}

最终效果如下:

在这里插入图片描述

编写用户信息和退出菜单的样式

css">.bottom {
  position: absolute;
  bottom: 0;
  width: 100%;
}

.imgBx {
  position: relative;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  overflow: hidden;
}

.imgBx img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

最终效果如下:
在这里插入图片描述

编写菜单收起和张开的按钮

css">.menuToggle {
  position: absolute;
  top: 20px;
  right: 20px;
  width: 50px;
  height: 50px;
  background: #31a4ff;
  z-index: 1000;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
}

.menuToggle::before {
  content: "";
  position: absolute;
  width: 30px;
  height: 3px;
  background: #fff;
  transform: translateY(-9px);
  transition: 0.5s;
  box-shadow: 0 9px 0 #fff;
}

.menuToggle::after {
  content: "";
  position: absolute;
  width: 30px;
  height: 3px;
  background: #fff;
  transform: translateY(9px);
  transition: 0.5s;
}

.menuToggle.active::before {
  transform: translateY(0) rotate(45deg);
  box-shadow: 0 0 0 #fff;
}

.menuToggle.active::after {
  transform: translateY(0) rotate(-45deg);
}

使用 JavaScript 编写菜单收起和展开效果

let menuToggle = document.querySelector(".menuToggle");
let sidebar = document.querySelector(".sidebar");

menuToggle.onclick = function () {
  menuToggle.classList.toggle("active");
  sidebar.classList.toggle("active");
};

let Menulist = document.querySelectorAll(".Menulist li");
function activeLink() {
  Menulist.forEach((item) => {
    item.classList.remove("active");
  });
  this.classList.add("active");
}
Menulist.forEach((item) => {
  item.addEventListener("click", activeLink);
});

完整代码下载

完整代码下载


http://www.niftyadmin.cn/n/5469422.html

相关文章

LabVIEW电力设备在线监测系统

LabVIEW电力设备在线监测系统 在电力行业中&#xff0c;变电站的稳定运行对于保障电力系统的安全性和可靠性至关重要。开发了一种基于LabVIEW软件开发的变电站电力设备在线监测系统&#xff0c;实时监控变电站内部的电力设备状态&#xff0c;确保电力传输的高效与安全。通过对…

使用subprocess包来在python代码实时查看GPU利用率

最近又被GPU利用率问题导致训练不高效的问题搞到了&#xff08;恼&#xff09;&#xff0c;所以在py使用代码看看是哪出了问题。 import subprocessdef get_gpu_utilization():# 运行nvidia-smi命令smi_output subprocess.check_output([nvidia-smi, --query-gpuutilization.…

通用分布式锁组件

通用分布式锁组件 1 Redisson1.1介绍1.2 快速了解1.3 项目集成 2 定义通用分布式锁组件2.1 实现思路分析2.2 定义注解2.3 定义切面2.4 使用锁2.5.工厂模式切换锁类型2.5.1 锁类型枚举2.5.2 锁对象工厂2.5.3 改造切面代码 2.6 锁失败策略2.6.1 策略分析2.6.2 策略实现 2.7 基于S…

HomePlug AV

目录 HomePlug AV的基本概念基本术语网络概念网络实例 HomePlug AV物理层&#xff08;PHY&#xff09;HomePlug AV OFDM收发器架构PHY的调制模式FC调制和ROBO调制物理层的特点OFDM频域/时域转换开窗/槽式OFDM信号和噪声PHY发送控制——信道自适应PHY帧格式&#xff08;Symbol&a…

2024.3.1力扣每日一题——检查数组是否存在有效划分

2024.3.1 题目来源我的题解方法一 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2369 我的题解 方法一 动态规划 设数组 nums\textit{nums}nums 的长度为 nnn&#xff0c;它至少存在一个有效划分的充要条件为&#xff1a; 前 (n−2)个元素组成的数组至少存在…

注意力机制简单理解-翻译,图像,我爱吃苹果案例

注意力机制简单理解 以翻译为基础,讲解一个生动的案例 让我们以机器翻译为例,来生动讲解一个关于Query、Key和Value在注意力机制中的案例。 想象一下,你是一名翻译官,现在需要将一段英文句子翻译成中文。这个英文句子是:“The cat is sitting on the mat.”(猫坐在垫子上…

git上传到本地仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

Maven--lib分离的打包方式

就是把lib包和source源码分开打包。优势就是&#xff0c;面对频繁更新的应用场景时&#xff0c;可以只更新源码包&#xff08;当然&#xff0c;前提是你的依赖没有增减&#xff09;。尤其是使用jenkins更新项目时&#xff0c;会省去很多时间吧&#xff1f; 不同项目的 lib之间不…