vue 回到页面顶部

模仿Element-UI 回到页面顶部

BackToTop.vue

<template>
  <transition :name="transitionName">
    <div class="page-component-up"
      @click="backToTop"
      v-show="visible"
      :style="customStyle">
      <i class="el-icon-caret-top"></i>
    </div>
  </transition>
</template>

<script>
export default {
  name: 'BackToTop',
  props: {
    transitionName: {
      type: String,
      default: 'fade'
    },
    customStyle: {
      type: Object
    },
    visibilityHeight: { // 纵向滑动多远距离出现滚动条
      type: Number
    },
    backPosition: { // 返回顶部时,滚动到哪里(距离顶部的距离)
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      visible: false,
      interval: null
    }
  },
  mounted() {
    window.addEventListener('scroll', this.handleScroll)
  },
  beforeDestroy() {
    window.removeEventListener('scroll', this.handleScroll)
    if(this.interval) {
      clearInterval(this.interval)
    }
  },
  methods: {
    handleScroll() {
      this.visible = window.pageYOffset > this.visibilityHeight
    },
    backToTop() {
      let distanceY = window.pageYOffset
      let i = 0
      this.interval = setInterval(() => {
        let next = Math.floor(this.easeInOutQuad(10 * i, distanceY, -distanceY, 500))
        if(next <= this.backPosition) {
          window.scrollTo(0, this.backPosition)
          clearInterval(this.interval)
        } else{
          window.scrollTo(0, next)
        }
        i++
      }, 17)
    },
    /*
      缓动公式(Tween算法)
       t: 动画已经执行的时间(实际上时执行多少次/帧数)
       b: 起始位置
       c: 终止位置
       d: 从起始位置到终止位置的经过时间(实际上时执行多少次/帧数)

      http://www.cnblogs.com/mrsunny/archive/2011/06/21/2086080.html
    */
    easeInOutQuad(t, b, c, d) {
      // 判断当前时间是否总在总时间的一半以内,是的话执行缓入函数,否则的话执行缓出函数
      if ((t /= d / 2) < 1) { 
        return c / 2 * t * t + b
      } else {
        // 将总长度设置为一半,并且时间从当前开始递减,对图像进行垂直向上平移
        return -c / 2 * (--t * (t - 2) - 1) + b
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.page-component-up{
  position: fixed;
  cursor: pointer;
  text-align: center;
  transition: .3s;
  box-shadow: 0 0 6px rgba(0,0,0,.12);
  z-index: 99;
  i{
    color: #409eff;
    display: block;
    line-height: inherit;
    text-align: center;
    font-size: 18px;
  }
}
</style>

页面引用:

<template>
  <div>
    <h1>返回顶部</h1>
    <div>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
      <el-alert title="山桃红花满上头,蜀江春水拍山流。" type="success"></el-alert>
    </div>
    <el-tooltip placement="top" content="返回顶部">
      <back-to-top 
        transitionName="fade"
        :customStyle="myBackToTopStyle" 
        :visibilityHeight="300" 
        :backPosition="50">
      </back-to-top>
    </el-tooltip>
  </div>
</template>

<script>
import BackToTop from '@/components/BackToTop'

export default {
  data() {
    return {
      myBackToTopStyle: {
        'right': '100px',
        'bottom': '150px',
        'width': '40px',
        'height': '40px',
        'border-radius': '20px',
        'line-height': '40px', 
        'background': '#fff'
      }
    }
  },
  components: {
    BackToTop
  }
}
</script>

展示效果:

demo 地址:https://github.com/frwupeng517/element-admin/blob/master/src/components/BackToTop.vue

原文地址:https://www.cnblogs.com/rogerwu/p/9543563.html