WeGame 的 PC 端官网首页,有着非常多制作精良的基于滚动的动画效果。

这里我简单截取其中 2 个比较有意思的转场动画,大家感受感受。转场动画 1:

转场动画 2:

是不是挺有意思的,整个动画的衔接是基于滚轮的滚动触发的。我猜测是使用了类似 TweenMaxJS 的动画库实现。

当然,这两处酷炫有意思的转场动画,基于最新的 CSS @scroll-timeline 规范,也是可以大致实现的。本文就将尝试使用纯 CSS,模拟上述的两个转场动画。

当然,关于 CSS 最新的 CSS @scroll-timeline 规范,如果你还没有详细了解过,可以先看看我的这篇文章 来了来了,它终于来了,动画杀手锏 @scroll-timeline

转场动画一

首先,我们来看看这个动画:

核心步骤拆解一下:

  1. 处于场景 1,接着借助 WeGame 的 LOGO,LOGO 开始放大
  2. LOGO 放大到一定程度,开始渐隐,LOGO 背后的场景 2 逐渐渐现
  3. LOGO 放大且渐隐消失,场景 2 完全出现

这里,要实现整个动画,有一个非常重要的场景,就是能够利用 LOGO 元素,切割背景,只看到 LOGO 背后的元素,像是得到一张这样的图片:

注意,图片的白色部分,不是白色,而是需要透明,能够透出背后的元素

当然,我们可以让 UI 切一张这样的图出来,但是毕竟太麻烦了。

假设我们只有一张 LOGO 元素:

我们如何能够借助这个 LOGO,切割背景呢?

借助 mask 及 mask-composite 切割背景

是的,这里我们可以使用 mask。我们来尝试一下:

  1. <div></div>
  1. div {
  2. background: linear-gradient(-75deg, #715633, #2b2522);
  3. }

假设我们有这样一张背景:

我们使用 LOGO 图作为 MASK,对该背景进行切割:

  1. div {
  2. background: linear-gradient(-75deg, #715633, #2b2522);
  3. mask: url(WeGame-LOGO图.png);
  4. mask-repeat: no-repeat;
  5. mask-position: center center;
  6. }

我们会得到这样一张图:

Oh No,这与我们想象的刚好相反,我们要的是 LOGO 处透明,背景的其他处保留

怎么做呢?不要慌,这里可以使用上我们上一篇文章介绍过的 -webkit-mask-composite,还不太了解的可以戳这里看看:高阶切图技巧!基于单张图片的任意颜色转换

我们简单改造一下代码:

  1. div {
  2. background: linear-gradient(-75deg, #715633, #2b2522);
  3. mask: url(//wegame.gtimg.com/g.55555-r.c4663/wegame-home/sc01-logo.52fe03c4.svg), linear-gradient(#fff, #fff);
  4. mask-repeat: no-repeat;
  5. mask-position: center center;
  6. -webkit-mask-composite: xor;
  7. }

这样,我们能就顺利的得到了这样一张图形:

配合 @scroll-timeline

好,如此一来,基于上述的剪切层,再配合 @scroll-timeline,我们来模拟一个最基本的动画效果:

  1. <div class="g-scroll" id="g-scroll"></div>
  2. <div class="g-wrap">
  3. <div class="g-bg"></div>
  4. <div class="g-container">
  5. <div class="g-wegame"></div>
  6. </div>
  7. </div>
  1. .g-scroll {
  2. position: relative;
  3. width: 100vw;
  4. height: 500vh;
  5. }
  6. .g-wrap {
  7. position: fixed;
  8. top: 0;
  9. left: 0;
  10. width: 100vw;
  11. height: 100vh;
  12. overflow: hidden;
  13. }
  14. .g-container {
  15. position: absolute;
  16. top: 0;
  17. left: 0;
  18. width: 100vw;
  19. height: 100vh;
  20. animation-name: scale;
  21. animation-duration: 10s;
  22. animation-timeline: box-move;
  23. }
  24. .g-bg {
  25. position: fixed;
  26. width: 100vw;
  27. height: 100vh;
  28. background: url(LOGO背后的图层);
  29. }
  30. .g-wegame {
  31. position: absolute;
  32. width: 100vw;
  33. height: 100vh;
  34. background: linear-gradient(-75deg, #715633, #2b2522);
  35. mask: url(//wegame.gtimg.com/g.55555-r.c4663/wegame-home/sc01-logo.52fe03c4.svg), linear-gradient(#fff, #fff);
  36. mask-repeat: no-repeat;
  37. mask-position: center center;
  38. -webkit-mask-composite: xor;
  39. }
  40. @scroll-timeline box-move {
  41. source: selector("#g-scroll");
  42. orientation: "vertical";
  43. }
  44. @keyframes scale {
  45. 0% {
  46. transform: scale(1);
  47. }
  48. 100% {
  49. transform: scale(60);
  50. }
  51. }

这里,想要看懂上述代码,你必须已经掌握了基本的 CSS @scroll-timeline 语法。其余的内容,简单解释下:

  1. 我们在 LOGO 后面的图层,用 .g-bg 使用一张图片表示了场景 2
  2. #g-scroll 用于基于滚动条的滚动,实现滚动动画
  3. .g-wegame 里面就是上述使用 maskmask-composite 实现的图层

好,此时,我们向下滚动动画,就会触发 .g-container 的动画,也就是从 transform: scale(1)transform: scale(60),我们来看看效果:

有点那个意思了。但是,这里还缺少了一些细节

首先我们需要有一个 LOGO,它的透明度从 1 逐渐渐隐到 0,这个比较简单,加完之后,我们看看效果:

离目标又近了一步,但是,仔细观察原效果,我们还少了一层:

在 LOGO 渐隐的过程中,背后的背景不是直接呈现的,而是有一个渐现的过程。所以,完整而言,在动画过程从,一共会有 4 层:

所以,完整的代码,大概是这样的:

  1. <div class="g-scroll" id="g-scroll"></div>
  2. <div class="g-wrap">
  3. <div class="g-bg"></div>
  4. <div class="g-container">
  5. <div class="g-wegame"></div>
  6. <div class="g-mask"></div>
  7. <div class="g-logo"></div>
  8. </div>
  9. </div>
  1. .g-scroll {
  2. position: relative;
  3. width: 100vw;
  4. height: 500vh;
  5. }
  6. .g-wrap {
  7. position: fixed;
  8. top: 0;
  9. left: 0;
  10. width: 100vw;
  11. height: 100vh;
  12. overflow: hidden;
  13. }
  14. .g-container {
  15. position: absolute;
  16. top: 0;
  17. left: 0;
  18. width: 100vw;
  19. height: 100vh;
  20. animation-name: scale;
  21. animation-duration: 10s;
  22. animation-timeline: box-move;
  23. }
  24. .g-bg {
  25. position: fixed;
  26. width: 100vw;
  27. height: 100vh;
  28. background: url(//背景图片,场景2);
  29. }
  30. .g-wegame {
  31. position: absolute;
  32. width: 100vw;
  33. height: 100vh;
  34. background: linear-gradient(-75deg, #715633, #2b2522);
  35. mask: url(//WeGame-Logo.png), linear-gradient(#fff, #fff);
  36. mask-repeat: no-repeat;
  37. mask-position: center center;
  38. -webkit-mask-composite: xor;
  39. z-index: 1;
  40. }
  41. .g-mask {
  42. position: aboslute;
  43. width: 100vw;
  44. height: 100vh;
  45. background: linear-gradient(-75deg, #715633, #2b2522);
  46. z-index: 2;
  47. animation-name: reOpacityChange;
  48. animation-duration: 10s;
  49. animation-timeline: box-move;
  50. animation-function-timing: linear;
  51. }
  52. .g-logo {
  53. position: absolute;
  54. background: url(//WeGame-Logo.png);
  55. background-repeat: no-repeat;
  56. background-position: center center;
  57. z-index: 3;
  58. animation-name: reOpacityChange;
  59. animation-duration: 10s;
  60. animation-timeline: box-move;
  61. }
  62. @scroll-timeline box-move {
  63. source: selector("#g-scroll");
  64. orientation: "vertical";
  65. }
  66. @keyframes reOpacityChange {
  67. 0%,
  68. 50% {
  69. opacity: 1;
  70. }
  71. 100% {
  72. opacity: 0;
  73. }
  74. }
  75. @keyframes scale {
  76. 0% {
  77. transform: scale(1);
  78. }
  79. 100% {
  80. transform: scale(60);
  81. }
  82. }

这样,我们就基本能够还原原效果了:

完整的代码,你可以戳这里:CodePen Demo - WeGame Animation Demo

转场动画二

好,搞定了一个,我们继续来看下一个:

这里,我们也简单拆解下动画:

  1. 数字放大,逐渐带出场景 2
  2. 场景 2 有一个非常酷炫的光影收缩效果

这里的数字放大与第一个转场动画其实非常类似,就不详细讲了。

我们来看看,在场景 2 这里,光影的收缩效果如何实现

这里看似复杂,但是,其实非常的简单。这里,核心在于这两张图片:

图片素材 1:

注意,这里最为核心的在于,图片中的白色不是白色,是透明的,可以透出背景的内容。

这样,我们只需要在这张图片的背后,放置另外这样一张图片:

想到了吗?没错,就是让这张图片从一个较大的 transform: scale() 值,变化到一个较小的 transform: scale() 值即可!

知道了解到这一点,整个动画也就比较简单了。当然,这里我们也同样借助了 CSS @scroll-timeline 完成整个动画:

  1. <div class="g-scroll" id="g-scroll"></div>
  2. <div class="g-container">
  3. <div class="g-bg"></div>
  4. <div class="g-circle"></div>
  5. <div class="g-word">30</div>
  6. </div>
  1. .g-scroll {
  2. position: relative;
  3. width: 100vw;
  4. height: 500vh;
  5. }
  6. .g-container {
  7. position: fixed;
  8. top: 0;
  9. left: 0;
  10. width: 100vw;
  11. height: 100vh;
  12. overflow: hidden;
  13. }
  14. .g-bg {
  15. position: absolute;
  16. top: 0;
  17. left: 0;
  18. width: 100%;
  19. height: 100%;
  20. background: url(//蜂巢图片.png);
  21. z-index: 1;
  22. }
  23. .g-circle {
  24. position: absolute;
  25. top: 50%;
  26. left: 50%;
  27. transform: translate(-50%, -50%) scale(.5);
  28. width: 400px;
  29. height: 400px;
  30. background: url(//光圈图片.png);
  31. animation-name: scale;
  32. animation-duration: 10s;
  33. animation-timeline: box-move;
  34. }
  35. .g-word {
  36. position: absolute;
  37. top: 50%;
  38. left: 50%;
  39. transform: translate(-50%, -50%);
  40. font-size: 12vw;
  41. z-index: 10;
  42. color: transparent;
  43. background: linear-gradient(#f8a011, #ffd973);
  44. background-clip: text;
  45. animation-name: scaleWord;
  46. animation-duration: 10s;
  47. animation-timeline: box-move;
  48. }
  49. @scroll-timeline box-move {
  50. source: selector("#g-scroll");
  51. orientation: "vertical";
  52. }
  53. @keyframes scale {
  54. 0% {
  55. transform: translate(-50%, -50%) scale(10);
  56. }
  57. 100% {
  58. transform: translate(-50%, -50%) scale(.5);
  59. }
  60. }
  61. @keyframes scaleWord {
  62. 0% {
  63. transform: translate(-50%, -50%) scale(.5);
  64. }
  65. 100% {
  66. transform: translate(calc(-50% - 5000px), -50%) scale(100);
  67. }
  68. }

整个动画需要看懂,其实还是要有一定的功底的。上效果:

完整的代码,你可以戳这里:CodePen Demo - WeGame Animation Demo

这样,借助强大的 CSS 以及一些有意思的技巧,我们利用纯 CSS 实现了这两个看似非常负责的转场动画效果,并且,这在之前,是完全不可能使用纯 CSS 实现的

最后

本文到此结束,希望对你有帮助

更多精彩 CSS 技术文章汇总在我的 Github -- iCSS ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

超酷炫的转场动画?CSS 轻松拿下!的更多相关文章

  1. TensorSpace:超酷炫3D神经网络可视化框架

    TensorSpace:超酷炫3D神经网络可视化框架 TensorSpace - 一款 3D 模型可视化框架,支持多种模型,帮助你可视化层间输出,更直观地展示模型的输入输出,帮助理解模型结构和输出方法 ...

  2. android 新闻应用、Xposed模块、酷炫的加载动画、下载模块、九宫格控件等源码

    Android精选源码 灵活的ShadowView,可替代CardView使用 基于Tesseract-OCR实现自动扫描识别手机号 Android播放界面仿QQ音乐开源音乐播放器 新闻应用项目采用了 ...

  3. 使用纯 CSS 实现超酷炫的粘性气泡效果

    最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...

  4. 8款超酷的HTML5 3D图片动画源码

    1.HTML5移动端图片左右切换动画 今天要给大家分享一款很不错的图片左右切换焦点图动画,并且支持移动端触摸滑动.功能上,这款HTML5图片播放器支持鼠标滑动.手机端触摸滑动以及自动播放.外观上,这款 ...

  5. Android酷炫加载进度动画

    概述 本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进 ...

  6. 超酷!纯CSS3烧烤动画实现教程

    今天在老外的网站上看到一款很有创意的纯CSS3动画,是模拟烧烤活动的.款动画模拟了一个烧烤架,烧烤架上的食物也都是用纯CSS3绘制而成,没有用一张图片,效果相当逼真.另外一个有意思的是,这个CSS3烧 ...

  7. photoshop打造超酷炫火焰人像效果

    效果图看上去非常的酷.制作方法跟火焰字过程差不多.唯一不同的是前期的处理,需要用滤镜把人物轮廓路径找出来,去色后再用制作火焰的过程制作.最后把最好的火焰叠加到人物上面,适当用蒙版控制区域即可.原图 最 ...

  8. OSChina 周日乱弹 —— 超酷炫 58 页年终总结,笑喷!

    猿文:http://my.oschina.net/xxiaobian/blog/368981 借鉴一下以下的各种年终总结吧,总有适合你的... OSCer 们,小小编掐指一算,你命里真的缺我啊,赶紧给 ...

  9. 一行代码实现自定义转场动画--iOS自定义转场动画集

    WXSTransition 这款非常不错,力推 这是作者源码简书地址: http://www.jianshu.com/p/fd3154946919 这是作者源码github地址 https://git ...

随机推荐

  1. 2003031121-浦娟-python数据分析第四周作业-第二次作业

    项目 内容 课程班级博客链接 20级数据班(本) 作业链接 Python第四周作业第二次作业 博客名称 2003031121-浦娟-python数据分析第四周作业-matolotlib的应用 要求 每 ...

  2. 「BUAA OO Unit 2 HW8」第二单元总结

    「BUAA OO Unit 2 HW8」第二单元总结 目录 「BUAA OO Unit 2 HW8」第二单元总结 Part 0 前言 Part 1 第五次作业 1.1 作业要求 1.2 架构设计 1. ...

  3. EdgeFormer: 向视觉 Transformer 学习,构建一个比 MobileViT 更好更快的卷积网络

    ​  前言 本文主要探究了轻量模型的设计.通过使用 Vision Transformer 的优势来改进卷积网络,从而获得更好的性能. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟 ...

  4. '@JvmDefault' is only supported since JVM target 1.8. Recompile with '-jvm-ta

    Java 1.8加入了接口默认实现的方式. 那么在kotlin中如何使用呢? 可以在方法上加注解@JvmDefault 但直接加上后会编译会碰到一些错误提示.下面是解决方法. 问题 Logcat 提示 ...

  5. 羽夏 Bash 简明教程(上)

    写在前面   该文章根据 the unix workbench 中的 Bash Programming 进行汉化处理并作出自己的整理,并参考 Bash 脚本教程 和 BashPitfalls 相关内容 ...

  6. 基于SqlSugar的开发框架的循序渐进介绍(1)--框架基础类的设计和使用

    在实际项目开发中,我们可能会碰到各种各样的项目环境,有些项目需要一个大而全的整体框架来支撑开发,有些中小项目这需要一些简单便捷的系统框架灵活开发.目前大型一点的框架,可以采用ABP或者ABP VNex ...

  7. Node.js躬行记(20)——KOA源码分析(下)

    在上一篇中,主要分析了package.json和application.js文件,本文会分析剩下的几个文件. 一.context.js 在context.js中,会处理错误,cookie,JSON格式 ...

  8. 基于SqlSugar的开发框架循序渐进介绍(3)-- 实现代码生成工具Database2Sharp的整合开发

    我喜欢在一个项目开发模式成熟的时候,使用代码生成工具Database2Sharp来配套相关的代码生成,对于我介绍的基于SqlSugar的开发框架,从整体架构确定下来后,我就着手为它们量身定做相关的代码 ...

  9. install dns server on ubuntu

    参考 CSDN/Ubuntu环境下安装和配置DNS服务器 在 Ubuntu 上安裝 DNS server Install BIND 9 on Ubuntu and Configure It for U ...

  10. CoaXPress 线缆和接插件的设计要求

    本文的原理部分内容不仅适用于CoaXPress 协议,也同样适用于其它高速信号传输情形.在高速.低干扰信号传输时,线缆和接插件的选取是非常讲究的,我们在实际应用中经常会遇到线缆原因.阻抗匹配原因导致的 ...