当前位置: 首页 > 科技观察

超酷的转场动画?CSS轻松搞定!_0

时间:2023-03-21 15:59:28 科技观察

在WeGame[1]的PC端官网首页,有很多基于滚动的制作精良的动画效果。这里我简单截取两个比较有意思的转场动画给大家感受一下。转场动画1:转场动画2:是不是很有趣?整个动画的连接是基于滚轮的滚动来触发的。我的猜测是使用了类似于TweenMaxJS[2]的动画库。当然,这两个很酷很有趣的过渡动画,可以根据最新的CSS@scroll-timeline规范大致实现。本文将尝试使用纯CSS来模拟以上两种转场动画。当然,关于最新的CSS@scroll-timeline规范,如果你还没有详细看过,可以先看看我的文章。来了,终于来了,动画杀手@scroll-timeline[3]。转场动画1首先我们来看一下这个动画:核心步骤拆解:在场景1中,然后借助WeGame的LOGO,LOGO开始放大,当LOGO放大到一定程度时,开始淡出,LOGO后面的场景2逐渐淡入。LOGOFinder淡出,场景2完全出现。这里要实现整个动画,有一个很重要的场景,就是要能够使用LOGO元素,切掉背景,只看到LOGO后面的元素,比如得到一张这样的图:注意白色图片的一部分不是白色的,而是需要透明的,能够显示背后的元素。当然,我们可以让UI裁剪出这样的图片,但毕竟太麻烦了。假设我们只有一个LOGO元素:怎么用这个LOGO来切背景呢?Cutbackgroundwithmask和mask-composite是的,我们可以在这里使用mask。我们来试试看:

div{background:linear-gradient(-75deg,#715633,#2b2522);}假设我们有这样一个背景:我们以LOGO图作为MASK进行Cut:div{背景:线性渐变(-75deg,#715633,#2b2522);mask:url(WeGame-LOGO图片.png);掩码重复:不重复;mask-position:centercenter;}我们会得到这样一张图:哦不,这和我们想象的刚好相反。我们要的是LOGO是透明的,其余的背景保留。怎么做?不要慌,这里可以使用我们上一篇文章介绍的-webkit-mask-composite。不太了解的可以点此查看:高级裁剪技巧!基于单幅图??像的任意颜色变换[4]。我们简单修改一下代码:div{background:linear-gradient(-75deg,#715633,#2b2522);mask:url(//wegame.gtimg.com/g.55555-r.c4663/wegame-home/sc01-logo.52fe03c4.svg),线性渐变(#fff,#fff);掩码重复:不重复;遮罩位置:中心中心;-webkit-mask-composite:xor;}这样,我们就可以成功得到这样的图形:当然,这里需要注意的是白色区域不是白色的,而是透明的,可以显露出后面的内容.配合@scroll-timeline就好了。这样,在上面的裁剪层的基础上,再配合@scroll-timeline,我们来模拟一个基本的动画效果:
.g-scroll{位置:相对;宽度:100vw;高度:500vh;}.g-wrap{位置:固定;顶部:0;左:0;宽度:100vw;高度:100vh;溢出:隐藏;}.g-容器{位置:绝对;顶部:0;左:0;宽度:100vw;高度:100vh;动画名称:比例;动画持续时间:10s;animation-timeline:box-move;}.g-bg{position:fixed;宽度:100vw;高度:100vh;background:url(LOGO后面的图层);}.g-wegame{position:absolute;宽度:100vw;高度:100vh;背景:线性渐变(-75deg,#715633,#2b2522);面具:网址(//wegame.gtimg.com/g.55555-r.c4663/wegame-home/sc01-logo.52fe03c4.svg),线性渐变(#fff,#fff);掩码重复:不重复;遮罩位置:中心中心;-webkit-mask-composite:xor;}@scroll-timelinebox-move{source:selector("#g-scroll");方向:“垂直”;}@keyframesscale{0%{transform:scale(1);}100%{转换:比例(60);}}到这里,想看懂上面的代码,你肯定已经掌握了基本的CSS@scroll-timeline语法以及剩下的内容,我简单说明一下:我们用.g-bg用一张图片来表示场景2在LOGO后面的图层中。#g-scroll用于基于滚动条的滚动,实现滚动动画。在.g-wegame内部是使用mask和mask-composite实现的上述层。好了,此时,当我们向下滚动动画时,就会触发.g-container的动画,即从transform:scale(1)到transform:scale(60),我们看看效果:有点像那样。但是,这里缺少一些细节。首先,我们需要有一个LOGO。它的透明度从1逐渐变淡到0,这个比较简单。添加后我们看一下效果:离目标又近了一步,但是仔细观察原效果,还是少了一层:在LOGO淡出的过程中,后面的背景不是直接呈现,但有一个淡出的过程。所以,为了完整起见,动画过程一共有4层:所以,完整的代码大概是这样的:.g-scroll{位置:相对;宽度:100vw;高度:500vh;}.g-wrap{位置:固定;顶部:0;左:0;宽度:100vw;高度:100vh;溢出:隐藏;}.g-容器{位置:绝对;顶部:0;左:0;宽度:100vw;高度:100vh;动画名称:比例;动画持续时间:10s;animation-timeline:box-move;}.g-bg{position:fixed;宽度:100vw;高度:100vh;background:url(//背景图片,场景2);}.g-wegame{position:absolute;宽度:100vw;高度:100vh;背景:线性渐变(-75deg,#715633,#2b2522);掩码:网址(//WeGame-Logo.png),线性渐变(#fff,#fff);掩码重复:不重复;遮罩位置:中心中心;-webkit-mask-composite:xor;z-index:1;}.g-mask{position:aboslute;宽度:100vw;高度:100vh;背景:线性渐变(-75deg,#715633,#2b2522);z-指数:2;动画名称:reOpacityChange;动画持续时间:10s;动画时间轴:框移动;animation-function-timing:linear;}.g-logo{position:absolute;背景:url(//WeGame-Logo.png);背景重复:不重复;背景位置:中心中心;z-指数:3;动画名称:reOpacityChange;动画持续时间:10s;animation-timeline:box-move;}@scroll-timelinebox-move{source:selector("#g-scroll");方向:“垂直”;}@keyframesreOpacityChange{0%,50%{不透明度:1;}100%{不透明度:0;}}@keyframesscale{0%{transform:scale(1);}100%{吨变换:规模(60);}}这样,我们就可以基本还原出原来的效果了:完整代码,可以点这里:CodePenDemo-WeGameAnimationDemo[5]过渡动画两个不错,弄一个,我们继续看下一个:这里,我们也简单拆解动画:数字放大,逐渐带出场景2。场景2有一个非常酷的捏合效果。这里的数字放大其实和第一个转场动画很像,就不赘述了。我们来看看场景2中如何实现光影收缩效果,这里看似负责,其实很简单。这里,核心就在于这两张图:图片素材1:注意这里最重要的是图片中的白色不是白色,而是透明的,可以显露背景的内容。这样,我们只需要在这张图后面再放一张图:你想到了吗?没错,就是让这张图从一个比较大的transform:scale()值变成一个比较小的transform:scale()值!这意味着什么?看这张图你就明白了:知道了这些,整个动画就比较简单了。当然这里我们也使用CSS@scroll-timeline来完成整个动画:30.g-scroll{位置:相对;宽度:100vw;高度:500vh;}.g-容器{位置:固定;顶部:0;左:0;宽度:100vw;高度:100vh;绝对;顶部:0;左:0;宽度:100%;高度:100%;背景:url(//蜂巢图片.png);z-index:1;}.g-circle{位置:绝对;顶部:50%;左:50%;变换:平移(-50%,-50%)比例(.5);宽度:400px;高度:400px;背景:url(//光圈图像.png);动画名称:比例;动画持续时间:10s;animation-timeline:box-move;}.g-word{position:absolute;顶部:50%;左:50%;转换:翻译(-50%,-50%);-尺寸:12vw;z-指数:10;颜色:透明;背景:线性渐变(#f8a011,#ffd973);背景剪辑:文本;动画名称:scaleWord;动画持续时间:10s;animation-timeline:box-move;}@scroll-timelinebox-move{source:selector("#g-scroll");方向:“垂直”;}@keyframesscale{0%{transform:translate(-50%,-50%)scale(10);}100%{变换:平移(-50%,-50%)比例(.5);}}@keyframesscaleWord{0%{transform:translate(-50%,-50%)scale(.5);}100%{transform:translate(calc(-50%-5000px),-50%)scale(100);}}整个动画需要看懂,但其实效果还是需要有一定的基础:完整代码,可以戳这里:CodePenDemo-WeGameAnimationDemo[6]。就这样,借助强大的CSS和一些有趣的技巧,我们用纯CSS实现了这两个看似很负责的转场动画效果,而这在以前用纯CSS是完全不可能实现的。最后,本文到此结束,希望对您有所帮助:)参考资料[1]WeGame:https://www.wegame.com.cn/client/。[2]TweenMaxJS:https://www.tweenmax.com.cn/index.html。[3]来了,终于来了,动画杀手@scroll-timeline:https://github.com/chokcoco/iCSS/issues/166。[4]进阶切割技巧!基于单张图片的任意颜色转换:https://github.com/chokcoco/iCSS/issues/189。[5]CodePenDemo——WeGame动画演示:https://codepen.io/Chokcoco/pen/mdxVYGm。[6]CodePenDemo——WeGame动画演示:https://codepen.io/Chokcoco/pen/mdxeKpM。[7]Github——iCSS:https://github.com/chokcoco/iCSS。