Files
mes-ui-d2/src/layout/header-aside/components/menu-header/index.vue
liyang cc524035ec 修改样式
Former-commit-id: d30826af20bd7e79a8f0276cde532c2c2e2c115b [formerly 216f197dd5724f8b53dd17305817cdba13fefdef] [formerly d30826af20bd7e79a8f0276cde532c2c2e2c115b [formerly 216f197dd5724f8b53dd17305817cdba13fefdef] [formerly d30826af20bd7e79a8f0276cde532c2c2e2c115b [formerly 216f197dd5724f8b53dd17305817cdba13fefdef] [formerly 216f197dd5724f8b53dd17305817cdba13fefdef [formerly e021295fabe3798737bc267bab2875af1788a8d3 [formerly 5dc00107272218a8e490ed792847b1b44587e551]]]]]
Former-commit-id: 40493cf718ee3efd124ed096c446631d5f9da5d4
Former-commit-id: 10d1e5dd096227d644a1231196d42d213f1b801f
Former-commit-id: 43fdd834622256ed04f9ae2f8382f4488f8c1222 [formerly d9f9f7cf59ae621438afc7ef82121a72066a4e1e]
Former-commit-id: cfac13dc4110999c71d83be1c6b9a7dfa4595719
Former-commit-id: 8cf63db9d880a277446d3c1795ec51a4af223024
Former-commit-id: 9af99bd48bbfe6dd784db17388505ff1888e1c52
Former-commit-id: 00b426bb14a99716d3f06ebbde1c7c4c6b42b834
Former-commit-id: 345b95e833a29e552ad68a41accd4aef8e39c600
2018-09-19 15:16:56 +08:00

119 lines
4.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="d2-theme-header-menu" ref="page" :class="{'is-scrollable': isScroll}" flex="cross:center">
<div class="d2-theme-header-menu__content" ref="content" flex-box="1" flex>
<div class="d2-theme-header-menu__scroll" ref="scroll" flex-box="0" :style="'transform: translateX(' + currentTranslateX + 'px);'">
<el-menu mode="horizontal" :default-active="active" @select="handleMenuSelect">
<template v-for="(menu, menuIndex) in header">
<d2-layout-header-aside-menu-item v-if="menu.children === undefined" :menu="menu" :key="menuIndex"/>
<d2-layout-header-aside-menu-sub v-else :menu="menu" :key="menuIndex"/>
</template>
</el-menu>
</div>
</div>
<div v-if="isScroll" class="d2-theme-header-menu__prev" flex-box="0" @click="scroll('left')" flex="main:center cross:center">
<i class="el-icon-arrow-left"></i>
</div>
<div v-if="isScroll" class="d2-theme-header-menu__next" flex-box="0" @click="scroll('right')" flex="cross:center">
<i class="el-icon-arrow-right"></i>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
import menuMixin from '../mixin/menu'
import d2LayoutMainMenuItem from '../components/menu-item/index.vue'
import d2LayoutMainMenuSub from '../components/menu-sub/index.vue'
export default {
name: 'd2-layout-header-aside-menu-header',
mixins: [
menuMixin
],
components: {
'd2-layout-header-aside-menu-item': d2LayoutMainMenuItem,
'd2-layout-header-aside-menu-sub': d2LayoutMainMenuSub
},
computed: {
...mapState('d2admin/menu', [
'header'
])
},
data () {
return {
active: '',
isScroll: false,
scrollWidth: 0,
contentWidth: 0,
currentTranslateX: 0
}
},
watch: {
'$route.matched': {
handler (val) {
this.active = val[val.length - 1].path
},
immediate: true
}
},
methods: {
scroll (direction) {
if (direction === 'left') {
// 向右滚动
this.currentTranslateX = 0
} else {
// 向左滚动
if (this.contentWidth * 2 - this.currentTranslateX <= this.scrollWidth) {
this.currentTranslateX -= this.contentWidth
} else {
this.currentTranslateX = this.contentWidth - this.scrollWidth
}
}
}
},
mounted () {
const checkScroll = () => {
let contentWidth = this.$refs.content.clientWidth
let scrollWidth = this.$refs.scroll.clientWidth
if (this.isScroll) {
// 页面依旧允许滚动的情况需要更新width
if (this.contentWidth - this.scrollWidth === this.currentTranslateX) {
// currentTranslateX 也需要相应变化【在右端到头的情况时】
this.currentTranslateX = contentWidth - scrollWidth
// 快速的滑动依旧存在判断和计算时对应的contentWidth变成正数所以需要限制一下
if (this.currentTranslateX > 0) {
this.currentTranslateX = 0
}
}
// 更新元素数据
this.contentWidth = contentWidth
this.scrollWidth = scrollWidth
// 判断何时滚动消失: 当page > content + btns(40)
if (contentWidth > scrollWidth + 40) {
this.isScroll = false
}
}
// 判断何时滚动出现: 当page < content
if (!this.isScroll && contentWidth < scrollWidth) {
this.isScroll = true
// 注意当isScroll变为true对应的元素盒子大小会发生变化
this.$nextTick(() => {
contentWidth = this.$refs.content.clientWidth
scrollWidth = this.$refs.scroll.clientWidth
this.contentWidth = contentWidth
this.scrollWidth = scrollWidth
this.currentTranslateX = 0
})
}
}
// 初始化判断
checkScroll()
// 默认判断父元素和子元素的大小,以确定初始情况是否显示滚动
// 全局窗口变化监听判断父元素和子元素的大小从而控制isScroll的开关
window.onresize = () => {
checkScroll()
}
}
}
</script>