当前位置: 首页 > article >正文

【功能实现】如何实现点击后跳转到顶部??

📢博客主页:逆旅行天涯-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.scrollTowindow.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>


http://www.kler.cn/news/294542.html

相关文章:

  • 57-java csrf防御方案
  • 【Redis】Redis 集群搭建与管理: 原理、实现与操作
  • vue项目打包后,生成的index.html直接本地打开后没内容
  • Web:攻防世界unseping
  • 11Python的Pandas:可视化
  • Element Plus(Vue 3 版本)来实现图片轮播
  • P01-Java何谓数组
  • sheng的学习笔记-AI-概率图,隐马尔可夫HMM,马尔可夫随机场MRF,条件随机场CRF
  • 尝试用java spring boot+VUE3实现前后端分离部署(8/31)
  • 时间段切块算法
  • Flask中 blinker 是什么
  • 【Spring基础1】- Spring 启示录-理解IoC控制反转
  • 电脑删除的Word文件怎么恢复?快速恢复技巧分享
  • C++入门基础
  • Mail PHP: 如何设置SMTP服务器以发送邮件?
  • Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区
  • CSS解析:定位和层叠上下文
  • Elasticsearch 向量数据库本地部署 及操作方法
  • Learn ComputeShader 09 Night version lenses
  • 如何使用Prometheus与Grafana监控Kubernetes集群
  • 图论基础1
  • 重启顺风车的背后,是高德难掩的“野心”
  • 高分辨率音频和传统音频区别
  • 学习笔记--Docker
  • 【机器学习】朴素贝叶斯网络的基本概念以及朴素贝叶斯网络在python中的实例
  • 【SpringBoot】使用Nacos服务注册发现与配置管理
  • 主板选购2
  • 【C/C++】Linux\Windows为什么频繁使用size_t
  • 服务器蓝屏该怎么办
  • Vue3 父子传参 简单易懂