📢博客主页:逆旅行天涯-CSDN博客
📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!
🌰 本次需求:
1.右侧固定悬浮按钮,点击后可以跳转到顶部
2.右侧的悬浮按钮可以像滚动条一样显示当前进度
在Vue 3中实现点击后跳转到页面顶部的功能,通常不需要复杂的逻辑,因为你可以直接操作window.scrollTo
方法来实现。这里有几个步骤和示例代码,帮助你实现这个功能。
1. 创建一个按钮用于触发跳转
首先,在你的Vue组件的模板部分,添加一个按钮用于用户点击。你可以为这个按钮绑定一个点击事件处理器。
<template>
<div>
<!-- 其他内容 -->
<button @click="scrollToTop">回到顶部</button>
</div>
</template>
2. 编写点击事件处理器
然后,在你的组件的setup
函数中(或者在<script setup>
标签内,如果你使用的是Vue 3的Composition API的语法糖),编写一个方法来处理点击事件。这个方法将使用window.scrollTo
或window.scroll
(取决于你的具体需求)来滚动到页面顶部。
使用window.scrollTo
<script setup>
function scrollToTop() {
// 平滑滚动到页面顶部
window.scrollTo({
top: 0,
behavior: 'smooth', // 平滑滚动
});
}
</script>
或者,使用window.scroll
(对于简单的滚动)
<script setup>
function scrollToTop() {
// 直接滚动到页面顶部,没有平滑效果
window.scroll(0, 0);
}
</script>
3. 实现悬浮按钮显示进度
<template>
<div class="cats" :style="{ top: catsTop }" ref="cats" @click="catTop"></div>
</template>
<script lang="ts" setup>
import { ref,onMounted,onUnmounted,nextTick } from 'vue';
const cats = ref<HTMLElement | null>(null);
const catsTop = ref('-80px')
let doctH = 0 // 文档高度
let viewH = 0 // 可视区域高度
//点击后跳转至顶部
const catTop = () => {
document.documentElement.scrollTop = document.body.scrollTop = 0
}
//滚动时运行代码,用于计算滚动位置
const calcScroll = () => {
const scroll = document.documentElement.scrollTop || document.body.scrollTop
const hideH = doctH - viewH
let rate = scroll / hideH
if(rate>=1){
rate=1
}
// console.log(rate);
const result = Math.floor(viewH * rate)
catsTop.value = `${result - 128}px`
doctH === scroll + viewH ? cats.value?.classList.add('bottom') : cats.value?.classList.remove('bottom')
}
onMounted(async () => {
await nextTick(() => {
//将浏览器视口中可视区域的高度(不包括滚动条、工具栏等)赋值给变量 doctH
doctH = document.body.clientHeight
//获取浏览器视口高度的标准属性
viewH = window.innerHeight || document.documentElement.clientHeight
console.log(doctH,viewH);
window.addEventListener('scroll', calcScroll)
})
})
onUnmounted(() => {
window.removeEventListener('scroll', calcScroll)
})
</script>
<style scoped>
/* 回到顶部 - 小猫咪 */
.cats {
position: fixed;
right: 56px;
top: -80px;
z-index: 9999;
width: 64px;
height: 64px;
transform: translateX(50%);
background: url('@/assets/images/cat.png') no-repeat center center / contain;
cursor: pointer;
}
.cats::after {
position: absolute;
content: '到底啦~';
right: 55%;
top: -110%;
width: 100px;
height: 100px;
display: flex;
justify-content: center;
align-items: center;
background: url('@/assets/images/cat-word.png') no-repeat center center / contain;
font-size: 14px;
color: rgb(57, 197, 187);
padding-top: 6px;
box-sizing: border-box;
opacity: 0;
transition: all .2s ease-in-out;
pointer-events: none;
}
.cats.bottom::after {
opacity: 1;
}
</style>