实现过程

实现一个简易的鼠标悬停菜单项显示其子项的下拉框控件。将用到 CSS 绝对定位、流式布局、动画等;JQuery 鼠标移入和移出事件、DOM 查找。效果图如下:

HTML 结构:

<div class="dropdown-group">
<div class="dropdown">
<div class="label">菜单1</div>
<div class="items">
<div class="item">菜单1-1</div>
</div>
</div>
</div>

使用流式布局让div.dropdown-group下的所有div.dropdown横向排列:

.dropdown-group {
cursor: pointer;
height: 40px;
width: 220px;
display: flex;
justify-content: space-between;
align-content: center;
align-items: center;
background-color: #7979de;
}

div.dropdown 的高和宽都要和父元素保持一致,并且定位是相对定位,因为其子项都是相对于它进行的。

.dropdown {
height: 100%;
width: 100%;
position: relative;
}

div.dropdown div.items也就是下拉所展示的元素,相对于其父元素进行定位,自身是绝对定位,top的值和父元素的高度一致,即 40px,left的值设置 0px,左上角对齐父元素的左下角。display在鼠标没有悬停时设置为 none。

当鼠标悬停菜单时,div.dropdown div.itemsdisplay设置为 block。动画有 0.5s 的延迟,从 0 高度到最大高度过程中,元素溢出时必须要隐藏,即overflow-y: hidden

.dropdown .items {
display: none;
width: 100%;
padding: 5px;
position: absolute;
top: 40px;
left: 0;
overflow-y: hidden;
box-sizing: border-box;
background-color: #00b7ff;
} .dropdown:hover .items {
display: block;
}

最后,轮到 JQ 部分,当鼠标悬停时,查询每一个子项的总高度,以及添加样式和移除样式:

$(".dropdown")
.mouseenter(function () {
let $items = $(this).find("div.items");
$(this).css({ "--items-height": `${$items.height()}px` });
$items.addClass("show-items");
})
.mouseleave(function () {
let $items = $(this).find("div.items");
$items.removeClass("show-items");
});
.show-items {
animation: ShowItems 0.5s ease-in-out;
} @keyframes ShowItems {
0% {
height: 0;
}
100% {
height: var(--items-height);
}
}

最新文章

  1. Razor Engine,实现代码生成器的又一件利器
  2. log4j日志配置
  3. 在Ubuntu 14.04安装Nginx
  4. PHP 面向对象:抽象类继承抽象类
  5. Pyqt QListWidget之缩略图列表
  6. ORACLE基本语法
  7. 使用commons-fileUpload组件上传文件
  8. struts1.3异常处理机制
  9. Performance Tuning of Spring/Hibernate Applications---reference
  10. 《University Calculus》-chape8-无穷序列和无穷级数-欧拉恒等式
  11. Hadoop 相关问题
  12. 老李分享:Mac快捷键
  13. ssh -T git@github.com出现Permission denied (publickey)
  14. 解决IOS iframe不滚动问题
  15. DevOps/TestOps概念
  16. oracle错误汇总2
  17. codeforces707C
  18. DirectX using C++_error X3539:ps1_x is no longer supported...解决方案
  19. Pytorch 之 backward
  20. python 全栈开发,Day67(Django简介)

热门文章

  1. 【开源库推荐】#4 Poi-办公文档处理库
  2. 【ubuntu】解决无法打开终端:gnome-terminal找不到路径问题
  3. frp内网穿透(已验证)
  4. BeanShell 后置处理器/前置处理器实现urldecode 解码
  5. APP异常测试点汇总
  6. 一阶段目标检测网络-RetinaNet 详解
  7. APICloud平台使用融云模块实现音视频通话实践经验总结分享
  8. git remote update origin --prune命令失败
  9. [编程基础] Python中的绝对导入与相对导入
  10. DVWA靶场实战(二)——Command Injection