1. 程式人生 > 實用技巧 >滾動條滾動到指定位置,元素執行動畫

滾動條滾動到指定位置,元素執行動畫

建立一個元件,自己起一個名字

<template>
  <div ref="scroll">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'GanAnimate',
  props: {
    direction: {
      type: String,
      default: 'left'
    }
  },
  data() {
    return {}
  },
  mounted() {
    // 監聽window滾動條
    window.addEventListener('scroll', this.handleScroll)
  },
  methods: {
    handleScroll() {
      // this.$refs.scroll.getBoundingClientRect().y指的是當前元素的y軸的位置
      // window.innerHeight是當前瀏覽器視窗的可視高度
      if (this.$refs.scroll.getBoundingClientRect().y < window.innerHeight) {
        this.$refs.scroll.classList.add('animate-' + this.direction)
      } else {
        this.$refs.scroll.classList.remove('animate-' + this.direction)
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.animate-left {
  animation: Aleft 1s ease 1;
}
@keyframes Aleft {
  0% {
    transform: translateX(-200px);
  }
  50% {
    transform: translateX(200px);
  }
  100% {
    transform: translateX(0);
  }
}
.animate-right {
  animation: Aright 1s ease 1;
}
@keyframes Aright {
  0% {
    transform: translateX(200px);
  }
  50% {
    transform: translateX(-10px);
  }
  100% {
    transform: translateX(0);
  }
}
.animate-top {
  animation: Atop 1s ease 1;
}
@keyframes Atop {
  0% {
    transform: translateY(-300px);
  }
  50% {
    transform: translateY(-10px);
  }
  100% {
    transform: translateY(0);
  }
}
.animate-bottom {
  animation: Abottom 0.8s ease 1;
}
@keyframes Abottom {
  0% {
    transform: translateY(-150%);
  }
  40% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-20%);
  }
  60% {
    transform: translateY(0);
  }
  70% {
    transform: translateY(-10%);
  }
  100% {
    transform: translateY(0);
  }
}
</style>

在需要用到的地方匯入元件

import GanAnimate from '@/components/animate/index'
components: {
    GanAnimate
 },

使用方式:direction可已傳4個值(left預設,right,bottom,top)
<div class="container">
   <gan-animate direction="left">
      <div class="circle"></div>
   </gan-animate>
</div>

<style lang="scss" scoped>
.container {
  width: 
100%; height: 1500px; display: flex; align-items: flex-end; .circle { height: 100px; width: 100px; background-color: gray; border-radius: 50%; } } </style>

自己簡單的封裝了一個動畫元件,雖然十分的粗糙,但是還是可以湊合用。