快捷菜单
常用功能一站直达
更多功能请点顶栏「快捷菜单」

[[toc]]
[toc]
来给自己的Teek博客增加一个
返回顶部小猫挂件功能。😊
警告
本着开源共享、共同学习的精神:
本文是在 《Hyde Blog》博主的《返回顶部挂件》文章 基础上增加了一些自己的实际操作记录和修改,内容依旧属于原作者所有(感谢原作者分享的手把手文档💖💖💖)。转载无需和我联系,但请注明文章来源。如果侵权之处,请联系博主进行删除,谢谢。
2025.5.9(已解决)
警告
次配置适用于Teek@1.1.4-2025.5.8版本(其它版本可自行测试)。提示
自己开源的 《vitepress-theme-teek-one-public》网站模板。
此模板是在《Young Kbt blog》大佬开源项目《vitepress-theme-teek 》基础上修改为自己的风格而成,感谢大佬开发得主题,大佬威武。❤️❤️
(1)新建组件
创建docs\.vitepress\theme\components\BackToTop.vue文件,添加如下代码:
1<template>
2 <div
3 class="back_to_top"
4 ref="toTop"
5 :style="{
6 top: top + 'px',
7 }"
8 @click="topTop"
9 ></div>
10 </template>
11 <script setup lang="ts" name="BackToTop">
12 import { useRoute } from "vitepress";
13 import { nextTick, onUnmounted, ref, watch } from "vue";
14 import { TkMessage } from "vitepress-theme-teek";
15
16 const route = useRoute();
17 const toTop = ref();
18 const top = ref<number>(-900);
19 const offsetHeight = ref<number>(0);
20
21 const topTop = () => {
22 top.value = -900;
23 window.scrollTo({
24 top: 0,
25 behavior: "smooth",
26 // @ts-ignore Safari兼容
27 ...(typeof CSS !== "undefined" && CSS.supports("scroll-behavior", "smooth")
28 ? {}
29 : { left: 0 }),
30 });
31 TkMessage.success({
32 message: "已达到顶部🎉",
33 duration: 3000,
34 });
35 };
36
37 let animationFrame: number | null = null;
38
39 const backToTop = () => {
40 if (!animationFrame) {
41 animationFrame = requestAnimationFrame(() => {
42 offsetHeight.value = document.documentElement.offsetHeight;
43 const scrollTop = document.documentElement.scrollTop;
44 if (scrollTop < 100) {
45 top.value = -900;
46 } else {
47 top.value = (900 - (scrollTop / offsetHeight.value) * 900) * -1;
48 }
49 animationFrame = null;
50 });
51 }
52 };
53
54 window.addEventListener("scroll", backToTop);
55
56 onUnmounted(() => {
57 window.removeEventListener("scroll", backToTop);
58 });
59
60 watch(
61 () => route.path,
62 () => {
63 nextTick(() => {
64 offsetHeight.value = document.querySelector("html")!.offsetHeight;
65 });
66 }
67 );
68 </script>
69 <style lang="scss" scoped>
70 @keyframes float {
71 0% {
72 -webkit-transform: translateY(0);
73 -ms-transform: translateY(0);
74 transform: translateY(0);
75 }
76
77 50% {
78 -webkit-transform: translateY(-10px);
79 -ms-transform: translateY(-10px);
80 transform: translateY(-10px);
81 }
82
83 100% {
84 -webkit-transform: translateY(0);
85 -ms-transform: translateY(0);
86 transform: translateY(0);
87 }
88 }
89
90 .back_to_top {
91 cursor: pointer;
92 position: fixed;
93 right: 80px;
94 top: -900px;
95 z-index: 1000;
96 width: 70px;
97 height: 900px;
98 background: url("/backToTop/scroll.gif");
99 transition: all 0.5s ease-in-out;
100 opacity: 1;
101
102 // 新增移动端隐藏
103 @media (max-width: 768px) {
104 background: none;
105 }
106
107 &:hover {
108 animation: float 2s linear infinite;
109 }
110 }
111 </style>(2)注册组件
编辑docs\.vitepress\theme\components\TeekLayoutProvider.vue文件,添加如下代码:(具体代码可从我开源库Teek-one里获取)
1import BackToTop from "./BackToTop.vue"; //导入 返回顶部小猫挂件
2
3
4 <!-- 返回顶部小猫挂件 -->
5 <BackToTop />

(3)运行测试
每切换到一个网页时,会弹出如下弹框哦,有趣的特性。

我的博客主旨:
🍀 个人网站

🍀 微信二维码
x2675263825 (舍得), qq:2675263825。

🍀 微信公众号
《云原生架构师实战》

🍀 csdn
https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

🍀 知乎
https://www.zhihu.com/people/foryouone

如果你还有疑惑,可以去我的网站查看更多内容或者联系我帮忙查看。
如果你有更好的方式,评论区留言告诉我。谢谢!
好了,本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

日历 · 精选 · 友链 · 更多
如果内容对你有帮助,欢迎请我喝杯咖啡 ☕



One的公众号
爱折腾博客的小白