巧用渐变实现高级感拉满的背景光动画

开发 前端
本文,会带来另外一个有意思的效果,巧用渐变实现高级感拉满的背景光动画。这个效果想利用 CSS 完全复制是比较困难的。CSS 模拟出来的光效阴影相对会 Low 一点,只能说是尽量还原。

[[434959]]

背景

在上一篇 巧用滤镜实现高级感拉满的文字快闪切换效果[1] 中,我们提到了一种非常有意思的之前苹果展示文字的动画效果。

本文,会带来另外一个有意思的效果,巧用渐变实现高级感拉满的背景光动画。此效果运用在苹果官网 iPhone 13 Pro[2] 的介绍页中:

[[434960]]

实现

这个效果想利用 CSS 完全复制是比较困难的。CSS 模拟出来的光效阴影相对会 Low 一点,只能说是尽量还原。

其实每组光都基本是一样的,所以我们只需要实现其中一组,就几乎能实现了整个效果。

观察这个效果:

它的核心其实就是角向渐变 -- conic-gradient(),利用角向渐变,我们可以大致实现这样一个效果:

  1. <div></div> 
  1. div { 
  2.     width: 1000px; 
  3.     height: 600px; 
  4.     background: 
  5.         conic-gradient( 
  6.             from -45deg at 400px 300px, 
  7.             hsla(170deg, 100%, 70%, .7), 
  8.             transparent 50%, 
  9.             transparent), 
  10.             linear-gradient(-45deg, #060d5e, #002268); 

看看效果:

有点那意思了。当然,仔细观察,渐变的颜色并非是由一种颜色到透明就结束了,而是颜色 A -- 透明 -- 颜色 B,这样,光源的另一半并非就不会那么生硬,改造后的 CSS 代码:

  1. div { 
  2.     width: 1000px; 
  3.     height: 600px; 
  4.     background: 
  5.         conic-gradient( 
  6.             from -45deg at 400px 300px, 
  7.             hsla(170deg, 100%, 70%, .7), 
  8.             transparent 50%, 
  9.             hsla(219deg, 90%, 80%, .5) 100%), 
  10.             linear-gradient(-45deg, #060d5e, #002268); 

我们在角向渐变的最后多加了一种颜色,得到观感更好的一种效果:

emm,到这里,我们会发现,仅仅是角向渐变 conic-gradient() 是不够的,它无法模拟出光源阴影的效果,所以必须再借助其他属性实现光源阴影的效果。

这里,我们会很自然的想到 box-shadow。这里有个技巧,利用多重 box-shadow, 实现 Neon 灯的效果。

我们再加个 div,通过它实现光源阴影:

  1. <div class="shadow"></div> 
  1. .shadow { 
  2.     width: 200px; 
  3.     height: 200px; 
  4.     background: #fff; 
  5.     box-shadow:  
  6.         0px 0 .5px hsla(170deg, 95%, 80%, 1), 
  7.         0px 0 1px hsla(170deg, 91%, 80%, .95), 
  8.         0px 0 2px hsla(171deg, 91%, 80%, .95), 
  9.         0px 0 3px hsla(171deg, 91%, 80%, .95), 
  10.         0px 0 4px hsla(171deg, 91%, 82%, .9), 
  11.         0px 0 5px hsla(172deg, 91%, 82%, .9), 
  12.         0px 0 10px hsla(173deg, 91%, 84%, .9), 
  13.         0px 0 20px hsla(174deg, 91%, 86%, .85), 
  14.         0px 0 40px hsla(175deg, 91%, 86%, .85), 
  15.         0px 0 60px hsla(175deg, 91%, 86%, .85); 

OK,光是有了,但问题是我们只需要一侧的光,怎么办呢?裁剪的方式很多,这里,我介绍一种利用 clip-path 进行对元素任意空间进行裁切的方法:

  1. .shadow { 
  2.     width: 200px; 
  3.     height: 200px; 
  4.     background: #fff; 
  5.     box-shadow: .....; 
  6.     clip-path: polygon(-100% 100%, 200% 100%, 200% 500%, -100% 500%); 

原理是这样的:

这样,我们就得到了一侧的光:

这里,其实 CSS 也是有办法实现单侧阴影的(你所不知道的 CSS 阴影技巧与细节[3]),但是实际效果并不好,最终采取了上述的方案。

接下来,就是利用定位、旋转等方式,将上述单侧光和角向渐变重叠起来,我们就可以得到这样的效果:

这会,已经挺像了。接下来要做的就是让整个图案,动起来。这里技巧也挺多的,核心还是利用了 CSS @Property,实现了角向渐变的动画,并且让光动画和角向渐变重叠起来。

我们需要利用 CSS @Property 对代码渐变进行改造,核心代码如下:

  1. <div class="wrap"
  2.     <div class="shadow"></div> 
  3. </div> 

  1. @property --xPoint { 
  2.   syntax: '<length>'
  3.   inherits: false
  4.   initial-value: 400px; 
  5. @property --yPoint { 
  6.   syntax: '<length>'
  7.   inherits: false
  8.   initial-value: 300px; 
  9.  
  10. .wrap { 
  11.     position: relative
  12.     margin: auto; 
  13.     width: 1000px; 
  14.     height: 600px; 
  15.     background: 
  16.         conic-gradient( 
  17.             from -45deg at var(--xPoint) var(--yPoint), 
  18.             hsla(170deg, 100%, 70%, .7), 
  19.             transparent 50%, 
  20.             hsla(219deg, 90%, 80%, .5) 100%), 
  21.             linear-gradient(-45deg, #060d5e, #002268); 
  22.     animation: pointMove 2.5s infinite alternate linear; 
  23.  
  24. .shadow { 
  25.     position: absolute
  26.     top: -300px; 
  27.     left: -330px; 
  28.     width: 430px; 
  29.     height: 300px; 
  30.     background: #fff; 
  31.     transform-origin: 100% 100%; 
  32.     transform: rotate(225deg); 
  33.     clip-path: polygon(-100% 100%, 200% 100%, 200% 500%, -100% 500%); 
  34.     box-shadow: ... 此处省略大量阴影代码; 
  35.     animation: scale 2.5s infinite alternate linear; 
  36.   
  37. @keyframes scale { 
  38.     50%, 
  39.     100% { 
  40.         transform: rotate(225deg) scale(0); 
  41.     } 
  42.  
  43. @keyframes pointMove { 
  44.     100% { 
  45.         --xPoint: 100px; 
  46.         --yPoint: 0; 
  47.     } 

这样,我们就实现了完整的一处光的动画:

我们重新梳理一下,实现这样一个动画的步骤:

  1. 利用角向渐变 conic-gradient 搭出基本框架,并且,这里也利用了多重渐变,角向渐变的背后是深色背景色;
  2. 利用多重 box-shadow 实现光及阴影的效果(又称为 Neon 效果)
  3. 利用 clip-path 对元素进行任意区域的裁剪
  4. 利用 CSS @Property 实现渐变的动画效果

剩下的工作,就是重复上述的步骤,补充其他渐变和光源,调试动画,最终,我们就可以得到这样一个简单的模拟效果:

由于原效果是 .mp4,无法拿到其中的准确颜色,无法拿到阴影的参数,其中颜色是直接用的色板取色,阴影则比较随意的模拟了下,如果有源文件,准确参数,可以模拟的更逼真。

完整的代码你可以戳这里:CodePen -- iPhone 13 Pro Gradient[4]

最后

本文更多的是图一乐呵,实际中制作上述效果肯定是有更为优雅的解法,并且利用 CSS 模拟的话,也应该有更好的方法,这里我仅仅是抛砖引玉,过程中的 1、2、3、4 技巧本身有一些还是值得借鉴学习的。

好了,本文到此结束,希望本文对你有所帮助 :)

参考资料

[1]巧用滤镜实现高级感拉满的文字快闪切换效果:

https://github.com/chokcoco/iCSS/issues/149

[2]苹果官网 iPhone 13 Pro: 巧用渐变实现高级感拉满的背景光动画

[3]你所不知道的 CSS 阴影技巧与细节:

https://github.com/chokcoco/iCSS/issues/39

[4]CodePen -- iPhone 13 Pro Gradient:

https://codepen.io/Chokcoco/pen/xxLzmmZ

 

责任编辑:姜华 来源: iCSS前端趣闻
相关推荐

2022-01-07 07:35:28

CSS 技巧磨砂玻璃

2021-11-09 08:30:48

CSS 技巧巧用滤镜

2021-04-16 05:54:05

CSS 文字动画技巧

2023-06-07 10:41:43

2023-06-05 09:28:32

CSS渐变

2023-06-27 09:33:15

Loading 动画CSS

2022-01-13 07:04:54

CSS 技巧Loading 动画

2020-12-24 08:37:41

Css前端加载动画

2022-01-28 09:01:49

架构

2022-08-11 09:30:52

transitionCSS

2022-02-16 08:21:28

CSS三角边框动画SVG

2024-01-12 17:06:50

字节面试题目

2021-08-05 23:09:53

前端程序员CSS

2013-06-20 11:10:24

iOS开发UItableView单元格背景渐变

2022-02-28 07:02:51

CSS二维码前端

2021-08-04 05:32:40

Web动画CSS技巧

2023-06-30 13:27:54

CSS径向渐变

2021-02-14 20:41:56

API日志web

2023-11-06 09:25:00

马斯克模型
点赞
收藏

51CTO技术栈公众号