vue项目中滚动时导航吸顶效果(固定定位)
什么是吸顶?就是头部在顶部被页面吸住了,大白话就是固定定位效果图吸顶组件 作为参考案例<template><div class="app-header-sticky"><div class="container"><RouterLink class="logo" to="/" /><AppHeaderNav /><div class
·
什么是吸顶?就是头部在顶部被页面吸住了,大白话就是固定定位
效果图
吸顶组件 作为参考案例
<template>
<div class="app-header-sticky">
<div class="container">
<RouterLink class="logo" to="/" />
<AppHeaderNav />
<div class="right">
<RouterLink to="/" >品牌</RouterLink>
<RouterLink to="/" >专题</RouterLink>
</div>
</div>
</div>
</template>
<script>
import AppHeaderNav from './header-nav'
export default {
name: 'AppHeaderSticky',
components: { AppHeaderNav }
}
</script>
<style scoped lang='less'>
.app-header-sticky {
width: 100%;
height: 80px;
position: fixed;
left: 0;
top: 0;
z-index: 999;
background-color: #fff;
border-bottom: 1px solid #e4e4e4;
// 默认隐藏
transform: translateY(-100%);
opacity: 0;
// css显示
&.show {
transition: all 0.3s linear;
transform: none;
opacity: 1;
}
.container {
display: flex;
align-items: center;
}
.logo {
width: 200px;
height: 80px;
background: url("~@/assets/images/logo.png") no-repeat right 2px;
background-size: 160px auto;
}
.right {
width: 220px;
display: flex;
text-align: center;
padding-left: 40px;
border-left: 2px solid @xtxColor;
a {
width: 38px;
margin-right: 40px;
font-size: 16px;
line-height: 1;
&:hover {
color: @xtxColor;
}
}
}
}
</style>
在css样式中有一个show类名,只要加上show类名 透明度为1 并且translate从-100px变成none
需求:滚动条滚到78px的时候让顶部导航显示(添加show类名)
实现方式一 :手动去测滚动出的距离
思路给window绑定 滚动事件 获取document滚动的距离 >78显示
<template>
<div class="app-header-sticky" :class="{show:y>=78}" >
<div class="container">
<RouterLink class="logo" to="/" />
<AppHeaderNav />
<div class="right">
<RouterLink to="/" >品牌</RouterLink>
<RouterLink to="/" >专题</RouterLink>
</div>
</div>
</div>
</template>
<script>
import { ref } from '@vue/reactivity'
import AppHeaderNav from './header-nav'
export default {
name: 'AppHeaderSticky',
components: { AppHeaderNav },
setup () {
const y = ref(0)
const scrollTop = () => {
y.value = document.documentElement.scrollTop
console.log(y.value)
}
onMounted(() => {
window.addEventListener('scroll', scrollTop)
})
return { y }
}
}
</script>
不清除事件绑定的后果
举个例子
<button @click="isShow=false">摧毁</button>
<HeaderSticky v-if="isShow"></HeaderSticky>
点击摧毁后 滚动事件依然存在,因为是给window绑定的事件,不会销毁,造成内存泄漏
所以必须在onUnmounted 清除滚动事件
setup () {
const y = ref(0)
const scrollTop = () => {
y.value = document.documentElement.scrollTop
}
onMounted(() => { window.addEventListener('scroll', scrollTop) })
onUnmounted(() => { window.removeEventListener('scroll', scrollTop) })
return { y }
}
实现方式二:利用VueUse插件
不过官网是英文的 并没有转中字 可以利用谷歌的右键一键翻译进行查看中字
接下来跟着官网做就好了
第一步要先下载插件包
npm i @vueuse/core
第二步根据官网cv 导入 使用 完成....
import { useWindowScroll } from '@vueuse/core'
export default {
name: 'AppHeaderSticky',
components: { AppHeaderNav },
setup () {
const { y } = useWindowScroll()
return { y }
}
}
@vueuse/core: 是配合vue3组合式API一起使用的一个第三方逻辑库。
useWindowScroll() 是@vueuse/core提供的api可返回当前页面滚动时候滚动条的 x横向,y纵向
vue3.0组合API提供了更多逻辑代码封装的能力。@vueuse/core 基于组合API封装好用的工具函数。
更多推荐
已为社区贡献16条内容
所有评论(0)