当前位置: 首页 > news >正文

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

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

效果展示

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

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

CSS 知识点

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

字体库准备

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

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

整体页面布局

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

<div class="menuToggle"></div>
<div class="sidebar"><ul><li class="logo" style="--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="--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="--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="--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="--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>

实现整体页面样式

: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>

然后编写菜单展开的样式

.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;
}

代码实现后效果如下:

在这里插入图片描述

编写菜单导航项的样式

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

.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;
}

最终效果如下:

在这里插入图片描述

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

.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;
}

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

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

.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);
});

完整代码下载

完整代码下载

相关文章:

  • PHP教程_如何向PHP5中的数组(Array)插入元素
  • 前端跨页面通信方案介绍
  • JavaScript 删除数组中指定元素的6种方法
  • C语言第三十九弹---预处理(上)
  • 【QT5-程序控制电源-串口通讯-<低成本>-程控电源方案-上位机-基础样例【3】】
  • 面试题 之 vue
  • 数据库-root密码丢失的重置方案(win11环境)
  • andv vue 实现多张图片上传
  • 史上最强 PyTorch 2.2 GPU 版最新安装教程
  • golang和Java的简单介绍和对比
  • cesium 加载gltf并实时改变位置 CallbackProperty方式
  • Mybatis 之 useGeneratedKeys
  • nodejs的express负载均衡
  • 手写三维点云配准的迭代最近点(ICP)算法
  • 算法学习系列(四十五):DFS之剪枝与优化
  • [LeetCode] Wiggle Sort
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Docker容器管理
  • js中的正则表达式入门
  • Linux CTF 逆向入门
  • mysql中InnoDB引擎中页的概念
  • Sass Day-01
  • 诡异!React stopPropagation失灵
  • 回顾2016
  • 精彩代码 vue.js
  • 利用jquery编写加法运算验证码
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 浅谈Golang中select的用法
  • 数组大概知多少
  • 延迟脚本的方式
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 带你开发类似Pokemon Go的AR游戏
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (2)STM32单片机上位机
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (四) 虚拟摄像头vivi体验
  • (转)ORM
  • (转载)CentOS查看系统信息|CentOS查看命令
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net CHARTING图表控件下载地址
  • .NET/C# 使窗口永不获得焦点
  • .Net7 环境安装配置
  • @RunWith注解作用
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • []error LNK2001: unresolved external symbol _m
  • [Android 数据通信] android cmwap接入点
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CISCN2019 华东南赛区]Web11
  • [CTF]php is_numeric绕过
  • [halcon案例2] 足球场的提取和射影变换