前端过渡动画

前端过渡动画

vue3

1、组件进入视口时向上移动且渐显

1、创建js文件addViewportEffect.js

function slideDownEffect(element) {
    console.log("执行");
    element.style.transform = 'translateY(0)';
    element.style.opacity = '1';
}

/**
 * 添加视口效果到指定的类名元素上。
 * @param {string} className - 要添加效果的元素的类名。
 * @param {Function} [effectFunction=slideDownEffect] - 当元素即将进入视口时要执行的动画效果函数。
 * @param {string} [animatedClass='animated'] - 标记元素已执行动画效果的类名。
 */
function addViewportEffect(className, effectFunction = slideDownEffect, animatedClass = 'animated') {
    document.addEventListener('DOMContentLoaded', function() {
        var elements = document.querySelectorAll(className);

        function isInViewport(el) {
            var rect = el.getBoundingClientRect();
            var viewportBottom = window.innerHeight || document.documentElement.clientHeight;
            return rect.top <= viewportBottom;
        }

        function checkElements() {
            elements.forEach(function(el) {
                if (isInViewport(el) && !el.classList.contains(animatedClass)) {
                    effectFunction(el);
                    el.classList.add(animatedClass); // 标记元素已执行动画效果
                }
            });
        }

        // 使用IntersectionObserver代替scroll事件监听器
        const observer = new IntersectionObserver((entries, observer) => {
            entries.forEach(entry => {
                if (entry.isIntersecting) {
                    const element = entry.target;
                    effectFunction(element);
                    element.classList.add(animatedClass); // 动画完成后标记
                    observer.unobserve(element); // 动画完成后取消对该元素的观察
                }
            });
        }, {
            threshold: 0.1 // 在元素10%进入视口时触发
        });

        elements.forEach(el => {
            observer.observe(el);
        });
    });
}

// 导出函数,以便在其他文件中使用
export default addViewportEffect;

2、使用

先到需要这个效果的组件上创建一个class,内容如下:

.dx-01{
  opacity: 0;
  transform: translateY(200px);
  transition: opacity 1s ease-in-out, transform 1s ease-in-out;
}
<div class="dx-01">
    这是要执行效果的组件内容
</div>

然后在导入上面 js 的方法,并在页面创建时使用

<script>
import addViewportEffect from "@/utils/addViewportEffect.js";
export default {    
    mounted() {
        this.recommendsIndex = 0
        this.switchRecommend()
        addViewportEffect(".dx-01")
      },
}
</script>

js方法可复用,记得每次设置不同的class才行,不然会重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值