vue 封装返回顶部组件

我的环境是vue+vant+ts, 相信大家应该知道怎么改成vue+js的写法 先看效果图: HTML: template>!-- 返回顶部组件 2020-

我的环境是vue+vant+ts, 相信大家应该知道怎么改成vue+js的写法

先看效果图:

在这里插入图片描述

HTML:

<template><!-- 返回顶部组件 2020-02-17 Walker --><div class="backtop"><div v-if="btnFlag" @click="backTop" class="my_gotop"><!-- 图标 svg --><svgt="1581926628181"class="icon"viewBox="0 0 1024 1024"version="1.1"xmlns="http://www.w3.org/2000/svg"p-id="4136"width="50"height="50"><pathd="M512 0C230.4 0 0 230.4 0 512s230.4 512 512 512 512-230.4 512-512S793.6 0 512 0zM697.6 582.4 627.2 582.4c-12.8 0-19.2 6.4-19.2 19.2l0 108.8c0 6.4-6.4 12.8-12.8 12.8L428.8 723.2c-6.4 0-12.8-6.4-12.8-12.8L416 595.2c0-6.4-6.4-19.2-19.2-19.2L326.4 576C320 582.4 320 576 320 576l179.2-172.8c6.4-6.4 12.8-6.4 19.2 0L704 576C704 576 704 582.4 697.6 582.4zM704 364.8 320 364.8c-19.2 0-32-12.8-32-32S300.8 300.8 320 300.8l384 0c19.2 0 32 12.8 32 32S723.2 364.8 704 364.8z"p-id="4137"fill="#2375ff"></path></svg></div></div>
</template>

TS:

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";@Component
export default class EMBackTop extends Vue {//是否显示组件btnFlag = false;/*** @description 返回顶部的函数*/backTop() {const scrollTopObj =document.documentElement.scrollTop || document.body.scrollTop;if (scrollTopObj > 0) {//回调 backtop()函数 直到不符合条件window.requestAnimationFrame(this.backTop);// 滚动动画效果 动画没执行完之前继续滑动屏幕会有点bugwindow.scrollTo(0, scrollTopObj - scrollTopObj / 8);// 没有动画效果方式  这种方式可以不调用requestAnimationFrame();//window.scrollTo(0, 0);}}/*** @description 是否显示组件的函数*/showBackTop() {const scrollTopObj =document.documentElement.scrollTop || document.body.scrollTop;if (scrollTopObj > 0) {this.btnFlag = true;} else {this.btnFlag = false;}}mounted() {// 监听距顶部的距离 调用showBackTop()window.addEventListener("scroll", this.showBackTop, true);}destroyed() {window.removeEventListener("scroll", this.showBackTop, true);}
}
</script>

Css:


ps:解释一下 window.requestAnimationFrame(callback) 方法
查了很多,很多让人费解的解释,看的我一头雾水,越看越糊涂。
官方是这样解释的:

window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行;

注意:若你想在浏览器下次重绘之前继续更新下一帧动画,那么回调函数自身必须再次调用window.requestAnimationFrame();
当你准备更新动画时你应该调用此方法。这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数(即你的回调函数)。回调函数执行次数通常是每秒60次,但在大多数遵循W3C建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。为了提高性能和电池寿命,因此在大多数浏览器里,当requestAnimationFrame() 运行在后台标签页或者隐藏的 里时,requestAnimationFrame() 会被暂停调用以提升性能和电池寿命;
回调函数会被传入DOMHighResTimeStamp参数,DOMHighResTimeStamp指示当前被 requestAnimationFrame() 排序的回调函数被触发的时间。在同一个帧中的多个回调函数,它们每一个都会接受到一个相同的时间戳,即使在计算上一个回调函数的工作负载期间已经消耗了一些时间。该时间戳是一个十进制数,单位毫秒,最小精度为1ms(1000μs)。

自我感觉:window.requestAnimationFrame(callback),对回调函数的执行时机的一个优化。在需要对动画循环调用时,可以替代定时器,解决定时器会卡顿的问题。

更多看这篇博客:requestAnimationFrame