在vue3,nuxt3环境下,我有一个v-for循环出来的数组,我希望添加一些动画。并且用IntersectionObserver和css实现。例如这个数组是四个div,每个大的div里面有两个小的div。我的第一个大的div里左边是图片,右边是文字。第二个是左边是文字,右边是图片,以此类推。当我滚动到第一个大的div时,左边的图片上会出现一个div,div里面是一些文字。右边的div里面的文字会渐渐的由下而上出现。滚动到第二个大的div的时候,右边的图片上会出现文字,左边的文字会由下而上出现。当我滚动的时候,发现两个div都出现在了可见区域内,那么我们需要显示可见区域最高(也就是top值最高)的那个div,也就是图片上的文字会出现

时间: 2024-03-15 22:47:25 浏览: 15
在这种情况下,你需要使用 IntersectionObserver 和一些 JavaScript 代码来计算可见区域内元素的位置,然后根据它们的位置来决定哪个元素应该显示在最上面。具体实现步骤如下: 1. 在父元素中为每个大的 div 添加一个 IntersectionObserver,用于检测该元素是否在用户的视窗中。然后,在 IntersectionObserver 的回调函数中,记录每个元素的位置信息(例如,每个元素的 top 值)。 ``` <template> <div class="wrapper" ref="wrapper"> <div class="item" v-for="(item, index) in items" :key="index" ref="item"> <div class="left" :class="{ 'is-visible': isVisible[index].isLeftVisible }"> <img src="..."> <div class="text"> ... </div> </div> <div class="right" :class="{ 'is-visible': isVisible[index].isRightVisible }"> <div class="text"> ... </div> <img src="..."> </div> </div> </div> </template> <script> export default { data() { return { items: [...], isVisible: [] } }, mounted() { const options = { root: null, rootMargin: '0px', threshold: 0.5 } const observer = new IntersectionObserver(this.handleIntersection, options) this.$refs.item.forEach(item => observer.observe(item)) }, methods: { handleIntersection(entries) { entries.forEach(entry => { const index = this.$refs.item.indexOf(entry.target) const visibleRect = entry.intersectionRect const itemRect = entry.boundingClientRect const wrapperRect = this.$refs.wrapper.getBoundingClientRect() const isVisible = { isLeftVisible: false, isRightVisible: false } if (itemRect.top >= wrapperRect.top && itemRect.bottom <= wrapperRect.bottom) { isVisible.isLeftVisible = true isVisible.isRightVisible = true } else { const leftTop = itemRect.top - wrapperRect.top const leftBottom = itemRect.bottom - wrapperRect.top const rightTop = itemRect.top - wrapperRect.top const rightBottom = itemRect.bottom - wrapperRect.top if (visibleRect.top <= leftTop && visibleRect.bottom >= leftBottom) { isVisible.isLeftVisible = true } if (visibleRect.top <= rightTop && visibleRect.bottom >= rightBottom) { isVisible.isRightVisible = true } } this.isVisible[index] = isVisible }) } } } </script> ``` 2. 在 CSS 中定义动画效果,例如: ``` .item { opacity: 0; transition: opacity 0.5s ease; } .is-visible { opacity: 1; } .left .text { transform: translateY(100%); transition: transform 0.5s ease; } .left.is-visible .text { transform: translateY(0); } .right .text { transform: translateY(100%); transition: transform 0.5s ease; } .right.is-visible .text { transform: translateY(0); } ``` 3. 在 JavaScript 中计算每个元素的位置信息。首先,你需要获取可见区域的位置信息,然后计算每个元素相对于可见区域的位置信息(例如,每个元素的 top 值)。根据这些位置信息,你可以判断哪个元素应该显示在最上面。 4. 当两个 div 重叠时,你可以使用 z-index 属性来控制它们的显示顺序,确保可见度最高的 div 显示在最上面。例如: ``` .wrapper { position: relative; } .item { position: relative; z-index: 1; } .left.is-visible { z-index: 2; } .right.is-visible { z-index: 3; } ``` 这样,当你滚动到不同的大的 div 时,左边或右边的 div 会显示动画效果,并确保可见度最高的元素显示在最上面。

相关推荐

最新推荐

recommend-type

Vue用v-for给循环标签自身属性添加属性值的方法

主要介绍了Vue用v-for给循环标签自身属性添加属性值的方法,文中大家给大家列举了三种方法 ,需要的朋友可以参考下
recommend-type

解决vue的 v-for 循环中图片加载路径问题

今天小编就为大家分享一篇解决vue的 v-for 循环中图片加载路径问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

使用Vue中 v-for循环列表控制按钮隐藏显示功能

主要介绍了使用Vue中 v-for循环列表控制按钮隐藏显示功能,需要的朋友可以参考下
recommend-type

vue基础之data存储数据及v-for循环用法示例

本文实例讲述了vue data存储数据及v-for循环用法。分享给大家供大家参考,具体如下: vue data里面存储数据 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt...
recommend-type

Vue中v-for的数据分组实例

使用Vue.js可以很方便的实现数据的绑定和更新,有时需要对一个一维数组进行分组以方便显示,循环可以直接使用v-for,那分组呢?这里需要用到vue的computed特性,将数据动态计算分组。 代码如下: &lt;!DOCTYPE ...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。