首页 > 其他分享 >回到页面顶部(回到顶部、过渡动画)

回到页面顶部(回到顶部、过渡动画)

时间:2023-12-02 11:11:07浏览次数:31  
标签:el 滚动 动画 顶部 up timer 回到 10px

项目背景:
vue

1.创建 backtop.vue 的回到顶部逻辑的组件
<template>
  <transition name="back-up-fade">
    <div
      class="back-top"
      :style="{
        bottom: bottom + 'px',
        right: right + 'px',
      }"
      @click.stop="handleBackTopClick($event)"
      v-if="show"
    >
      <div class="back-text-contaner card">
        <!-- 提供了插槽显示插槽内容 -->
        <slot v-if="$slots.default"></slot>
        <!-- 没提供,使用默认的 -->
        <div class="default-text" v-else>
          up
        </div>
      </div>
    </div>
  </transition>
</template>

<script>
// 导入节流函数
// import { throttle } from "./utils";
 let throttle=function(fn, intervalTime = 200, immediate = true) {
  let oldTime = Date.now();
  return function (...arg) {
    if (immediate) {
      fn.bind(this)(...arg);
      immediate = false;
    }
    let nowTime = Date.now();
    if (nowTime - oldTime >= intervalTime) {
      fn.bind(this)(...arg);
      oldTime = nowTime;
    }
  };
}

export default {
  props: {
    // 触发滚动的容器
    target: {
      type: String,
      default: "",
    },
    // 滚动高度达到此参数值才出现
    visibilityHeight: {
      type: Number,
      default: 100,
    },
    // 控制其显示位置, 距离页面右边距
    right: {
      type: Number,
      default: 270,
    },
    // 控制其显示位置, 距离页面底部距离
    bottom: {
      type: Number,
      default: 60,
    },
  },
  data() {
    return {
      // 滚动容器
      container: null,
      // 是否显示
      show: false,
      // 定时器标识
      timer: null,
      // 包裹元素节点
      el: "",
    };
  },
  mounted() {
    //节流处理,避免频繁触发事件
    this.throttleHandleContanierScroll = throttle(
      this.handleContanierScroll,
      10,
      false
    );
    this.init();
  },
  methods: {
    init() {
      // 默认滚动元素为document
      this.container = document;
      this.el = document.documentElement;
      // 外部传入滚动包裹元素时候
      if (this.target) {
        const el = document.querySelector(this.target);
        el ? (this.container = el && (this.el = el)) : null;
      }
      // console.log(this.container);
      this.container.addEventListener(
        "scroll",
        this.throttleHandleContanierScroll,
        false
      );
    },
    // 回到顶部点击
    handleBackTopClick(e) {
      // 给回到顶部一定过度事件
      console.log(e,'>>>>>>>>');
      this.timer = setInterval(() => {
        this.scrollToTop();
      }, 16);
      // 通知用户
      this.$emit("backUpClick", e);
    },
    // 滚动事件
    handleContanierScroll() {
      // 滚动超出给定高度则显示,否则隐藏
      if (this.el.scrollTop > this.visibilityHeight) {
        this.show = true;
      } else {
        this.show = false;
      }
    },
    // 滚动到顶部
    scrollToTop() {
      if (this.el.scrollTop > 0) {
        this.el.scrollTop -= 50;
      } else {
        clearInterval(this.timer);
      }
    },
  },
  beforeDestroy() {
    // 销毁定时器
    clearInterval(this.timer);
    this.timer = null;
  },
};
</script>

<style lang="scss">
.back-top {
  // position: fixed;
  // background-color: #fff;
  // width: 40px;
  // height: 40px;
  background: rgba(226, 243, 255, 0.8);
  border-radius: 10px 10px 10px 10px;
  border: 1px solid #BADAFD;
  padding: 10px;
  opacity: 1;

  // border-radius: 50%;
  color: #409eff;
  display: flex;
  align-items: center;
  justify-content: center;
  // font-size: 20px;
  // box-shadow: 0 0 6px rgb(0 0 0 / 12%);
  cursor: pointer;
  z-index: 999;
}
.back-up-position {
  position: relative;
}

// 过度动画
.back-up-fade-enter-active {
  transition: opacity 0.3s linear;
}
.back-up-fade-enter {
  opacity: 0;
}
.back-up-leave-to {
  opacity: 0;
}
</style>

2.在相应的组件位置进行引用
//引入组件
import backtop from "./backtop.vue";

//注册组件
components: { backtop },

//组件使用
<backtop :visibility-height="200" @backUpClick="handleBackUpClick">
   <img src="@/assets/images/mh/fwback.png" alt="">
   <span>回到顶部</span>
</backtop>

backUpClick 为点击按钮回到顶部后触发的事件

进行组件封装 可以与业务代码进行解耦,预留插槽位置可以保留外部的样式定制化,预留外部api的定制化操作。


标签:el,滚动,动画,顶部,up,timer,回到,10px
From: https://www.cnblogs.com/zjxlicheng/p/17871372.html

相关文章

  • 51k+ Star!动画图解、一键运行的数据结构与算法教程!
    大家好,我是Java陈序员。我们都知道,《数据结构与算法》——是程序员的必修课。无论是使用什么编程语音,亦或者是前后端开发,都需要修好《数据结构与算法》这门课!在各个互联网大产的面试中,对数据结构和算法的考核乐此不疲。往往《数据结构与算法》学得好的,都能拿到高薪!但是《数......
  • 不墨迹爬就完啦:爬动画影评网、
    1、用bs4爬壁纸网importrequestsfrombs4importBeautifulSoup#导入BeautifulSoupfromurllib.parseimporturljoin#专门用来做url路径拼接的importtimeheader={"user-agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,like......
  • 游戏中模型动画的几种实现方式
    游戏内动画的实现方式一般有这几种:骨骼动画顶点动画材质动画CPU蒙皮动画骨骼动画骨骼动画是一种基于骨骼系统的动画技术,它通过对骨骼进行变换来控制模型的姿态和动作。在骨骼动画中,模型通常被分解成多个部分,每个部分都与一个或多个骨骼相连,通过对骨骼进行旋转、平移、缩放等变换,可......
  • Android开发App回到桌面但不退出APP的实现
    方法1:Intentintent=newIntent();//创建Intent对象intent.setAction(Intent.ACTION_MAIN);//设置Intent动作intent.addCategory(Intent.CATEGORY_HOME);//设置Intent种类intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//标记context.startActivity(intent);方法2:......
  • Flutter的动画框架简介
    今天接着说动画简介Flutter提供了强大而灵活的动画框架,允许你创建各种动画效果,从简单的补间动画到复杂的交互式动画。Flutter中的动画开发主要涉及到以下几个核心概念:各个概念介绍Animation(动画):Animation是一个抽象类,表示动画的值的变化。它定义了动画在某个范围内变化的......
  • vue指令封装(按钮权限、loading加载、slideIn窗口进入动画)
    vue指令vue本身具有一些指令,但是有些指令是vue作者自己写的,有些是第三方插件写的。v-ifv-if指令是用来控制元素是否显示的,如果值为true,则显示,如果值为false,则隐藏。<divid="app"><pv-if="isShow">我是显示的内容</p><pv-else>我是隐藏的内容</p></div><scri......
  • iOS免签打包,顶部域名可以隐藏吗?如何隐藏?
    各位小伙伴们大家好!我是咕噜铁蛋!在iOS应用分发领域,免签打包是开发者在无需通过苹果官方AppStore就可以将应用安装到用户手机上的一种方法。尽管这种方式在某些场景中极为有用,但同时也带来了一些特有的挑战,尤其是与应用的外在表现与用户体验相关的问题。其中,一个常见的问题是,在使用......
  • app直播源码,uniapp之自定义顶部样式
    app直播源码,uniapp之自定义顶部样式 //需要自定义顶部样式的页面配置{"path":"pages/case/index","style":                                           {  "navigationBarTitleT......
  • 前端歌谣的刷题之路-第一百题-控制动画
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • Flutter的动画开发入门简介
    Flutter动画库中的核心类,插入用于指导动画的值。Animation对象知道动画目前的状态(例如,是否开始,暂停,前进或倒退),但是对屏幕上显示的内容一无所知。AnimationController管理Animation。CurvedAnimation定义进程为非线性曲线。Tween为动画对象插入一个范围值。例如,Tween可......