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

如何创建高级 CSS 下拉菜单

效果展示

在这里插入图片描述

在这里插入图片描述

实现思路及部分代码

1、定义整体页面结构

从上述的效果展示图可以看出,页面的整体结构应该需要一个总菜单容器来装载父级菜单项,并且对应的父级菜单项应该有对应的菜单子项。子菜单是分类的话,我们还需要额外在扩展对应的容器来装载分类子菜单。所以我们可以这样来定义页面的结构:

<div class="header"><div class="dropdown"><button class="link"></button><!-- 分组子菜单 --><div class="dropdown-menu"><div><div class="dropdown-heading"></div><div class="dropdown-links"><a href="#" class="link"></a></div></div></div><!-- 只有一组菜单 --><div class="dropdown"><button class="link"></button><div class="dropdown-menu"><div class="dropdown-links"><a href="#" class="link"></a></div></div></div><!-- 带有表单的子菜单 --><div class="dropdown"><button class="link">登录</button><div class="dropdown-menu"><form class="login-form"><label for="email">Email</label><input type="email" name="email" id="email" /><label for="password">Password</label><input type="password" name="password" id="password" /><button type="submit">Login</button></form></div></div></div>
</div>

2、编写对应的样式

在页面结构的基础上进行样式的编写,具体核心代码如下:

.header {background-color: #f3f3f3;display: flex;align-items: baseline;padding: 0.5rem;gap: 1rem;
}.link {background: none;border: none;text-decoration: none;color: #777;font-family: inherit;font-size: inherit;cursor: pointer;padding: 0;
}.dropdown-menu {position: absolute;left: 0;top: calc(100% + 0.25rem);background-color: white;padding: 0.75rem;border-radius: 0.25rem;box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.1);opacity: 0;pointer-events: none;transform: translateY(-10px);transition: opacity 150ms ease-in-out, transform 150ms ease-in-out;
}.dropdown.active > .link + .dropdown-menu {opacity: 1;transform: translateY(0);pointer-events: auto;
}.information-grid {display: grid;grid-template-columns: repeat(2, max-content);gap: 2rem;
}.dropdown-links {display: flex;flex-direction: column;gap: 0.25rem;
}.login-form > input {margin-bottom: 0.5rem;
}

3、决定下拉菜单的触发事件并编写对应事件代码

在这里我选择点击事件来触发菜单的显示,并且为了方便事件额获取,所以我这里会为关键的事件元素添加对应的data属性,具体实例如下:

<div class="dropdown" data-dropdown></div>
<button class="link" data-dropdown-button>新闻版块</button>
document.addEventListener("click", (e) => {const isDropdownButton = e.target.matches("[data-dropdown-button]");if (!isDropdownButton && e.target.closest("[data-dropdown]") != null) return;let currentDropdown;if (isDropdownButton) {currentDropdown = e.target.closest("[data-dropdown]");currentDropdown.classList.toggle("active");}document.querySelectorAll("[data-dropdown].active").forEach((dropdown) => {if (dropdown === currentDropdown) return;dropdown.classList.remove("active");});
});

完整代码

完整代码示例下载

http://www.lryc.cn/news/96895.html

相关文章:

  • java中判断list是否为空
  • 龙芯3A5000板卡在高性能工作站的应用方案-迅为电子
  • WebSocket心跳机制
  • Form Generator 扩展子表单组件之表单校验(超详细)
  • HTTPS安全套接字层超文本传输协议
  • Jenkins发送的邮箱中没有带配置的压缩附件
  • VU3-02
  • Linux新手小程序——进度条
  • 会点C++还需要再学Python吗?
  • Ceph入门到精通- Linux 磁盘管理(block 与 inode)
  • 安全DNS,状态码,编码笔记整理
  • 【业务功能篇53】Springboot 数据封装对象
  • 将Spring Session存储到Redis中实现持久化
  • Git工作中常用命令
  • 【电路效应】信号处理和通信系统模型中的模拟电路效应研究(SimulinkMatlab代码实现)
  • Spring 的元注解
  • 【前缀和】238. 除自身以外数组的乘积
  • 【Java中间件】RocketMQ
  • Megatron-LM、NVIDIA NeMo、MegaMolBART 、model_optim_rng.pt 文件是什么?
  • 2023年信息系统项目管理师如何报名?老司机告诉你
  • linux ubuntu系统 命令备忘
  • 我的第一个flutter项目(Android Webview)
  • 微信机器人搭建详细教程
  • opengauss安装
  • 什么是SVM算法?硬间隔和软间隔的分类问题
  • Normalization(BN and LN) in NN
  • opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)
  • python机器学习(五)逻辑回归、决策边界、代价函数、梯度下降法实现线性和非线性逻辑回归
  • 聊聊Linq中.AsEnumerable(), AsQueryable() ,.ToList(),的区别和用法
  • 【机器学习】机器学习中的“本体”概念