vue实现导航栏下拉菜单

作者:凡小多 时间:2024-05-09 15:17:56 

本文实例为大家分享了vue实现导航栏下拉菜单的具体代码,供大家参考,具体内容如下

先看效果:

vue实现导航栏下拉菜单

下拉菜单铺满全屏

<div class="nav">...</div>
<div class="dropdown-content">...</div>
.nav {
?? ?position: relative;
}
.dropdown-content {
?? ?position: absolute;
?? ?width: 100%; ?// 拉满
}

下拉动画

方法一:鼠标移入移出事件

使用的是vue的 transition组件以及鼠标事件@mouseenter@mouseleave

.dropdown-enter-active {
? animation: expand-contract 1s ease;
}
.dropdown-leave-active {
? animation: expand-contract 1s ease reverse;
}
@keyframes expand-contract {
? 0% {
? ? overflow: hidden;
? ? opacity: 0;
? ? max-height: 0;
? }
? 100% {
? ? max-height: 300px; ?// 大于等于下拉菜单的高度
? ? opacity: 1;
? }
}

优点:

1、结构层次清楚
2、多个导航需要下拉菜单,且结构相似内容不同,只需要重新渲染数据即可。

缺点:

1、使用了事件处理相对复杂

案例代码

<template>
? <div class="app-container">
? ? <!-- 导航栏 -->
? ? <div class="nav" ref="navRef">
? ? ? <div class="nav-item" @mouseenter="isShow = false">导航栏1</div>
? ? ? <div class="nav-item" @mouseenter="showDropDown('2')">导航栏2</div>
? ? ? <div class="nav-item" @mouseenter="showDropDown('3')">导航栏3</div>
? ? ? <div class="nav-item" @mouseenter="isShow = false">导航栏4</div>
? ? ? <div class="nav-item" @mouseenter="isShow = false">导航栏5</div>
? ? </div>
? ? <!-- 下拉菜单 -->
? ? <transition name="dropdown">
? ? ? <div v-show="isShow" class="dropdown-content" @mouseleave="hideDropDown">
? ? ? ? <div class="dropdown-menu">
? ? ? ? ? <div class="menuItem" v-for="(item, index) in analog" :key="index">
? ? ? ? ? ? {{ item }}
? ? ? ? ? </div>
? ? ? ? </div>
? ? ? </div>
? ? </transition>
? </div>
</template>

<script>
export default {
? data() {
? ? return {
? ? ? isShow: false,
? ? ? navTop: 0,
? ? ? // 模拟下拉菜单内容
? ? ? analog: [],
? ? };
? },
? mounted() {
? ? // 导航栏距页面高度 = 元素顶部距页面距离 + 元素本身高度
? ? this.navTop =
? ? ? this.$refs.navRef.getBoundingClientRect().top +
? ? ? this.$refs.navRef.offsetHeight;
? },
? methods: {
? ? showDropDown(val) {
? ? ? if (!this.isShow) this.isShow = true;
? ? ? if (val === "2") {
? ? ? ? this.analog = ["菜单1", "菜单1", "菜单1", "菜单1", "菜单1"];
? ? ? } else {
? ? ? ? this.analog = ["菜单22", "菜单22", "菜单22", "菜单22", "菜单22"];
? ? ? }
? ? },
? ? hideDropDown(e) {
? ? ? // e.pageY:鼠标指针相对页面的偏移量
? ? ? if (this.isShow && e.pageY >= this.navTop) this.isShow = false;
? ? },
? },
};
</script>

<style lang="scss" scoped>
// 下拉菜单收缩展开
@keyframes expand-contract {
? 0% {
? ? opacity: 0;
? ? height: 0;
? ? // max-height: 0;
? }
? 100% {
? ? opacity: 1;
? ? height: 300px;
? ? // max-height: 300px; ?// 大于等于下拉菜单的高度
? }
}
.dropdown-enter-active {
? animation: expand-contract 0.6s;
}
.dropdown-leave-active {
? animation: expand-contract 0.6s reverse;
}

// 内容变化
@keyframes menu {
? 0% {
? ? opacity: 0;
? }
? 100% {
? ? opacity: 1;
? }
}

// 导航栏
.nav {
? position: relative;
? display: flex;
? width: 100%;
? height: 80px;
? line-height: 80px;
? background-color: #eee;
? border-bottom: 1px solid #ccc;
? .nav-item {
? ? position: relative;
? ? margin: 0 20px;
? ? cursor: pointer;
? ? transition: all 0.3s linear;
? ? &::before {
? ? ? content: "";
? ? ? position: absolute;
? ? ? bottom: 0;
? ? ? left: 0;
? ? ? height: 2px;
? ? ? width: 100%;
? ? ? background-color: #1678e9;
? ? ? transform: scale(0);
? ? ? transition: all 0.4s linear;
? ? }
? ? &:hover {
? ? ? color: #1678e9;
? ? ? &::before {
? ? ? ? transform: scale(1);
? ? ? }
? ? }
? }
}
.dropdown-content {
? position: absolute;
? width: 100%; // 拉满
? overflow: hidden;
? .dropdown-menu {
? ? padding: 10px 8px 15px;
? ? color: white;
? ? background-color: rgba($color: #ccc, $alpha: 0.5);
? ? border-radius: 4px;
? ? /* animation: menu 0.6s; */
? ? .menuItem {
? ? ? width: 100%;
? ? ? white-space: nowrap;
? ? ? padding: 10px 16px;
? ? ? font-size: 16px;
? ? ? color: #000;
? ? ? cursor: pointer;
? ? ? transition: all 0.3s;
? ? ? border-radius: 4px;
? ? ? &:hover {
? ? ? ? background-color: #ccc;
? ? ? }
? ? }
? }
}
</style>

方法二:hover

将下拉菜单需要下拉的导航栏下一级下,使用hover 控制元素,nav-item不要设置相对定位,以免定位时下拉菜单宽度不能100%铺满导航栏宽度。

vue实现导航栏下拉菜单

将菜单初始高度设为0

vue实现导航栏下拉菜单

优点:

1、简单明了,不需要事件,js等操作

缺点:

1、每个下拉菜单独立,也就是说切换导航栏,下拉菜单显示隐藏也会动画堆叠
2、每个导航标题都需要单独写下拉菜单,结构层次变多

案例代码

<template>
? <div class="app-container">
? ? <!-- 导航栏 -->
? ? <div class="nav">
? ? ? <div class="nav-item"><span class="nav-item-title">导航栏1</span></div>
? ? ? <div class="nav-item">
? ? ? ? <span class="nav-item-title">导航栏2</span>
? ? ? ? <!-- 下拉菜单 -->
? ? ? ? <div class="dropdown-content">
? ? ? ? ? <div class="dropdown-menu">
? ? ? ? ? ? <div class="menuItem">菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单2</div>
? ? ? ? ? ? <div class="menuItem">菜单菜单菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单3</div>
? ? ? ? ? </div>
? ? ? ? </div>
? ? ? </div>
? ? ? <div class="nav-item"><span class="nav-item-title">导航栏3</span></div>
? ? ? <div class="nav-item">
? ? ? ? <span class="nav-item-title">导航栏4</span>
? ? ? ? <!-- 下拉菜单 -->
? ? ? ? <div class="dropdown-content">
? ? ? ? ? <div class="dropdown-menu">
? ? ? ? ? ? <div class="menuItem">菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单2</div>
? ? ? ? ? ? <div class="menuItem">菜单菜单菜单1</div>
? ? ? ? ? ? <div class="menuItem">菜单3</div>
? ? ? ? ? </div>
? ? ? ? </div>
? ? ? </div>
? ? ? <div class="nav-item"><span class="nav-item-title">导航栏5</span></div>
? ? </div>
? </div>
</template>

<script>
export default {
? data() {
? ? return {
? ? ? isShow: false,
? ? };
? },
? mounted() {},
? methods: {},
};
</script>

<style lang="scss" scoped>
.nav {
? position: relative;
? display: flex;
? width: 100%;
? height: 80px;
? line-height: 80px;
? background-color: #eee;
? border-bottom: 1px solid #ccc;
? .nav-item {
? ? // position: relative;
? ? margin: 0 20px;
? ? cursor: pointer;
? ? transition: all 0.3s linear;
? ? .nav-item-title {
? ? ? position: relative;
? ? ? display: block;
? ? ? height: inherit;
? ? ? width: inherit;
? ? ? &::before {
? ? ? ? content: "";
? ? ? ? position: absolute;
? ? ? ? bottom: 0;
? ? ? ? left: 0;
? ? ? ? height: 2px;
? ? ? ? width: 100%;
? ? ? ? background-color: #1678e9;
? ? ? ? transform: scale(0);
? ? ? ? transition: all 0.4s linear;
? ? ? }
? ? ? &:hover {
? ? ? ? color: #1678e9;
? ? ? ? &::before {
? ? ? ? ? transform: scale(1);
? ? ? ? }
? ? ? }
? ? }
? ? &:hover .dropdown-content {
? ? ? height: 300px;
? ? }
? }
? // 下拉菜单
? .dropdown-content {
? ? position: absolute;
? ? top: 80px; // 为导航栏高度
? ? left: 0; // 设置为0, 不然会直接定位到父元素下方
? ? width: 100%;
? ? height: 0; // 下拉初始高度
? ? overflow: hidden;
? ? transition: 0.6s;
? ? .dropdown-menu {
? ? ? padding: 10px 8px 15px;
? ? ? color: white;
? ? ? background-color: rgba($color: #ccc, $alpha: 0.5);
? ? ? border-radius: 4px;
? ? ? .menuItem {
? ? ? ? width: 100%;
? ? ? ? height: 42px;
? ? ? ? white-space: nowrap;
? ? ? ? padding: 0 16px;
? ? ? ? font-size: 16px;
? ? ? ? line-height: 42px;
? ? ? ? color: #000;
? ? ? ? cursor: pointer;
? ? ? ? transition: all 0.3s ease-in-out;
? ? ? ? border-radius: 4px;
? ? ? ? &:hover {
? ? ? ? ? background-color: #ccc;
? ? ? ? }
? ? ? }
? ? }
? }
}
</style>

来源:https://blog.csdn.net/wgh4318/article/details/126426602

标签:vue,导航栏,下拉菜单
0
投稿

猜你喜欢

  • SQL Server 2005 SP3正式版下载

    2008-12-16 12:42:00
  • Python识别处理照片中的条形码

    2022-12-10 17:30:42
  • 关于python中remove的一些坑小结

    2022-09-22 02:14:31
  • 如何在windows下安装配置python工具Ulipad

    2023-07-25 20:38:59
  • PyCharm安装配置Qt Designer+PyUIC图文教程

    2022-10-21 08:44:46
  • Python中使用第三方库xlrd来写入Excel文件示例

    2023-08-16 21:37:29
  • 解析python 中/ 和 % 和 //(地板除)

    2021-04-19 02:05:14
  • python通过函数名调用函数的几种场景

    2023-10-21 00:25:43
  • perl 调试命令的相关知识小结

    2022-10-01 14:09:48
  • Python selenium把歌词评论做成词云图

    2022-12-29 10:17:35
  • Python 面向切面编程 AOP 及装饰器

    2021-05-07 14:16:36
  • css样式命名规则

    2008-04-30 12:31:00
  • Pytorch自动求导函数详解流程以及与TensorFlow搭建网络的对比

    2023-07-08 18:44:37
  • 用不着妄自菲薄对ASP和ASP程序员的一些话

    2007-08-22 15:09:00
  • 浅析Python的命名空间与作用域

    2022-11-27 04:19:04
  • 基于Python实现计算纳什均衡的示例详解

    2022-03-03 12:44:27
  • Asp.Net MVC3.0如何项目部署到Win7 64位系统

    2024-03-12 19:59:34
  • sql基本查询语句介绍

    2008-05-21 13:58:00
  • Python时间转化方法超全总结

    2021-10-23 02:39:56
  • Python动态加载模块的3种方法

    2023-12-22 21:33:29
  • asp之家 网络编程 m.aspxhome.com