Skip to content

Commit 2f06701

Browse files
committed
fix: scroll hide header #155
1 parent ccdcc5a commit 2f06701

File tree

1 file changed

+104
-96
lines changed

1 file changed

+104
-96
lines changed
Lines changed: 104 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,104 @@
1-
<template>
2-
<a-layout-header
3-
v-if="!headerBarFixed"
4-
:class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]"
5-
:style="{ padding: '0' }"
6-
>
7-
<div v-if="mode === 'sidemenu'" class="header">
8-
<a-icon v-if="device==='mobile'" class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle"/>
9-
<a-icon v-else class="trigger" :type="collapsed ? 'menu-unfold' : 'menu-fold'" @click="toggle"/>
10-
<user-menu></user-menu>
11-
</div>
12-
<div v-else :class="['top-nav-header-index', theme]">
13-
<div class="header-index-wide">
14-
<div class="header-index-left">
15-
<logo class="top-nav-header" :show-title="device !== 'mobile'"/>
16-
<s-menu v-if="device !== 'mobile'" mode="horizontal" :menu="menus" :theme="theme" />
17-
<a-icon v-else class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle" />
18-
</div>
19-
<user-menu class="header-index-right"></user-menu>
20-
</div>
21-
</div>
22-
</a-layout-header>
23-
</template>
24-
25-
<script>
26-
import UserMenu from '../tools/UserMenu'
27-
import SMenu from '../Menu/'
28-
import Logo from '../tools/Logo'
29-
30-
import { mixin } from '@/utils/mixin'
31-
import { handleScrollHeader } from '@/utils/util'
32-
33-
export default {
34-
name: 'GlobalHeader',
35-
components: {
36-
UserMenu,
37-
SMenu,
38-
Logo
39-
},
40-
mixins: [mixin],
41-
props: {
42-
mode: {
43-
type: String,
44-
// sidemenu, topmenu
45-
default: 'sidemenu'
46-
},
47-
menus: {
48-
type: Array,
49-
required: true
50-
},
51-
theme: {
52-
type: String,
53-
required: false,
54-
default: 'dark'
55-
},
56-
collapsed: {
57-
type: Boolean,
58-
required: false,
59-
default: false
60-
},
61-
device: {
62-
type: String,
63-
required: false,
64-
default: 'desktop'
65-
}
66-
},
67-
data () {
68-
return {
69-
headerBarFixed: false
70-
}
71-
},
72-
mounted () {
73-
const _this = this
74-
handleScrollHeader(direction => {
75-
_this.handleScroll(direction)
76-
})
77-
},
78-
methods: {
79-
handleScroll (direction) {
80-
if (this.autoHideHeader) {
81-
const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
82-
if (direction === 'up') {
83-
this.headerBarFixed = false
84-
} else {
85-
scrollTop > 100 && (this.headerBarFixed = true)
86-
}
87-
} else {
88-
this.headerBarFixed = false
89-
}
90-
},
91-
toggle () {
92-
this.$emit('toggle')
93-
}
94-
}
95-
}
96-
</script>
1+
<template>
2+
<a-layout-header
3+
v-if="visible"
4+
:class="[fixedHeader && 'ant-header-fixedHeader', sidebarOpened ? 'ant-header-side-opened' : 'ant-header-side-closed', ]"
5+
:style="{ padding: '0' }"
6+
>
7+
<div v-if="mode === 'sidemenu'" class="header">
8+
<a-icon v-if="device==='mobile'" class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle"/>
9+
<a-icon v-else class="trigger" :type="collapsed ? 'menu-unfold' : 'menu-fold'" @click="toggle"/>
10+
<user-menu></user-menu>
11+
</div>
12+
<div v-else :class="['top-nav-header-index', theme]">
13+
<div class="header-index-wide">
14+
<div class="header-index-left">
15+
<logo class="top-nav-header" :show-title="device !== 'mobile'"/>
16+
<s-menu v-if="device !== 'mobile'" mode="horizontal" :menu="menus" :theme="theme" />
17+
<a-icon v-else class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle" />
18+
</div>
19+
<user-menu class="header-index-right"></user-menu>
20+
</div>
21+
</div>
22+
</a-layout-header>
23+
</template>
24+
25+
<script>
26+
import UserMenu from '../tools/UserMenu'
27+
import SMenu from '../Menu/'
28+
import Logo from '../tools/Logo'
29+
import { mixin } from '@/utils/mixin'
30+
31+
export default {
32+
name: 'GlobalHeader',
33+
components: {
34+
UserMenu,
35+
SMenu,
36+
Logo
37+
},
38+
mixins: [mixin],
39+
props: {
40+
mode: {
41+
type: String,
42+
// sidemenu, topmenu
43+
default: 'sidemenu'
44+
},
45+
menus: {
46+
type: Array,
47+
required: true
48+
},
49+
theme: {
50+
type: String,
51+
required: false,
52+
default: 'dark'
53+
},
54+
collapsed: {
55+
type: Boolean,
56+
required: false,
57+
default: false
58+
},
59+
device: {
60+
type: String,
61+
required: false,
62+
default: 'desktop'
63+
}
64+
},
65+
data () {
66+
return {
67+
visible: true,
68+
oldScrollTop: 0
69+
}
70+
},
71+
mounted () {
72+
document.body.addEventListener('scroll', this.handleScroll, { passive: true })
73+
},
74+
methods: {
75+
handleScroll () {
76+
if (!this.autoHideHeader) {
77+
return
78+
}
79+
80+
const scrollTop = document.body.scrollTop + document.documentElement.scrollTop
81+
if (!this.ticking) {
82+
this.ticking = true
83+
requestAnimationFrame(() => {
84+
if (this.oldScrollTop > scrollTop) {
85+
this.visible = true
86+
} else if (scrollTop > 300 && this.visible) {
87+
this.visible = false
88+
} else if (scrollTop < 300 && !this.visible) {
89+
this.visible = true
90+
}
91+
this.oldScrollTop = scrollTop
92+
this.ticking = false
93+
})
94+
}
95+
},
96+
toggle () {
97+
this.$emit('toggle')
98+
}
99+
},
100+
beforeDestroy () {
101+
document.body.removeEventListener('scrool', this.handScroll)
102+
}
103+
}
104+
</script>

0 commit comments

Comments
 (0)