持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
前言
不管是作为程序员还是游戏玩家,相信机械键盘都不陌生,机械键盘的灯光有一种叫做呼吸灯模式,会随着时间推移,不断闪烁,变换颜色,我一直挺好奇这个是怎么实现的,所以今天就拿css模拟一个呼吸灯霓虹特效,因为键盘写起来挺复杂的,所以考虑拿字节跳动的svgIcon作为前景,呼吸灯霓虹作为背景,实现一个呼吸灯霓虹特效
实现所需css属性预告
本文需要用到的css属性如下,按我的习惯,能用css实现的必不用js来实现,所以,所需要的属性有
flex
用来做水平垂直居中radial-gradient
背景径向渐变 实现从内向外扩散式的渐变背景background-image
让背景不那么单调background-blend-mode
背景混合模式 类似Ps的溶解,正片叠底等等的效果animation
呼吸霓虹的实现方式filter
滤镜 实现呼吸灯特效的关键
接下来,就是我们样式的核心实现
核心实现
- 容器
容器很简单,容器内包含一个文字,一个svg Icon
<div class="container">
<div class="icon">
<svg t="1666355082539" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1210" width="256" height="256"><path d="M122.496 109.738667A42.666667 42.666667 0 0 0 64 149.333333v682.666667a42.666667 42.666667 0 0 0 58.496 39.594667l106.666667-42.666667A42.666667 42.666667 0 0 0 256 789.333333v-597.333333a42.666667 42.666667 0 0 0-26.837333-39.594667l-106.666667-42.666666zM149.333333 768.981333V212.352l21.333334 8.533333v539.562667l-21.333334 8.533333zM357.162667 451.072A42.666667 42.666667 0 0 0 298.666667 490.666667v341.333333a42.666667 42.666667 0 0 0 58.496 39.594667l106.666666-42.666667a42.666667 42.666667 0 0 0 26.837334-39.594667v-256a42.666667 42.666667 0 0 0-26.837334-39.594666l-106.666666-42.666667zM384 768.981333v-215.296l21.333333 8.533334v198.229333l-21.333333 8.533333zM706.56 370.005333A42.666667 42.666667 0 0 1 725.333333 405.333333v341.333334a42.666667 42.666667 0 0 1-58.496 39.594666l-106.666666-42.666666a42.666667 42.666667 0 0 1-26.837334-39.594667v-256a42.666667 42.666667 0 0 1 26.837334-39.594667l106.666666-42.666666a42.666667 42.666667 0 0 1 39.765334 4.266666z m-87.893333 106.88v198.229334l21.333333 8.533333v-215.296l-21.333333 8.533333zM826.496 152.405333A42.666667 42.666667 0 0 0 768 192v640a42.666667 42.666667 0 0 0 58.496 39.594667l106.666667-42.666667a42.666667 42.666667 0 0 0 26.837333-39.594667v-554.666666a42.666667 42.666667 0 0 0-26.837333-39.594667l-106.666667-42.666667zM853.333333 768.981333V255.018667l21.333334 8.533333v496.896l-21.333334 8.533333z" p-id="1211"></path><path d="M149.333333 212.352v556.629333l21.333334-8.533333V220.885333l-21.333334-8.533333zM384 553.685333v215.296l21.333333-8.533333v-198.229333l-21.333333-8.533334zM618.666667 675.114667v-198.229334l21.333333-8.533333v215.296l-21.333333-8.533333zM853.333333 255.018667v513.962666l21.333334-8.533333V263.552l-21.333334-8.533333z" p-id="1212"></path></svg>
</div>
</div>
- 容器通过父元素的flex布局实现垂直与水平居中
html,body{
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
background-color: #1e2759;
}
- 实现霓虹效果
霓虹效果通过容器与容器的before与after伪元素来实现,容器本身声明径向渐变背景与背景图,然后设置背景的叠加方式是multiply
正片叠底,这样我们就初步得到了一个有着模糊光圈的圆
.container{
width: 100%;
position: relative;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
height: 100%;
background: radial-gradient(#f00, rgba(0,0,0,.5)),url(https://pic.90sheji.com/design/00/19/47/66/58b57e9a175b6.png!/fw/1080/quality/90/unsharp/true/compress/true/canvas/280x414a0a0/cvscolor/FFFFFFFF);
background-blend-mode: multiply;
}
.container::before{
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 600px;
height: 600px;
border-radius: 50%;
background: radial-gradient(rgba(255,0,0,.75), transparent, transparent);
}
.container::after{
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
width: 800px;
height: 800px;
border-radius: 50%;
background: radial-gradient(rgba(255,0,0,.75), transparent, transparent);
}
- 径向渐变的用法
background-image: radial-gradient(shape size at position, start-color, ..., last-color);
-
shape
渐变形状是圆形还是椭圆形 接收两个值circle
、ellipse
-
size
渐变的大小 -
start-color...end-color
组成渐变的颜色,以逗号隔开 -
背景混合模式的用法 这个属性定义了背景的混合模式,默认是正常,multiply是正片叠底,其他的就有待大家探索了
background-blend-mode: normal|multiply|screen|overlay|darken|lighten|color-dodge|saturation|color|luminosity;
- 呼吸霓虹的实现 滤镜+动画
这里我们需要用到一个非常经典的滤镜 hue-rotate
这个滤镜我不止一次用过,每次用,都对这个滤镜所实现的效果叹为观止,这个滤镜的作用是将当前的颜色做反相,以角度为单位值,从0deg
到360deg
,结合我们的动画,我们的呼吸霓虹就可以实现了,这里动画我们采用的是from
、to
的属性,这个属性与写0%
、100%
的效果是一样的
.container{
animation: hue-rotate 5s linear infinite;
}
@keyframes hue-rotate {
from{
filter: hue-rotate(0deg);
}
to{
filter: hue-rotate(360deg);
}
}
- 加个icon
实现完以后,感觉实在是太空了,所以就找到字节logo的svg形式,设置透明填充,然后通过drop-shadow
滤镜进行了镂空
drop-shadow与box-shadow属性差不多,但是实现的效果有一些区别,drop-shadow可以针对不规则图形添加阴影。
.icon svg path{
stroke: #fff;
stroke-width: 10px;
fill: transparent;
filter: drop-shadow(0 20px 10px #333) blur(2px);
}
码上掘金
老规矩,上码上掘金链接