背景
最近一段时间做了几个需求,其中涉及的素材列表展示,需要实现类似下方图片中的动效,暂且称之为【卡片放大播放动效】,具体细节如下:
初始展示的是封面图片,鼠标经过时是视频放大的效果;下方文字内容区域,在放大前后展示的内容不同,而且两者的字体大小是一致的,不是简单的放大实现;四五个页面都需要实现相同列表效果,列表的行数和列数是不一致的;遇到的四个问题在整个实现过程中,遇到以下四个问题,后面的解析中会有对应解答。
(相关资料图)
不同元素间的放大过渡效果如何实现?抽离为通用性组件时,如何实现类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
.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布局,这次也是学习到了,具体效果如下图:
在示例中,调整浏览器窗口大小,来实验弹性布局观看效果代码片段
4. 卡片放大后,可能会被容器设置的overflow:hidden给遮盖隐藏掉目前放大效果的实现方式,放大的视频层是绝对定位的,参照物是每个卡片本身。所以在四周边界处的卡片,放大后,很容易被容器给遮盖。
处理方式也很简单,给容器多设置一些padding,让放大部分足够展示,然后用margin设置负值来调整布局
.container{margin-left:-20px;margin-right:-20px;padding-left:20px;padding-right:20px;}总结
每个产品需求里,可能都会隐藏着自己的盲点,将效果做到极致,就能获得技术成长。在重复的需求里,多反思总结,寻找自己的提升点,这就是进步吧啊。
相关推荐1.CSS 实现按钮点击动效的套路
2.年份数字拼图效果
3.跑马灯简单版
4.中心点靠近动画解析
1月9日,中南大学湘雅医院神经内科主任医师夏健在给患者提供诊疗服务。(受访者供图)新华社长沙1月10日电中风患者(脑血管
背景最近一段时间做了几个需求,其中涉及的素材列表展示,需要实现类似下方图片中的动效,暂且称之为【卡片放大播放动效】,具体细节如下:初
但是随着长时间使用,家电里的灰尘、细菌、异味都影响了使用感。长久使用后的微波炉,内壁的油渍油垢清理让人烦恼不已。现金陵晚报旗下服务网
重庆玛雅海滩水公园开园时间:2021年6月13日地址:重庆市两江新区礼嘉镇金渝大道29号开放时间:10:30~18:30★最新优惠门票1、水乐园早鸟票门票价格:
玉米或许是粮食中最平平无奇的一种,生活中无处不在。而玉米糊更是很多人儿时的记忆,老少皆宜。如今,因润肠通便、健胃和中、有助降低胆固醇
(徐婧杜燕)记者5日从北京市大兴区获悉,截至2022年底,北京中日创新合作示范区(简称“中日示范区”)累计新增注册主体1973家,其中外资企业62家
中国质量新闻网讯近日,江苏省泰州市市场监管局公示2022年第十七期食品安全监督抽检结果,涉及70批次糕点监督抽检合格信
(1)与律师所在的律师事务所签订律师服务合同;(2)根据律师服务合同的约定向律师事务所支付律师费,并由律师事务所出具税务发票;(3)根据
上周五空仓说过了,那是因为个股集体跌停和大跌洗盘,根据事不过三的原则,洗盘最多3天,所以今天早上就抄底入场了,因为好股都是早上涨的,最
证券时报e公司讯,摘要:两部门:2023年对月销售额10万元以下的增值税小规模纳税人免征增值税。央行上海总部:推动上海房地产市场平稳健康发展
借款诉讼时效:(1)约定了还款期限的借款,诉讼时效从还款期限届满的次日起计算满3年;(2)没有约定还款期的借款:根据相关法律规定,对于借款期
中商情报网讯:最新数据显示:1月8日,全国粳米当日均价为5 22元 公斤,籼米当日均价为4 88元 公斤。其中,粳米价格
1、车辆行驶证原件或复印件;2、车辆驾驶人驾驶证原件;3、车辆驾驶人身份证原件;4、现金和银行卡。交通违章行为在事故发生中所起作用的大小,主
春节不打烊,顺丰发四亿元补贴员工。出品|电商行业作者|航叔顺丰快递春节不打烊春节将至,顺丰又有大动作。日前,顺丰宣布今年将持续保障春节
核心阅读围绕重点产业,青海西宁推行“链长制+包保制”,以精准招商和靠前服务,为企业提供全方位保障,助力企业生产更稳、产业链条更强。...
1、客户下了订单后,客服的后台会有通知,接到通知后,客服会记录下来客户的联系方式及地址,以及客人订购的商品。2、整理好了客人订购的商品
格隆汇1月5日丨雷柏科技公布,公司控股股东香港热键于2022年12月14日至2023年01月04日期间通过集中竞价交易的方式累计减持公司无限售流通股282
1000克面粉。1 将牛里脊剁成牛肉末,备用,芹菜用开水里焯一下,切成芹菜末备用。将牛肉末、芹菜末、酱油、鸡蛋清和牛肉味浓汤宝放在搅拌盆里
点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤离离原上草,一岁一枯荣。大家好...
证券代码:002221证券简称:东华能源公告编号:2023-001东华能源股份有限公司第六届董事会第十一次会议决议公
即将和2022年挥手告别,回顾这一年的投资历程,有得有失,还算满意。总体小亏损,正所谓知足常乐,那就展望迎接2023年吧。坚定看好大金融和制
为了帮助市民综合评估身体恢复情况,排查健康隐患,目前已有多家知名医院及连锁品牌体检机构推出新冠康复专项体检服务,对呼吸系统、消化系统
大家好我是小雷,今天跟大家聊聊家里面的衣柜定制好,还是自己买板材请木工做好,相信这个也是大部分朋友在装修的时候最纠结的一个问题,今天
在娱乐圈有各种各样的榜单,不过其中也有很多属于是“野鸡”榜单,没有什么权威性。当然也有一些榜单是大家评选出来的,大家都比较认可。而...
阳光乳业(001318)01月05日在投资者关系平台上答复了投资者关心的问题。
点击蓝字关注南方财经报道导读:1月3日,A股迎来了2023年的首个交易日。在交易日当天,A股走出震荡回升的态势,202
来源:宝城期货作者:宝城期货研报正文核心观点:【PTA】今日(1月3日)PTA主力合约PTA2305最终收盘于5530元 吨,较上一交易日收盘价下跌10元 吨,
未来一周气温回升雾霾重森林火险等级升高
你已选中了添加链接的内容2023 1 2第151期本期关键字Bitkeep应用为官方正版资产仍然被盗;全球主要央行在2022年累计加息2700个基点;做慈善远
Copyright © 2015-2022 时代服装网版权所有 备案号: 联系邮箱: 514 676 113@qq.com