基于上次翻译的 一个炫酷的头像悬停成果 播种了不少同学的喜爱,原作者近期进行了优化降级。本文将降级后的外围实现过程进行梳理解说,如果没看过第一期的举荐先看看第一期的实现过程。降级后的成果如下图所示。
gif动画成果如下:
绝对于上次的成果次要减少了背景的变动,减少了默认的旋转动画以及背景花瓣的成果。外围实现技术点如下:
- 不须要额定的元素,仅应用
<img>
标签 - 不应用伪元素
- 应用future CSS,mask,@property,三角函数和大量的数学函数
- 应用Sass和CSS变量优化代码量
- 小圆的大小和数量可配置
对于实现过程的相干三角函数及Sass相干函数不过多解析,有趣味的能够具体理解。
根底变量定义
为了不便前面操作与更改配置,首先定义几个变量不便调整配置和后续代码援用。
背景圆中的小圆数量 $n
:
$n: 15;
管制小圆半径和主体的尺寸大小:
--r: 50px;
管制小圆放大比例基数,管制数值在1.2和2之间:
--f: 2;
主体背景色彩:
--c: #E4844A;
除此之外还通过 @property
定义了2个变量,管制旋转的角度及小圆之间的间距。
通过 @property
申明的变量能够定义其语法、继承性和初始值。这样做的益处是能够在文档中明确地申明变量,并指定其用处和限度条件。这种申明形式更适宜须要具体定义的场景,例如自定义属性。
@property --a { syntax: "<angle>"; initial-value: 0deg; inherits: true;}@property --i { syntax: "<length>"; initial-value: 0px; inherits: true;}
背景绘制
背景图形上有多个小圆组成,小圆的数量是可配置的,所以背景的小圆须要基于所配置的数量动静生成,这里须要用到几个Sass
的函数。
因为小圆的数量$n
反对配置,所以整个元素的大小会随之影响发生变化。通过设置aspect-ratio
,咱们只须要管制width
的变动即可。宽度的最终值基于小圆的半径和小圆的数量计算得出。
width: calc(var(--r)*(1 + 1/tan(180deg/#{$n})));aspect-ratio: 1;border-radius: 50%;
接下来开始绘制从属在大圆下面的小圆。
$m: ();@for $i from 1 through ($n) { $m: append($m, radial-gradient(var(--c) 70%,#0000 72%) no-repeat calc(50% + (50% - var(--i,0px))*cos(360deg*#{$i/$n} + var(--a,0deg))) calc(50% + (50% - var(--i,0px))*sin(360deg*#{$i/$n} + var(--a,0deg)))/ var(--r) var(--r), comma); }
首先,咱们定义一个变量 $m
,并将其初始化为空。而后应用 @for
循环从 1 到 $n
小圆的数量进行遍历。
在循环外部,应用 Sass
的 append()
函数将新生成的 radial-gradient
款式追加到 $m
变量中。append()
函数用于在列表类型的变量前面增加一个新的元素,并返回新的列表。
radial-gradient
款式由以下几局部组成:
var(--c)
70%:示意突变的色彩和突变的地位,其中色彩应用 CSS 变量--c
。#0000
72%:示意突变的完结色彩和完结地位。- no-repeat:示意不反复突变。
calc(50% + (50% - var(--i,0px))*cos(360deg*#{$i/$n} + var(--a,0deg)))
和calc(50% + (50% - var(--i,0px))*sin(360deg*#{$i/$n} + var(--a,0deg)))
:计算突变的圆心地位,其中变量--i
和--a
是自定义变量,默认值别离为0px
和0deg
。- /
var(--r) var(--r)
:示意突变的尺寸,其中尺寸应用 CSS 变量--r
。 comma
:示意多个背景图像之间应用逗号分隔。
循环完结后,变量 $m
将蕴含所有生成的 radial-gradient
款式,能够在后续的款式中应用 $m
来利用这些背景图像。
基于下面的代码持续欠缺,将最终生成的图形绘制到背景中。
--_m: radial-gradient(var(--c) calc(72% - var(--r)/2 - var(--i,0px)),#0000 0), #{$m};-webkit-mask: linear-gradient(#000 0 0) top/100% 50% no-repeat, var(--_m);background: var(--_m);
在下面的代码中,定义了一个新的CSS变量 --_m
。它的值由两局部组成:
- 一个
radial-gradient
背景图像款式,其中突变的色彩和地位应用var(--c)
和calc(72% - var(--r)/2 - var(--i,0px))
示意,这个突变的完结色彩是#0000
,完结地位是0
。这部分内容就是整个背景的核心大圆局部。 - 以插值的形式援用之前定义的变量
$m
。
接着应用 -webkit-mask
属性为元素设置背景遮罩成果。它蕴含两局部:
- 一个线性突变
linear-gradient
,示意从顶部开始的彩色突变。其中突变的色彩为#000
,突变的起始地位、完结地位别离为0
和0
。设置了top/100% 50%
示意linear-gradient
的尺寸是程度方向占满整个宽度,垂直方向占高度的一半。no-repeat
示意不反复突变。 - 援用之前定义的变量
--_m
,将其作为元素的遮罩图像。
最初应用 background
属性将之前定义的变量 --_m
作为元素的背景图像。这样整个元素的背景就会显示之前生成的 radial-gradient
多个小圆的款式。
动画绘制
元素hover
后动画细节拆分:
- 背景圆旋转动画运行速度放慢
- 大圆从属小圆放大配置比例
- 核心人物放大
hover
前后动画速度不一样是两段不同执行工夫的动画在切换,默认设置的动画如下:
--_a: rotate linear infinite;animation: var(--_a) 10s, var(--_a) 16s reverse;@keyframes rotate { to{--a:360deg}}
当hover
时将第一段动画设置running
,第二段动画设置paused
。
animation-play-state: running, paused;
下面绘制小圆的时候是基于--r
半径绘制,咱们还定义了--f
管制hover
时小圆放大比例的基数。--i
在绘制小圆的时候设置了默认值是0px
当hover
时基于设定的变量进行计算赋值到--i
,即可对校园进行放大的动画管制。
--i: calc(var(--r)/var(--f));
对核心人物图像的放大应用如下代码,外围应用了小圆数量 $n
,小圆半径--r
进行计算最终放大的比例。
scale: calc((1 + 1/tan(180deg/#{$n}))/(1 - 2/var(--f) + 1/tan(180deg/#{$n})));
另外还对次要的动画减少了过渡的成果,针对--i
和scale
的切换减少0.4s
的过渡工夫,使动画更加丝滑。
transition: --i .4s, scale .4s;
在线源码
https://code.juejin.cn/pen/7269700151160078348
最初
到此整体外围实现的逻辑就完结了,整个实现过程用到了不少Sass
函数以及CSS3相干能力,定义了局部配置项使整个代码更加灵便可控,简洁高效。有趣味的能够本人尝试看看。
看完本文如果感觉有用,记得点个赞反对,珍藏起来说不定哪天就用上啦~
专一前端开发,分享前端相干技术干货,公众号:南城大前端(ID: nanchengfe)
参考
A Fancy Hover Effect For Your Avatar II: css-tip.com/avatar-hover-effect-2/