日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > vue >内容正文

vue

vue实现侧边折叠菜单栏手风琴效果

發(fā)布時間:2023/12/4 vue 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vue实现侧边折叠菜单栏手风琴效果 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在我們做管理后臺亦或是產(chǎn)品流程時,總是需要一個菜單欄或者導(dǎo)航欄來架起我們的產(chǎn)品架構(gòu),那么,如何用vue實現(xiàn)側(cè)邊折疊導(dǎo)航欄呢?接下來將一一介紹。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?請先看效果演示圖。


步驟1:先架構(gòu)整個頁面的布局,撰寫html、css和js
HTML代碼

<template><div id="main"><div class="content"><!-- 左邊導(dǎo)航欄 --><div class="admin_nav col-lg-3 col-xl-2" v-show="fullWidth"><div class = "admin_nav_site"><div class="title">數(shù)據(jù)中心后臺管理</div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)"ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div></div><!-- 右邊內(nèi)容 --><div class="admin_content col-12 col-md-12 col-lg-12 col-xl-10"><div class="admin_header"><!-- 導(dǎo)航圖標(biāo) --><div class="H5_item" v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div class="user"><div class="userHead"><span><img src="../../assets/image/userhead.svg"></span><span>admin</span></div><div class="logOut"><i class="iconfont icon-tuichu"></i></div></div></div><div class="admin_body"><keep-alive><router-view /></keep-alive></div></div></div></div> </template>

JS代碼

<script>import axios from 'axios';export default {name: 'navigation',data() {return {navList: [{title: '用戶管理',isSubShow: false,className: 'icon-guanliyuan1',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '工號管理',path: '/home/navigation-one/user'}, // {// name: '角色管理',// path: '/home/navigation-one/role'// }, // {// name: '權(quán)限管理',// path: '/home/navigation-one/user'// }, ]},{title: '資源管理',isSubShow: false,className: 'icon-ziyuan',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '我的收藏',path: '/home/navigation-one/user'},{name: '我的項目',path: '/home/navigation-one/role'}]},{title: '綜合管理',isSubShow: false,className: 'icon-zonghe',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '劃配管理',path: '/home/navigation-one/user'},{name: '數(shù)據(jù)信息',path: '/home/navigation-one/role'}]},{title: '系統(tǒng)消息',isSubShow: false,className: 'icon-xiaoxi',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '實時動態(tài)',path: '/home/navigation-one/user'},{name: '過去動態(tài)',path: '/home/navigation-one/role'}]}],currentSort: 0,pagetype: "index",fullWidth: true,dismenu: true}},methods: {active(index) {this.currentSort = index;},changeTitleColor(index) {this.currentSort = index;},removeTitleColor(index) {this.currentSort = null;},handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';}}}} </script>

CSS代碼

#main {background: #F0F6FF;font-size: 0.16rem;}#main .content {display: flex;flex-direction: row;}.content .admin_nav {min-height: 9.37rem;max-height: 1.3rem;padding: 0 !important;background: #364150;position: relative;}.content .admin_nav .admin_nav_site{height: 100vh;}.content .admin_nav .title {height: 1.39rem;line-height: 1.39rem;background: rgba(63, 73, 86, 1);color: #FFFFFF;text-align: center;font-size: 0.18rem;display: flex;justify-content: center;}.content .admin_nav .title div {padding: 0 0.03rem;}.content .admin_nav .title div:first-child i {font-size: 0.18rem;}.content .admin_nav ul .active {background: rgba(68, 81, 99, 1);}.content .admin_nav ul .active1 a.router-link-active {color: #fff;}.content .admin_nav ul li {height: 0.6rem;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 0.18rem;}.content .admin_nav ul li a {color: #cecdc5;cursor: pointer;}.content .admin_nav ul li:first-child {font-size: 0.2rem;height: 0.64rem;display: flex;flex-direction: row;align-items: center;color: #BEC5C0;cursor: pointer;}.content .admin_nav ul li:first-child div {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;color: #BEC5C0;}.content .admin_nav ul li:first-child .left_icon {width: 22%;}.content .admin_nav ul li:first-child .left_icon i {color: #1296DB;}.content .admin_nav ul li:first-child .middle {width: 56%;display: flex;justify-content: flex-start;}.content .admin_nav ul li:first-child .right_icon {width: 22%;}.admin_nav .admin .middle:hover {color: #fff;}.admin_nav .admin .right_icon i:hover {color: #fff;}.admin_nav .admin .middle.router-link-active {color: #fff;}.content .admin_nav_position {position: absolute;z-index: 3000;}.content .admin_content {padding: 0 !important;}.content .admin_content .admin_header {width: 100%;height: 0.6rem;background: #364150;display: flex;flex-direction: row;align-items: center;justify-content: space-between;}.content .admin_content .admin_header .H5_item {width: 0.4rem;height: 0.4rem;border-radius: 0.2rem;display: flex;justify-content: center;align-items: center;margin-left: 0.2rem;}.content .admin_content .admin_header .H5_item i {font-size: 0.22rem;color: #fff;}.content .admin_content .admin_header .user {width: 100%;display: flex;align-items: center;justify-content: flex-end;}.content .admin_content .admin_header .user .userHead {height: 0.6rem;display: flex;flex-direction: row;align-items: center;color: #fff;font-size: 0.18rem;}.content .admin_content .admin_header .user .userHead span {padding: 0 0.05rem;}.content .admin_content .admin_header .user .userHead span:nth-child(1) {position: relative;}.content .admin_content .admin_header .user .userHead span img {width: 0.4rem;height: 0.4rem;border-radius: 50%;}.content .admin_content .admin_header .user .userHead span input {width: 0.4rem;height: 0.4rem;position: absolute;overflow: hidden;opacity: 0;cursor: pointer;}.content .admin_content .admin_header .user .logOut {color: #fff;margin-left: 0.12rem;margin-right: 0.5rem;}.content .admin_content .admin_header .user .logOut i {color: #1296DB;font-size: 0.24rem;cursor: pointer;}.toggle-cart-enter-active {transition: all 0.4s linear;}.toggle-cart-leave-active {transition: all 0.4s linear;}.toggle-cart-enter {transform: translateX(-200%);}.toggle-cart-leave-active {transform: translateX(-200%);}

?

步驟2:撰寫完基本網(wǎng)頁布局和樣式后,對部分細(xì)節(jié)進(jìn)行剖析。

1、動態(tài)綁定路徑

<router-link :to="it.path" tag="a">{{it.name}}</router-link>

2、一級菜單,標(biāo)題及折疊符號

①通過@mouseenter和@mouseleave事件,當(dāng)鼠標(biāo)移入和移出時,改變標(biāo)題區(qū)域背景顏色

②通過@click事件,當(dāng)鼠標(biāo)點擊時,顯示二級菜單列表

③利用:class動態(tài)綁定類名,觸發(fā)active方法,修改折疊符號狀態(tài);綁定圖標(biāo)類名,通過遍歷,修改對應(yīng)圖標(biāo)

<ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)" ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li> </ul> active(index) {this.currentSort = index; },changeTitleColor(index) {this.currentSort = index; },removeTitleColor(index) {this.currentSort = null; },handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';} }

步驟3:菜單欄完成后,在網(wǎng)頁端能進(jìn)行查看,但是還需做一個手機(jī)端適配,這樣就達(dá)到兩端同步適應(yīng)的效果。實現(xiàn)如下:

①對左邊導(dǎo)航欄再撰寫第二套代碼,并綁定好對應(yīng)的參數(shù)實現(xiàn)顯示和隱藏

②運(yùn)用vue已有的transition,綁定name值,實現(xiàn)動畫效果綁定

HTML代碼

<!-- 移動端導(dǎo)航欄 --> <transition name="toggle-cart"><div class="admin_nav admin_nav_position col-8 col-md-5 col-lg-3 col-xl-3" v-show="!fullWidth&&!dismenu"><div class="title"><div v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div>數(shù)據(jù)中心后臺管理</div></div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)" ref="title" :class="{active:currentSort == index}"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div> </transition>

JS代碼

mounted() {window.onresize = () => { //監(jiān)聽屏幕變化this.page_width();};this.page_width(); }, methods: {make_menu() { //點擊導(dǎo)航圖標(biāo)this.dismenu = !this.dismenu;},page_width() { //獲取屏幕寬度var screenWidth = window.screen.width;if (screenWidth <= 1024) {this.fullWidth = false;} else {this.fullWidth = true;}} }

最后來看下手機(jī)端效果:

附上全文代碼:

<template><div id="main"><div class="content"><!-- 左邊導(dǎo)航欄 --><div class="admin_nav col-lg-3 col-xl-2" v-show="fullWidth"><div class = "admin_nav_site"><div class="title">數(shù)據(jù)中心后臺管理</div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)" ref="title" :class="{active:currentSort == index}" class="col-lg-12"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div><!-- 管理員端 --><!-- <ul class="admin"><li class="col-lg-12"><div class="left_icon"><i class="iconfont icon-guanliyuan1"></i></div><router-link to="/admin/administrator/secadmin" tag="div" class="middle">管理員端</router-link><div class="right_icon"><i class="iconfont icon-jinru"></i></div></li></ul> --></div><!-- 右邊內(nèi)容 --><div class="admin_content col-12 col-md-12 col-lg-12 col-xl-10"><div class="admin_header"><!-- 導(dǎo)航圖標(biāo) --><div class="H5_item" v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div class="user"><div class="userHead"><span><img src="../../assets/image/userhead.svg"></span><span>admin</span></div><div class="logOut"><i class="iconfont icon-tuichu"></i></div></div></div><div class="admin_body"><keep-alive><router-view /></keep-alive></div></div><!-- 移動端導(dǎo)航欄 --><transition name="toggle-cart"><div class="admin_nav admin_nav_position col-8 col-md-5 col-lg-3 col-xl-3" v-show="!fullWidth&&!dismenu"><div class="title"><div v-show="!fullWidth"><i class="iconfont icon-daohanglan" @click="make_menu" class-name="H5-menu"></i></div><div>數(shù)據(jù)中心后臺管理</div></div><ul v-for="(item,index) in navList" :key="index"><li @click="handleToTitle(index,item)" @mouseenter="changeTitleColor(index)" @mouseleave="removeTitleColor(index)"ref="title" :class="{active:currentSort == index}"><div class="left_icon"><i :class="'iconfont '+item.className"></i></div><div class="middle">{{item.title}}</div><div class="right_icon"><i :class="'iconfont '+item.close"></i></div></li><li v-for="(it,idx) in item.secMenu" :key="idx" v-show="item.isSubShow" class="active1"><router-link :to="it.path" tag="a">{{it.name}}</router-link></li></ul></div></transition></div></div> </template><script>import axios from 'axios';export default {name: 'navigation-1',data() {return {token: '',navList: [{title: '用戶管理',isSubShow: false,className: 'icon-guanliyuan1',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '工號管理',path: '/home/navigation-one/user'}, // {// name: '角色管理',// path: '/home/navigation-one/role'// }, // {// name: '權(quán)限管理',// path: '/home/navigation-one/user'// }, ]},{title: '資源管理',isSubShow: false,className: 'icon-ziyuan',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '我的收藏',path: '/home/navigation-one/user'},{name: '我的項目',path: '/home/navigation-one/role'}]},{title: '綜合管理',isSubShow: false,className: 'icon-zonghe',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '劃配管理',path: '/home/navigation-one/user'},{name: '數(shù)據(jù)信息',path: '/home/navigation-one/role'}]},{title: '系統(tǒng)消息',isSubShow: false,className: 'icon-xiaoxi',close: 'icon-close',up: 'icon-zhedie',secMenu: [{name: '實時動態(tài)',path: '/home/navigation-one/user'},{name: '過去動態(tài)',path: '/home/navigation-one/role'}]}],currentSort: 0,pagetype: "index",fullWidth: true,dismenu: true}},mounted() {window.onresize = () => { //監(jiān)聽屏幕變化this.page_width();};this.page_width();},methods: {active(index) {this.currentSort = index;},changeTitleColor(index) {this.currentSort = index;},removeTitleColor(index) {this.currentSort = null;},handleToTitle(ind, item) {this.navList[ind].isSubShow = !this.navList[ind].isSubShow;if (this.navList[ind].isSubShow == true) {this.navList[ind].close = 'icon-zhedie';} else {this.navList[ind].close = 'icon-close';}},make_menu() { //點擊導(dǎo)航圖標(biāo)this.dismenu = !this.dismenu;},page_width() { //獲取屏幕寬度var screenWidth = window.screen.width;if (screenWidth <= 1024) {this.fullWidth = false;} else {this.fullWidth = true;}}}} </script><style scoped>#main {background: #F0F6FF;font-size: 0.16rem;}#main .content {display: flex;flex-direction: row;}.content .admin_nav {min-height: 9.37rem;max-height: 1.3rem;padding: 0 !important;background: #364150;position: relative;}.content .admin_nav .admin_nav_site{height: 100vh;}.content .admin_nav .title {height: 1.39rem;line-height: 1.39rem;background: rgba(63, 73, 86, 1);color: #FFFFFF;text-align: center;font-size: 0.18rem;display: flex;justify-content: center;}.content .admin_nav .title div {padding: 0 0.03rem;}.content .admin_nav .title div:first-child i {font-size: 0.18rem;}.content .admin_nav ul .active {background: rgba(68, 81, 99, 1);}.content .admin_nav ul .active1 a.router-link-active {color: #fff;}.content .admin_nav ul li {height: 0.6rem;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 0.18rem;}.content .admin_nav ul li a {color: #cecdc5;cursor: pointer;}.content .admin_nav ul li:first-child {font-size: 0.2rem;height: 0.64rem;display: flex;flex-direction: row;align-items: center;color: #BEC5C0;cursor: pointer;}.content .admin_nav ul li:first-child div {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;color: #BEC5C0;}.content .admin_nav ul li:first-child .left_icon {width: 22%;}.content .admin_nav ul li:first-child .left_icon i {color: #1296DB;}.content .admin_nav ul li:first-child .middle {width: 56%;display: flex;justify-content: flex-start;}.content .admin_nav ul li:first-child .right_icon {width: 22%;}.admin_nav .admin .middle:hover {color: #fff;}.admin_nav .admin .right_icon i:hover {color: #fff;}.admin_nav .admin .middle.router-link-active {color: #fff;}.content .admin_nav_position {position: absolute;z-index: 3000;}.content .admin_content {padding: 0 !important;}.content .admin_content .admin_header {width: 100%;height: 0.6rem;background: #364150;display: flex;flex-direction: row;align-items: center;justify-content: space-between;}.content .admin_content .admin_header .H5_item {width: 0.4rem;height: 0.4rem;border-radius: 0.2rem;display: flex;justify-content: center;align-items: center;margin-left: 0.2rem;}.content .admin_content .admin_header .H5_item i {font-size: 0.22rem;color: #fff;}.content .admin_content .admin_header .user {width: 100%;display: flex;align-items: center;justify-content: flex-end;}.content .admin_content .admin_header .user .userHead {height: 0.6rem;display: flex;flex-direction: row;align-items: center;color: #fff;font-size: 0.18rem;}.content .admin_content .admin_header .user .userHead span {padding: 0 0.05rem;}.content .admin_content .admin_header .user .userHead span:nth-child(1) {position: relative;}.content .admin_content .admin_header .user .userHead span img {width: 0.4rem;height: 0.4rem;border-radius: 50%;}.content .admin_content .admin_header .user .userHead span input {width: 0.4rem;height: 0.4rem;position: absolute;overflow: hidden;opacity: 0;cursor: pointer;}.content .admin_content .admin_header .user .logOut {color: #fff;margin-left: 0.12rem;margin-right: 0.5rem;}.content .admin_content .admin_header .user .logOut i {color: #1296DB;font-size: 0.24rem;cursor: pointer;}.toggle-cart-enter-active {transition: all 0.4s linear;}.toggle-cart-leave-active {transition: all 0.4s linear;}.toggle-cart-enter {transform: translateX(-200%);}.toggle-cart-leave-active {transform: translateX(-200%);} </style>

注:

1、css樣式中的rem換算成px為對應(yīng)的rem值*100,如:font-size:0.24rem;=>??font-size:24px;

2、文章中涉及到的iconfont類名是因為引用了阿里圖標(biāo),如遇到不知道如何引用的可以翻閱博文→?https://blog.csdn.net/weixin_44803753/article/details/113423633

3、關(guān)于router-link對應(yīng)的跳轉(zhuǎn),如有小伙伴不太清楚如何使用vue-router配置路由的可以翻閱博文→https://blog.csdn.net/weixin_44803753/article/details/113436625

Ending(〃'▽'〃)!

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的vue实现侧边折叠菜单栏手风琴效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色网址在线看 | 天天摸夜夜操 | www.av.cn | 手机看片在线观看 | 天天噜| 久久资源365 | 人妖干美女 | aaaaaabbbbbb毛片 | 国产乱码精品一区二三赶尸艳谈 | www.久久 | 极品新婚夜少妇真紧 | 亚洲三级a| 精品久久中文字幕 | 日韩高清一区二区 | 亚洲欧美一区二区三区在线观看 | 亚洲中文在线一区 | 欧美视频一区二区 | 国产外围在线 | 日韩精品v| 97久久国产精品 | 日韩三级在线 | 成人91免费视频 | 女主播在线观看 | 国产精品乱码一区二三区小蝌蚪 | 国产无码精品在线观看 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 林由奈在线观看 | 欧美精品高清 | 日韩网站免费观看 | 午夜精品免费视频 | 92久久精品一区二区 | aaa久久 | 久久精品国产亚洲av麻豆蜜芽 | 免费级毛片 | 亚洲精品乱码久久久久久不卡 | 黄色一级大片在线免费看国产一 | 精品国产av 无码一区二区三区 | 国产一区二区三区中文字幕 | 国产精品久久久久久妇女6080 | 恶虐女帝安卓汉化版最新版本 | 久久无码视频一区 | 日韩有码中文字幕在线观看 | 高清国产一区二区三区 | 亚欧美精品 | 91国内精品久久久 | 无码国产精品一区二区色情男同 | 欧美人与性动交ccoo | 午夜免费福利网站 | 国产免费专区 | 国产亚洲欧美视频 | 日韩精品一区二区三 | 黄色网av | 日韩色小说 | 噼里啪啦国语版在线观看 | 国产美女91呻吟求 | 在线免费观看福利 | 国产二区视频 | 中文字幕av网 | 日韩福利网 | 国产精品扒开腿做爽爽爽a片唱戏 | 国产精品不卡在线观看 | 亚洲美女性生活 | 国产精品又黄又爽又色无遮挡 | 国产精品一区二区人妻喷水 | 在线观看av中文字幕 | 久久成人午夜 | 最新天堂在线视频 | 人妻互换一区二区三区四区五区 | 农村脱精光一级 | 午夜神马福利 | 天天色影院| 国产一区二区三区小说 | 人人妻人人澡人人爽人人欧美一区 | 大奶子av| jzz在线观看 | 永久国产 | 操女人逼逼视频 | 国产成人免费看一级大黄 | 久久久久久久久免费视频 | 瑟瑟视频网站 | 欧美一级淫片aaaaaa | 欧美一级大片在线观看 | 精品久久国产视频 | 奶妈的诱惑| 国产精品成人无码专区 | 国产欧美一区二区三区视频 | 女性生殖扒开酷刑vk | aaa黄色| 日本黄色xxxxx | 妺妺窝人体色www在线小说 | 超级变态重口av番号 | 久久久久久18| 开心激情综合 | 精品免费久久 | 国产精品夜夜夜爽张柏芝 | 中文字幕第66页 | 国产一级二级三级视频 | 色伊人久久| 免费小视频 |