uni-app 实现类似wow.js与animate 配合的效果

发布于 1周前 作者 nodeper 来自 Uni-App

uni-app 实现类似wow.js与animate 配合的效果

最近的项目需要实现 animate+wow.js 一样的效果,结果发现实现比较难,希望有大佬能出一个

2 回复

同求,引入js的时候会有问题


在uni-app中实现类似wow.js与animate.css配合的效果,可以通过使用Vue的生命周期钩子和CSS动画来完成。下面是一个基本的实现思路和代码示例。

实现思路

  1. 准备动画CSS:首先,你需要定义好CSS动画,这些动画可以类似于animate.css中的效果。
  2. 监听页面滚动:使用onPageScroll事件监听页面的滚动位置。
  3. 动态添加动画类:根据元素的滚动位置动态添加或移除动画类。

代码示例

1. 定义动画CSS

App.vue或你的组件CSS文件中定义动画:

/* animate.css 示例动画 */
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.fade-in {
  animation: fadeIn 1s ease-in-out;
}

2. 编写Vue组件

在你的页面组件中,监听滚动事件并动态添加动画类:

<template>
  <view class="container">
    <view class="box" v-for="(box, index) in boxes" :key="index" :class="{'fade-in': isInViewport(boxRef[index])}">
      Box {{ index + 1 }}
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      boxes: Array.from({ length: 10 }, (_, i) => ({ id: i + 1 })),
      boxRefs: []
    };
  },
  mounted() {
    this.$refs.container.addEventListener('scroll', this.handleScroll);
  },
  beforeDestroy() {
    this.$refs.container.removeEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll() {
      this.boxes.forEach(box => {
        const el = this.$refs[`box${box.id}`];
        if (this.isInViewport(el)) {
          el.classList.add('fade-in');
        }
      });
    },
    isInViewport(el) {
      const rect = el.getBoundingClientRect();
      return (
        rect.top >= 0 &&
        rect.left >= 0 &&
        rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
        rect.right <= (window.innerWidth || document.documentElement.clientWidth)
      );
    }
  }
};
</script>

<style>
.container {
  height: 100vh;
  overflow-y: scroll;
  position: relative;
}
.box {
  height: 100px;
  margin: 50px 0;
  background-color: lightblue;
  text-align: center;
  line-height: 100px;
  opacity: 0; /* 初始状态透明 */
}
</style>

注意

  1. 性能优化:在实际应用中,监听滚动事件并频繁操作DOM可能会影响性能。可以考虑使用节流(throttle)或防抖(debounce)技术来优化。
  2. 动画复用:可以将动画类封装到一个单独的CSS文件中,方便复用和维护。

通过上述方法,你可以在uni-app中实现类似wow.js与animate.css配合的效果。

回到顶部