
在现代 web 应用中,侧边导航菜单的动态隐藏与展开是常见的交互模式,它有助于优化屏幕空间利用率,提升用户体验。本教程将基于一个 vue.js 组件示例,深入讲解如何实现这一功能。
实现动态侧边菜单的关键在于结合 Vue.js 的响应式数据和 CSS 的过渡效果。
首先,我们来看一下父组件(包含侧边菜单)的模板和脚本结构。
<template>
<div class="menu" :class="{ 'small-menu': smallMenu }">
<!-- 菜单项列表 -->
<MenuItem
v-for="(item, index) in menuTree"
:key="index"
:data="item.children"
:label="item.label"
:depth="0"
:smallMenu="smallMenu" <!-- 将 smallMenu 状态传递给子组件 -->
/>
<!-- 汉堡包图标,用于切换菜单状态 -->
<i @click="toggleMenu" class="material-icons">menu</i>
</div>
</template>关键点解析:
立即学习“前端免费学习笔记(深入)”;
<script>
import MenuItem from './MenuItem.vue'; // 假设 MenuItem 组件在同级目录
export default {
components: {
MenuItem
},
data() {
return {
smallMenu: false, // 初始状态为展开
menuTree: [
// 示例菜单数据,根据实际需求填充
{ label: '仪表盘', children: [] },
{ label: '用户管理', children: [] },
// ...更多菜单项
]
};
},
methods: {
toggleMenu() {
this.smallMenu = !this.smallMenu; // 切换菜单状态
console.log('Menu toggled, smallMenu is now:', this.smallMenu); // 调试输出
}
}
};
</script>关键点解析:
立即学习“前端免费学习笔记(深入)”;
为了实现当菜单收缩时隐藏菜单项的文本标签,MenuItem 组件需要根据 smallMenu prop 进行条件渲染。
<!-- MenuItem.vue -->
<template>
<div class="menu-item-wrapper">
<!-- 这里可以放置图标,图标通常在收缩和展开状态下都显示 -->
<span v-if="!smallMenu" class="menu-item-label">{{ label }}</span>
<!-- 如果有子菜单,这里可以递归渲染 -->
<div v-if="data && data.length && !smallMenu" class="submenu">
<!-- ... 渲染子菜单项 -->
</div>
</div>
</template>
<script>
export default {
props: {
label: String,
data: Array,
depth: Number,
smallMenu: Boolean // 接收父组件传递的 smallMenu prop
}
};
</script>
<style scoped>
.menu-item-wrapper {
padding: 10px 15px;
cursor: pointer;
white-space: nowrap; /* 防止文本换行 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
}
/* 当菜单收缩时,可以调整菜单项的样式 */
.menu-item-wrapper.small-menu-item {
padding: 10px 5px; /* 调整内边距 */
text-align: center;
}
.menu-item-label {
margin-left: 10px; /* 标签与图标的间距 */
}
</style>注意: 在 MenuItem 中,v-if="!smallMenu" 用于控制 label 的显示。当 smallMenu 为 true 时,label 不会被渲染,从而实现隐藏文本的效果。
CSS 是实现菜单平滑过渡效果的关键。
<style lang="scss" scoped>
.menu {
background: grey;
position: fixed;
height: 100vh;
width: 240px; /* 默认展开宽度 */
left: 0; /* 修正:原始代码中 left: 110; 可能不是期望值 */
top: 0;
border-right: 1px solid #ececec;
transition: all 0.3s ease; /* 关键:平滑过渡所有属性变化 */
overflow: auto; /* 允许内容滚动 */
padding-top: 50px; /* 为顶部图标留出空间 */
i {
position: fixed;
left: 220px; /* 图标在展开状态下的位置 */
font-size: 20px;
top: 15px;
user-select: none;
cursor: pointer;
transition: all 0.3s ease; /* 图标位置也需要过渡 */
z-index: 100; /* 确保图标在最上层 */
}
&.small-menu {
overflow: hidden; /* 收缩时隐藏滚动条和超出内容 */
width: 60px; /* 收缩后的宽度 */
padding-top: 50px;
i {
left: 20px; /* 图标在收缩状态下的位置 */
}
/* 当菜单收缩时,可以进一步调整 MenuItem 的样式 */
.menu-item-wrapper {
padding: 10px 5px; /* 调整内边距 */
text-align: center;
}
}
}
</style>关键点解析:
立即学习“前端免费学习笔记(深入)”;
通过 Vue.js 的响应式数据 (smallMenu) 和动态类绑定 (:class),结合 CSS 的 transition 属性,我们可以轻松实现一个功能完善且动画平滑的侧边菜单。同时,将 smallMenu 状态作为 prop 传递给子组件,能够让菜单项根据父菜单的收缩状态灵活调整自身显示。在开发过程中,利用 console.log 和浏览器开发者工具进行调试,是解决问题的关键。遵循这些实践,您将能够构建出用户体验优秀的动态侧边导航。
以上就是Vue.js 侧边菜单动态隐藏与展开教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号