iview 菜单页面我们可以做一个浮动层,通过拖放按钮来实现菜单隐藏或者展示。
在进入页面的时候菜单式隐藏的:
双击按钮菜单展示:
下面我们先来看菜单的处理:
菜单使用element ui主键做横向菜单,菜单是三级菜单,服务端通过接口生成,iview 获取路由:
<template> <div class="menu-list"> <div v-show="showGroup"> <el-menu :default-active="this.$route.path" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#000000" text-color="#F5FDA6" active-text-color="#409EFF" :collapse-transition="true" :router="true"> <el-menu-item index="#"> <el-image :src="logoUrl" fit="none"> </el-image> </el-menu-item> <el-menu-item v-for="firstSub in menu" :index="firstSub.path" :key="firstSub.id" v-if="!firstSub.children"> { {firstSub.name}} </el-menu-item> <el-submenu class="over-hide" :index="firstSub.path" v-for="firstSub in menu" v-if="firstSub.children"> <template slot="title">{ {firstSub.name}}</template> <el-menu-item :index="secondSub.path" v-text="secondSub.name" v-for="secondSub in firstSub.children" :key="secondSub.name" v-if="!secondSub.children"></el-menu-item> <el-submenu class="over-hide" :index="secondSub.path" v-for="secondSub in firstSub.children" v-if="secondSub.children"> <template slot="title">{ {secondSub.name}}</template> <el-menu-item :index="threeSub.path" v-text="threeSub.name" v-for="threeSub in secondSub.children" :key="threeSub.name"> { {threeSub.name}} </el-menu-item> </el-submenu> </el-submenu> </el-menu> </div> <button @click="onClick(showGroup)" @mousedown="down" @touchstart="down" @mousemove="move" @touchmove="move" @mouseup="end" @touchend="end" ref="fu" class="float"> <van-icon name="weapp-nav" class="ivu-icon ivu-icon-md-funnel"/>{ { answer }} </button> </div> </template> <script> import { menulist } from '@/libs/menu' export default { name: 'menu', data () { return { activeName: '', active: 'display: block;', menu: menulist, showGroup: false, answer: '隐藏', flags: false, // 控制使用 position: { x: 0, y: 0 }, nx: '', ny: '', dx: '', dy: '', xPum: '', yPum: '', logoUrl: '/baidulogo.png' } }, methods: { down () { this.flags = true var touch if (event.touches) { touch = event.touches[0] } else { touch = event } this.position.x = touch.clientX this.position.y = touch.clientY this.dx = this.$refs.fu.offsetLeft this.dy = this.$refs.fu.offsetTop }, move () { if (this.flags) { var touch if (event.touches) { touch = event.touches[0] } else { touch = event } this.nx = touch.clientX - this.position.x this.ny = touch.clientY - this.position.y this.xPum = this.dx + this.nx this.yPum = this.dy + this.ny const width = window.innerWidth - this.$refs.fu.offsetWidth// 屏幕宽度减去自身控件宽度 const height = window.innerHeight - this.$refs.fu.offsetHeight// 屏幕高度减去自身控件高度 this.xPum < 0 && (this.xPum = 0) this.yPum < 0 && (this.yPum = 0) this.xPum > width && (this.xPum = width) this.yPum > height && (this.yPum = height) // if (this.xPum >= 0 && this.yPum >= 0 && this.xPum<= width &&this.yPum<= height) { this.$refs.fu.style.left = this.xPum + 'px' this.$refs.fu.style.top = this.yPum + 'px' // } // 阻止页面的滑动默认事件 document.addEventListener( 'touchmove', function () { event.preventDefault() }, false ) } }, // 鼠标释放时候的函数 end () { this.flags = false }, onClick (showGroup) { if (showGroup == true) { this.showGroup = false // this.answer = '隐藏' } else { this.showGroup = true // this.answer = '展示' } }, handleSelect (key, keyPath) { // console.log(key, keyPath) console.log(key) // switch(key){ // case '/dashboard/baidu': // self.location = '/dashboard/baidu' // break; // case '/dashboard/ali': // self.location = '/dashboard/google' // break; // case '/dashboard/hao': // self.location = '/dashboard/table' // break; // default: // self.location = '/dashboard/baidu' // break; // } self.location = key } } } </script> <style> background-color:rgb(19, 20, 21) !important; .el-menu-demo>.el-menu--horizontal>.el-menu{ color: rgb(245, 253, 166); background-color: rgb(19, 20, 21); } .el-menu--horizontal>.el-submenu .el-submenu__title { color: rgb(245, 253, 166); background-color: rgb(19, 20, 21); } .el-menu--horizontal .el-menu .el-submenu>.el-submenu__title { color: rgb(245, 253, 166); background-color: rgb(19, 20, 21); } .el-menu--horizontal { color: rgb(245, 253, 166); background-color: rgb(19, 20, 21); } .el-submenu__title { color: rgb(19, 20, 21); background-color: rgb(19, 20, 21); } .el-collapse-item__header { background-color: rgb(27, 52, 214); text-align:center; color:#e62d94; } .el-collapse-item__content { padding-bottom: 0px; } .el-menu-item-logo { } </style> <style lang="stylus" scoped> .float position absolute//定位 left 25px//初始x轴位置 top 8%//初始Y轴位置 touch-action none text-align center width 48px height 48px border-radius 24px line-height 48px background rgba(110, 192, 206, 0.61) color white z-index 1000000; </style>
安装下面的依赖包:前提是已经安装iview。
npm install babel-plugin-syntax-dynamic-import;
npm install stylus stylus-loader --save-dev;
npm i default-passive-events -S ;
执行完以上安装就可以看到效果了!