增加标签导航左右按钮和关闭下拉

This commit is contained in:
zhigang.li 2018-05-16 10:09:25 +08:00
parent 6cbcc02cb0
commit f6fa965f41
7 changed files with 170 additions and 49 deletions

53
package-lock.json generated
View File

@ -164,8 +164,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
"dev": true
},
"accepts": {
"version": "1.3.3",
@ -432,7 +431,6 @@
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"dev": true,
"optional": true,
"requires": {
"delegates": "1.0.0",
"readable-stream": "2.3.6"
@ -3240,8 +3238,7 @@
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
"integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
"dev": true,
"optional": true
"dev": true
},
"deep-is": {
"version": "0.1.3",
@ -3359,8 +3356,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
"dev": true
},
"depd": {
"version": "1.1.2",
@ -3397,8 +3393,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
"dev": true
},
"detect-node": {
"version": "2.0.3",
@ -5209,7 +5204,6 @@
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
"requires": {
"minipass": "2.2.4"
}
@ -5237,7 +5231,6 @@
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.0.tgz",
"integrity": "sha512-ROrBIbmw4ulxmQTwYAAGyN/0xgIOAFd6gX/K3F1aGLP/K5KxkubrlGISMV5EEWEB7qtiEdE0HpaqvMMHR+Ib6w==",
"dev": true,
"optional": true,
"requires": {
"nan": "2.10.0",
"node-pre-gyp": "0.9.1"
@ -5992,7 +5985,6 @@
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
"requires": {
"aproba": "1.2.0",
"console-control-strings": "1.1.0",
@ -6009,7 +6001,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "1.0.1"
}
@ -6019,7 +6010,6 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"optional": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",
@ -6371,8 +6361,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
"dev": true
},
"has-value": {
"version": "1.0.0",
@ -6880,7 +6869,6 @@
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
"requires": {
"minimatch": "3.0.4"
}
@ -6949,8 +6937,7 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
"dev": true
},
"inject-loader": {
"version": "3.0.1",
@ -8530,7 +8517,6 @@
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
"integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
"dev": true,
"optional": true,
"requires": {
"minipass": "2.2.4"
}
@ -8792,8 +8778,7 @@
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
"dev": true,
"optional": true
"dev": true
},
"nanomatch": {
"version": "1.2.9",
@ -8826,7 +8811,6 @@
"resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz",
"integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==",
"dev": true,
"optional": true,
"requires": {
"debug": "2.6.9",
"iconv-lite": "0.4.21",
@ -8838,7 +8822,6 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"optional": true,
"requires": {
"ms": "2.0.0"
}
@ -8988,7 +8971,6 @@
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz",
"integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=",
"dev": true,
"optional": true,
"requires": {
"detect-libc": "1.0.3",
"mkdirp": "0.5.1",
@ -9007,7 +8989,6 @@
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
"requires": {
"abbrev": "1.1.1",
"osenv": "0.1.5"
@ -9056,15 +9037,13 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz",
"integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==",
"dev": true,
"optional": true
"dev": true
},
"npm-packlist": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz",
"integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==",
"dev": true,
"optional": true,
"requires": {
"ignore-walk": "3.0.1",
"npm-bundled": "1.0.3"
@ -9084,7 +9063,6 @@
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
"requires": {
"are-we-there-yet": "1.1.4",
"console-control-strings": "1.1.0",
@ -9371,7 +9349,6 @@
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
"requires": {
"os-homedir": "1.0.2",
"os-tmpdir": "1.0.2"
@ -12090,7 +12067,6 @@
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz",
"integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=",
"dev": true,
"optional": true,
"requires": {
"deep-extend": "0.4.2",
"ini": "1.3.5",
@ -12102,8 +12078,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
"dev": true
}
}
},
@ -13633,7 +13608,6 @@
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz",
"integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==",
"dev": true,
"optional": true,
"requires": {
"chownr": "1.0.1",
"fs-minipass": "1.2.5",
@ -13648,8 +13622,7 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
"integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
"dev": true,
"optional": true
"dev": true
}
}
},
@ -13911,8 +13884,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
"integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
"dev": true,
"optional": true
"dev": true
},
"uglifyjs-webpack-plugin": {
"version": "1.2.5",
@ -14982,7 +14954,6 @@
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
"integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true,
"optional": true,
"requires": {
"string-width": "1.0.2"
},
@ -14992,7 +14963,6 @@
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "1.0.1"
}
@ -15002,7 +14972,6 @@
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"optional": true,
"requires": {
"code-point-at": "1.1.0",
"is-fullwidth-code-point": "1.0.0",

View File

@ -1,7 +1,7 @@
<template>
<div class="side-menu-wrapper">
<slot></slot>
<Menu v-show="!collapsed" :theme="theme" width="auto" @on-select="handleSelect">
<Menu v-show="!collapsed" :accordion="accordion" :theme="theme" width="auto" @on-select="handleSelect">
<template v-for="item in menuList">
<side-menu-item v-if="showChildren(item)" :key="`menu-${item.name}`" :parent-item="item"></side-menu-item>
<menu-item v-else :name="`${item.name}`" :key="`menu-${item.name}`"><Icon :type="item.icon"/><span>{{ showTitle(item) }}</span></menu-item>
@ -48,7 +48,8 @@ export default {
iconSize: {
type: Number,
default: 16
}
},
accordion: Boolean
},
methods: {
handleSelect (name) {

View File

@ -0,0 +1,2 @@
import tagsNav from './tags-nav.vue'
export default tagsNav

View File

@ -0,0 +1,50 @@
.size{
width: 100%;
height: 100%;
}
.tags-nav{
position: relative;
.size;
.scroll-outer-con{
position: relative;
.size;
border-top: 1px solid #F0F0F0;
border-bottom: 1px solid #F0F0F0;
}
.close-con{
position: absolute;
right: 0;
top: 0;
height: 100%;
width: 100px;
background: #fff;
text-align: center;
.ivu-dropdown, .ivu-dropdown .ivu-dropdown-rel{
height: 100%;
button{
transform: translateY(-14px);
}
}
}
.btn-con{
position: absolute;
top: 0px;
height: 100%;
background: #fff;
padding-top: 3px;
button{
vertical-align: top;
padding: 6px 10px;
text-align: center;
}
&.left-btn{
left: 0px;
box-shadow: 2px 0 3px 2px rgba(100,100,100,.1);
}
&.right-btn{
right: 100px;
border-right: 1px solid #F0F0F0;
box-shadow: -2px 0 3px 2px rgba(100,100,100,.1);
}
}
}

View File

@ -0,0 +1,84 @@
<template>
<div class="tags-nav">
<div ref="scrollCon" @DOMMouseScroll="handlescroll" @mousewheel="handlescroll" class="scroll-outer-con">
<div class="close-con">
<Dropdown transfer @on-click="handleTagsOption">
<Button size="small" type="primary">
标签选项
<Icon type="arrow-down-b"></Icon>
</Button>
<DropdownMenu slot="list">
<DropdownItem name="clearAll">关闭所有</DropdownItem>
<DropdownItem name="clearOthers">关闭其他</DropdownItem>
</DropdownMenu>
</Dropdown>
</div>
<div class="btn-con left-btn">
<Button icon="chevron-left" type="text"></Button>
</div>
<div class="btn-con right-btn">
<Button icon="chevron-right" type="text"></Button>
</div>
<!-- <div ref="scrollBody" class="tags-inner-scroll-body" :style="{left: tagBodyLeft + 'px'}">
<transition-group name="taglist-moving-animation">
<Tag
type="dot"
v-for="(item) in pageTagsList"
ref="tagsPageOpened"
:key="item.name"
:name="item.name"
@on-close="closePage"
@click.native="linkTo(item)"
:closable="item.name==='home_index'?false:true"
:color="item.children?(item.children[0].name===currentPageName?'blue':'default'):(item.name===currentPageName?'blue':'default')"
>{{ itemTitle(item) }}</Tag>
</transition-group>
</div> -->
</div>
</div>
</template>
<script>
export default {
name: 'tagsNav',
props: {
list: {
type: Array,
default () {
return []
}
}
},
methods: {
handlescroll (e) {
var type = e.type
let delta = 0
if (type === 'DOMMouseScroll' || type === 'mousewheel') {
delta = (e.wheelDelta) ? e.wheelDelta : -(e.detail || 0) * 40
}
let left = 0
if (delta > 0) {
left = Math.min(0, this.tagBodyLeft + delta)
} else {
if (this.$refs.scrollCon.offsetWidth - 100 < this.$refs.scrollBody.offsetWidth) {
if (this.tagBodyLeft < -(this.$refs.scrollBody.offsetWidth - this.$refs.scrollCon.offsetWidth + 100)) {
left = this.tagBodyLeft
} else {
left = Math.max(this.tagBodyLeft + delta, this.$refs.scrollCon.offsetWidth - this.$refs.scrollBody.offsetWidth - 100)
}
} else {
this.tagBodyLeft = 0
}
}
this.tagBodyLeft = left
},
handleTagsOption () {
//
}
}
}
</script>
<style lang="less">
@import './tags-nav.less';
</style>

View File

@ -12,6 +12,12 @@
.header-con{
background: #fff;
padding: 0 20px;
box-shadow: 0 2px 3px 2px rgba(0,0,0,.1);
}
.tag-nav-wrapper{
padding: 0;
box-shadow: 0 2px 3px 2px rgba(100,100,100,.1) inset, 0 -2px 3px 2px rgba(100,100,100,.1) inset;
height:40px;
background:#F0F0F0;
overflow: hidden;
}
}

View File

@ -1,10 +1,10 @@
<template>
<Layout style="height: 100%" class="main">
<Sider hide-trigger collapsible :width="210" :collapsed-width="64" v-model="collapsed">
<side-menu :collapsed="collapsed" @on-select="turnToPage" :use-i18n="useI18n" :menu-list="menuList">
<side-menu accordion :collapsed="collapsed" @on-select="turnToPage" :use-i18n="useI18n" :menu-list="menuList">
<!-- 需要放在菜单上面的内容如Logo写在side-menu标签内部如下 -->
<div class="logo-con">
<img v-show="!collapsed" :src="maxLogo" key="max-logo" />
<img v-show="!collapsed" :src="maxLogo" key="max-logo" />
<img v-show="collapsed" :src="minLogo" key="min-logo" />
</div>
</side-menu>
@ -13,13 +13,21 @@
<Header class="header-con">
<header-bar :collapsed="collapsed" @on-coll-change="handleCollapsedChange"></header-bar>
</Header>
<Content></Content>
<Content>
<Layout>
<Header class="tag-nav-wrapper">
<tags-nav></tags-nav>
</Header>
<Content></Content>
</Layout>
</Content>
</Layout>
</Layout>
</template>
<script>
import sideMenu from '_c/main/side-menu'
import headerBar from '_c/main/header-bar'
import tagsNav from '_c/tags-nav'
import { mapState, mapGetters, mapMutations } from 'vuex'
import minLogo from '@/assets/images/logo-min.jpg'
import maxLogo from '@/assets/images/logo.jpg'
@ -27,7 +35,8 @@ export default {
name: 'Main',
components: {
sideMenu,
headerBar
headerBar,
tagsNav
},
data () {
return {