实时

您的位置:首页>企业 >

卡片放大播放效果实现总结,不同元素间的放大过渡效果如何实现?

背景


(资料图)

最近一段时间做了几个需求,其中涉及的素材列表展示,需要实现类似下方图片中的动效,暂且称之为【卡片放大播放动效】,具体细节如下:

初始展示的是封面图片,鼠标经过时是视频放大的效果;下方文字内容区域,在放大前后展示的内容不同,而且两者的字体大小是一致的,不是简单的放大实现;四五个页面都需要实现相同列表效果,列表的行数和列数是不一致的;
image
遇到的四个问题

在整个实现过程中,遇到以下四个问题,后面的解析中会有对应解答。

不同元素间的放大过渡效果如何实现?抽离为通用性组件时,如何实现类vue中的具名插槽效果,来替换下方文字信息区域?不同页面中的列表区域宽度不同,有的页面列表还是弹性宽度,常用的flex布局无法满足要求,如何实现呢?边界卡片放大后,如何避免被父级列表容器overflow:hidden`隐藏掉?实现解析

这个动效,在爱奇艺官网也有类似效果,爱奇艺官网是通过生成初始状态卡片列表和鼠标放大卡片列表两套列表,然后通过动态计算放大卡片位置,相对于body进行绝对定位展示的。

本实现方案通过将卡片初始状态和放大状态,封装到一个组件中,通过两者间的相对关系,利用css自动完成对应关系,避免了大量的JS计算。

1. 放大效果实现

UI对该动效的要求实际就是鼠标视频放大播放,如果卡片初始状态也放置视频video,通过transition对同一元素进行scale放大也可以实现,但是这是一个列表,用户进入页面,就会同时加载多个视频,用户体验不是很好。

所以,实现方案就是卡片初始状态放置poster图片,鼠标经过时,在poster上方展示视频层(绝对定位),然后对视频执行animation动画来模拟放大效果。

卡片底部文字区域如何处理?

由于卡片初始状态下,底部文字区域在列表布局中是占位的,所以在卡片初始状态下,底部文字区域使用正常文档流。

卡片鼠标经过状态下,视频层的放大效果是以poster中心点为放大原点的,所以底部文字区域使用absolute定位,相对于player进行定位处理。

interfaceIItemData{src?:string;poster?:string;industry?:string;}interfaceIProps{posterClass:string;//poster区域宽高playerClass:string;//放大后视频宽高样式itemData:IItemData;children:{[key:string]:any};}lett:NodeJS.Timeout;constVideoItem:FC=({posterClass,playerClass,itemData,children,})=>{const[isHover,setIsHover]=useState(false);constonMouseEnter=()=>{t=setTimeout(()=>{//避免快速移动鼠标,造成视频无法隐藏问题setIsHover(true);},50);};constonMouseLeave=()=>{clearTimeout(t);setIsHover(false);};return(Top1
{isHover?({children?.playerBottom}
):null}
{children?.posterBottom});};exportdefaultVideoItem;

.container{position:relative;.poster{position:relative;background-position:center;background-size:cover;background-repeat:no-repeat;.player{z-index:10;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(0.929);animation:showPlayer0.2sease;animation-fill-mode:forwards;.playerBottom{width:100%;position:absolute;top:100%;left:0;box-shadow:0px6px16px-8pxrgba(0,0,0,0.08),0px12px48px16pxrgba(0,0,0,0.03);filter:drop-shadow(0px9px28pxrgba(0,0,0,0.05));}}}.posterBottom{width:100%;}}@keyframesshowPlayer{0%{transform:translate(-50%,-50%)scale(0.929);}100%{transform:translate(-50%,-50%)scale(1);}}

2. 抽离为通用组件时,卡片底部文字区域如何动态替换

整个卡片组件,底部的文字区域在不同的场景下可能是不同的,所以作为通用性组件,需要将这部分抽离,支持动态替换。

vue中最简单的方式,就是插槽,通过插槽从外部动态传入。但是react框架是不支持具名插槽的。所以,这个问题就转换成了,react如何实现具名插槽?

网上搜到了一种实现方式,通过传入一个object来实现,具体效果如下:

//cardList{{posterBottom:bottomInfo,playerBottom:bottomInfo,onClickPlayer:()=>{consturl=`${window.location.origin}/#/market/service/${item.itemId}`;window.open(url,"_blank");},}}//VideoItem{props.children?.playerBottom}{props.children?.posterBottom}

当然,具名插槽还有其它的实现方式,后面会专门写一篇文章总结学习下。

3. 列表容器如果是弹性布局时,每行的列数无法固定,flex布局无法满足

这个问题是一个通用性问题,在容器宽度不固定时,flex布局,每行最后一个元素无法选中设置样式,同时子元素个数不固定时,最后一行元素的间距会变大。

这种情况下,就需要grid布局大显身手了,以前很少用grid布局,这次也是学习到了,具体效果如下图:

在示例中,调整浏览器窗口大小,来实验弹性布局观看效果代码片段

image.png
4. 卡片放大后,可能会被容器设置的overflow:hidden给遮盖隐藏掉

目前放大效果的实现方式,放大的视频层是绝对定位的,参照物是每个卡片本身。所以在四周边界处的卡片,放大后,很容易被容器给遮盖。

处理方式也很简单,给容器多设置一些padding,让放大部分足够展示,然后用margin设置负值来调整布局

.container{margin-left:-20px;margin-right:-20px;padding-left:20px;padding-right:20px;}

总结

每个产品需求里,可能都会隐藏着自己的盲点,将效果做到极致,就能获得技术成长。在重复的需求里,多反思总结,寻找自己的提升点,这就是进步吧啊。

相关推荐

1.CSS 实现按钮点击动效的套路

2.年份数字拼图效果

3.跑马灯简单版

4.中心点靠近动画解析

关键词: 初始状态 绝对定位 这个问题

推荐阅读
背景最近一段时间做了几个需求,其中涉及的素材列表展示,需要实现类似下方图片中的动效,暂且称之为【卡片放大播放动效】,具体细节如下:初

2023-01-11 14:20:16

(本网记者张文莉)随着春节的脚步越来越近,“返乡潮”叠加疫情新挑战,贵阳贵安的农村疫情防控压力增大。贵阳市各地积极行动

2023-01-11 09:08:45

评论你曾经爱我的句子精选120句1 你就是天空中那颗最大最亮的大星星,整个星空因为有你的陪伴而变的那么明亮。而我就是那颗不起眼的小星星,那

2023-01-11 00:17:24

1月9日,中央广播电视总台《2023年春节联欢晚会》完成第三次彩排。以节目群为单元的结构方式让晚会的整体气息和情感表达日渐凸显。在“欢乐吉

2023-01-10 18:47:07

天眼查App显示,近日,南京金晟材料科技有限公司成立,法定代表人为邵仁志,注册资本约7119万人民币,经营范围包括民用航空器零部件设计和生产

2023-01-10 15:48:12

爱旭股份:爱旭股份关于非公开发行股票发行结果暨股份变动公告

2023-01-10 13:28:22

1、有固定收入的,抚育费一般可按其月总收入的百分之二十至三十的比例给付。负担两个以上子女抚育费的,比例可适当提高,但一般不得超过月总收

2023-01-10 12:50:41

每经AI快讯,有投资者在投资者互动平台提问:张先生你好!贵公司是否有参与旅游板块投资,或者我们的应用是否有服务旅游公司!未来贵公司是否

2023-01-10 12:45:21

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可

2023-01-10 12:24:59

1、车辆行驶证原件或复印件;2、车辆驾驶人驾驶证原件;3、车辆驾驶人身份证原件;4、现金和银行卡。交通违章定义:交通违章是违反交通管理的行为

2023-01-10 11:58:26

3换2!勇士报价雷迪什,筹码诚意十足,雷迪什,勇士队,勇士,纽约尼克斯队,兰姆,施泰因

2023-01-09 17:38:45

林鹏辉是福建省森林消防总队龙岩支队漳州大队六中队的一名预备消防士,2021年7月毕业于福建集美大学民族传统体育系。大学期间,林鹏辉通过从小

2023-01-09 17:41:24

奈飞著名的玛丽苏剧《艾米丽在巴黎》(EmilyinParis)第三季刚播完。正好节日期间没太多美剧可看,用这种不怎么需要动脑子的浪漫喜剧来杀时间还

2023-01-09 17:26:37

乐居财经严明会1月9日,福斯达(603173 SH)发布首次公开发行股票发行公告公告,确定本次发行价格为18 65元 股,对应的摊薄后静态市盈率为22 9

2023-01-09 13:57:57

网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天后上报给征信机构,因为有些借贷机构可

2023-01-09 13:07:31

东方电热接受机构调研时表示,公司2022年业绩预告的净利润中值在3亿元,根据财务部门的初步统计,其中新能源装备制造业务贡献约2-2 2亿元,新

2023-01-09 10:47:03

此前的处罚公告显示,承德露露在公司治理方面,存在“独立性存在缺陷”“内幕信息知情人管理不规范”“投资者关系管理不规范”等

2023-01-07 01:38:19

读创 深圳商报驻穗记者姚嘉莉通讯员粤交集宣岳路建刘海浪杜加兵1月5日,广东省交通集团发布消息,随着最后

2023-01-06 23:04:01

高端制造装备核心部件产品提供商合肥埃科光电科技股份有限公司(以下简称为“埃科光电”)即将首发上会。埃科光电从事工业机器视觉成像部件产

2023-01-06 20:41:19

2023年1月5日万年青融资净买入38 7万元,融资余额3 24亿元

2023-01-06 18:24:56