首页 > 其他分享 >返回顶部按钮的组件

返回顶部按钮的组件

时间:2024-06-05 13:55:16浏览次数:19  
标签:动画 滚动 顶部 fade 按钮 组件 const ref

目录

1.封装

<template>
    <transition :name="transitionName">
        <div v-show="visible" class="back-to-ceiling" @click="backToTop">
            <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg"
                class="Icon Icon--backToTopArrow" aria-hidden="true" style="height:16px;width:16px">
                <path
                    d="M12.036 15.59a1 1 0 0 1-.997.995H5.032a.996.996 0 0 1-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29a1.003 1.003 0 0 1 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" />
            </svg>
        </div>
    </transition>
</template>

<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue'
const backPosition = ref(0);//按钮回到顶部的位置
const transitionName = ref('fade');
const visibilityHeight = ref(400);//显示按钮的高度

const visible = ref(false)//控制按钮的显示与隐藏
let interval = null//动画效果
let isMoving = false

const handleScroll = () => {//监听页面滚动事件
    // 当前页面的滚动距离大于props.visibilityHeight:400时就visible设置为true,组件显示
    visible.value = window.pageYOffset > visibilityHeight.value
}

const backToTop = () => {//返回顶部的动画效果
    if (isMoving) return//如果为true,说明正在执行滚动动画,因此直接返回,不执行后续操作。
    const start = window.pageYOffset//动画的起始位置
    let i = 0//初始化计数器
    isMoving = true//开始执行滚动动画
    interval = setInterval(() => {//设置一个定时器,每16.7毫秒执行一次回调函数
        //使用 easeInOutQuad 二次缓动函数计算下一个要滚动位置 next
        const next = Math.floor(easeInOutQuad(10 * i, start, -start, 500))
            if (next <= backPosition.value) {//滚动到目标位置顶部了
            window.scrollTo(0, backPosition.value)
            clearInterval(interval)//清除定时器
            isMoving = false//动画结束
        } else {//没滚到目标位置,继续往下一个next位置滚动
            window.scrollTo(0, next)
        }
        i++
    }, 16.7)
}

const easeInOutQuad = (t, b, c, d) => {//t: 当前时间、b: 起始值、c: 变化量、d: 持续时间
    if ((t /= d / 2) < 1) return (c / 2) * t * t + b//动画的前半部分,加速
    return (-c / 2) * (--t * (t - 2) - 1) + b//动画的后半部分,减速
}

onMounted(() => {//组件挂载时添加滚动事件监听。
    window.addEventListener('scroll', handleScroll)
})

onBeforeUnmount(() => {//在组件销毁前执行,用于移除滚动事件监听并清除定时器。
    window.removeEventListener('scroll', handleScroll)
    if (interval) {
        clearInterval(interval)
    }
})

</script>

<style scoped>
.back-to-ceiling {
    position: fixed;
    display: inline-block;
    text-align: center;
    cursor: pointer;
    right: 50px;
    bottom: 50px;
    width: 40px;
    height: 40px;
    border-radius: 4px;
    line-height: 45px;
    background: #e7eaf1;
}

.back-to-ceiling:hover {
    background: #d5dbe7;
}

.fade-enter-active,
.fade-leave-active {
    transition: opacity 0.5s;
}

.fade-enter,
.fade-leave-to {
    opacity: 0;
}

.back-to-ceiling .Icon {
    fill: #9aaabf;
    background: none;
}
</style>

2.调用

<template>
    <el-tooltip placement="top" content="tooltip">
        <back-to-top class="myBackToTopStyle" :visibility-height="300" :back-position="50" transition-name="fade" />
    </el-tooltip>
</template>
<script setup lang="ts">
//引入组件
import BackToTop from '@/components/BackToTop/index.vue'
</script>

<style scoped>
.myBackToTopStyle {
    right: '50px';
    bottom: '50px';
    width: '40px';
    height: '40px';
    border-radius: '4px';
    line-height: '45px';
    background: '#e7eaf1';
}
</style>

3.效果

  • 滚动超过400出现回到顶部按钮,点击按钮回到顶部

标签:动画,滚动,顶部,fade,按钮,组件,const,ref
From: https://www.cnblogs.com/lushuang55/p/18232857

相关文章

  • 【vuejs】keep-alive组件的原理讲解和使用讲解
    1.keep-alive简介Vue.js框架中的<keep-alive>组件是一个用于缓存组件实例的内置组件,它使得组件在不活动时保持其状态,从而提高应用的性能和用户体验。当使用动态组件<component>切换视图时,不在显示的组件实例会被销毁并重新创建,这会导致状态丢失。而<keep-alive>可......
  • vue 项目中使用v-permission 实现按钮级权限控制
    在使用vue-element-admin框架进行开发时,您可以通过自定义指令来实现按钮级的权限控制。这个自定义指令可以根据用户的权限动态地控制按钮的显示。以下是一个详细的实现步骤:1、在src目录下按照如下目录结构,创建一个权限文件,例如permission.js:目录结构:src/directive/permissi......
  • Vue 获取组件名称
    Vue2获取组件名称获取方式:this.$options.name解读:通过Vue2的 this 关键字,可以很容易地访问Vue组件实例对象身上的 $options 的name属性来获取组件名称。 <script>exportdefault{name:"Brand",mounted(){//Brandconsole.log(this.$options.......
  • vue动态加载组件import引入组件找不到组件(Error: Cannot find module)
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:https://gitee.com/nbacheng/ruoyi-nbcio演示地址:RuoYi-Nbcio后台管理系统http://218.75.87.38:9666/更多nbcio-boot功能请看演示系统 gitee源代码地址后端代码:https://gitee.com/nbacheng/nbcio-boot前端......
  • 界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(二)
    DevExpressWinForms的Diagram(流程图)组件允许您复制MicrosoftVisio中的许多功能,并能在下一个WindowsForms项目中引入信息丰富的图表、流程图和组织图。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能......
  • 交互式流程图组件DHTMLX Diagram v6.0 - 拥有更灵活的高度可定制功能
    DHTMLXDiagram库允许用几行代码构建JavaScript流程图,通过自动布局和实时编辑器,它可以更容易地将复杂数据可视化到一个整洁的层次结构中。DHTMLXDiagramv6.0版本发布,带来了众多令人兴奋的新功能和改进,使得这个JavaScript图表库更加强大和灵活。此次更新不仅增强了现有的功能......
  • .NET C# 程序自动更新组件
    引言本来博主想偷懒使用AutoUpdater.NET组件,但由于博主项目有些特殊性和它的功能过于多,于是博主自己实现一个轻量级独立自动更新组件,可稍作修改集成到大家自己项目中,比如:WPF/Winform/Windows服务。大致思路:发现更新后,从网络上下载更新包并进行解压,同时在WinForms应用程序中显示......
  • 如何在启动活动或启动活动结果中只在导航栏上显示返回按钮
    我在pax设备上使用启动器应用程序,其中有一个打开显示设置的选项,点击该选项后,它将导航到Android显示设置,并且只显示返回按钮。以下是用户界面:......
  • vue后台用户路由权限和按钮权限实现原理
    概论主要是通过一个唯一标识name或者id来过滤判断用户所处的角色是否有路由的权限或者按钮的权限一般路由都有一个一个name可以作为唯一标识一般按钮的话,可以自定义一个name作为标识业务逻辑后台通过选中路由或者按钮给角色,代表这个角色有数组中name[]的权限,用户或者部门再......
  • vue-router 源码分析——2. router-link 组件是如何实现导航的
    这是对vue-router3版本的源码分析。本次分析会按以下方法进行:按官网的使用文档顺序,围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码,更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升,甚至面试时的回答都非常有帮助。在围绕某个功能展开讲解时,所......