Vue 组件,页面向下滚动元素在视口下方时的动画效果

// 定义常量 DISTANCE 和 DURATION,分别表示元素距离视口的距离和动画的持续时间  
const DISTANCE = 150;  
const DURATION = 500;  
  
// 创建一个 WeakMap 对象,用于存储元素和其对应的动画实例  
const map = new WeakMap();  
  
// 创建一个 IntersectionObserver 实例,用于观察元素是否与视口相交  
const ob = new IntersectionObserver((entries) => {  
    // 遍历所有相交的元素  
    for (const entry of entries) {  
        // 如果元素与视口相交  
        if (entry.isIntersecting) {  
            // 获取元素对应的动画实例  
            const animation = map.get(entry.target);  
            if (animation) {  
                // 如果存在动画实例,则播放动画,并取消对该元素的观察  
                animation.play();  
                ob.unobserve(entry.target);  
            }  
        }  
    }  
});  
  
// 定义一个函数,用于判断元素是否在视口下方  
function isBelowViewport(el) {  
    // 获取元素的矩形信息(位置、大小等)  
    const rect = el.getBoundingClientRect();  
    // 如果元素距离视口的距离大于视口高度,返回 true  
    return rect.top - DISTANCE > window.innerHeight;  
}  
  
// 导出一个 Vue 组件对象,包含 mounted 和 unmounted 生命周期钩子函数  
export default {  
    mounted(el) {  
        // 如果元素不在视口下方,直接返回,不执行后续操作  
        if (!isBelowViewport(el)) {  
            return;  
        }  
        // 创建一个动画实例,描述一个元素的平移和透明度变化过程  
        const animation = el.animate([  
            {  
                transform: `translateY(${DISTANCE}px)`,  // 初始状态:向下平移 DISTANCE 像素,透明度为0.5  
                opacity: 0.5  
            },  
            {  
                transform: `translateY(0)`,  // 结束状态:回到原位,透明度为1  
                opacity: 1  
            }  
        ], {  
            duration: DURATION,  // 动画持续时间 DURATION  
            easing: 'ease-in-out',  // 动画的速度曲线为 ease-in-out(先慢后快再慢)  
            fill: 'forwards'  // 动画结束后,元素保持最后一帧的状态(而不是过渡到初始状态)  
        })  
        // 暂停动画,等待与视口相交时再播放  
        animation.pause();  
        // 开始观察元素与视口的相交情况,并存储该元素和其对应的动画实例到 map 中  
        ob.observe(el);  
        map.set(el, animation);  
    },  
    unmounted(el) {  
        // 组件卸载时,取消对元素的观察,并从 map 中移除该元素和其对应的动画实例  
        ob.unobserve(el);  
    },  
}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现在 Vue 2 中当页面滚动到相应组件显示整个组件效果,你可以结合使用 Vue 的生命周期钩子和原生 JavaScript 的滚动事件。 首先,在你的组件中,添加一个容器元素,例如一个 `<div>`,用于包裹需要显示的整个组件。 然后,在组件的生命周期钩子函数 `mounted` 中,绑定一个滚动事件监听器,用于检测页面滚动。 ```html <template> <div> <!-- 其他内容 --> <div ref="targetComponent" class="target-component"> <!-- 整个组件的内容 --> </div> </div> </template> <script> export default { mounted() { window.addEventListener('scroll', this.handleScroll); }, destroyed() { window.removeEventListener('scroll', this.handleScroll); }, methods: { handleScroll() { const targetComponent = this.$refs.targetComponent; const scrollPosition = window.scrollY + window.innerHeight; const componentPosition = targetComponent.offsetTop; if (scrollPosition >= componentPosition) { // 当页面滚动到相应组件,显示整个组件 // 可以在这里修改组件的显示状态或其他操作 } }, }, }; </script> <style> .target-component { display: none; /* 初始状态下隐藏组件 */ } </style> ``` 在 `handleScroll` 方法中,通过比较滚动位置和组件位置来判断是否滚动到相应组件。当滚动到相应组件,你可以在对应的条件下修改组件的显示状态,例如通过操作组件的 CSS 类名或修改数据属性来控制组件的显示和隐藏。 希望这个解决方案对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值