吸顶组件:页面滚动,顶部的标题要一直停留在当前页面
页面滚动 这个标题吸顶
组件实现思想是设置当前组件的position = 'fixed'
组件:Sticky.vue
<template>
<div ref="stickyArea" :style="{ height: height + 'px', zIndex: zIndex }">
<div
:class="className"
:style="{ top: isSticky ? stickyTop + 'px' : '', zIndex: zIndex, position: position, width: width, height: height + 'px' }"
>
<slot>
<div>sticky</div>
</slot>
</div>
</div>
</template>
<script>
export default {
name: 'Sticky',
props: {
stickyTop: {
type: Number,
default: 52
},
zIndex: {
type: Number,
default: 999
},
className: {
type: String,
default: ''
}
},
data() {
return {
active: false,
position: '',
width: undefined,
height: undefined,
isSticky: false
}
},
mounted() {
setTimeout(() => {
this.height = this.$el.getBoundingClientRect().height
}, 300)
window.addEventListener('scroll', this.handleScroll)
window.addEventListener('resize', this.handleResize)
},
activated() {
this.handleScroll()
},
destroyed() {
window.removeEventListener('scroll', this.handleScroll)
window.removeEventListener('resize', this.handleResize)
},
methods: {
sticky() {
if (this.active) {
return
}
this.position = 'fixed'
this.active = true
this.width = this.width + 'px'
this.isSticky = true
},
handleReset() {
if (!this.active) {
return
}
this.reset()
},
reset() {
this.position = ''
this.width = 'auto'
this.active = false
this.isSticky = false
},
handleScroll() {
const width = this.$el.getBoundingClientRect().width
this.width = width || 'auto'
const offsetTop = this.$el.getBoundingClientRect().top
if (offsetTop < this.stickyTop) {
this.sticky()
return
}
this.handleReset()
},
handleResize() {
if (this.isSticky) {
this.width = this.$el.getBoundingClientRect().width + 'px'
}
}
}
}
</script>
<style lang="scss" scoped>
.stickyArea {
overflow: hidden;
}
</style>
使用方式:
import Sticky from '@/components/Sticky';
components: {
Sticky
},
可设置吸附于当前界面的高度和层级