查看原文
其他

纯 CSS 实现呼吸霓虹效果

前端大全 2023-02-26

推荐关注↓

作者:avion

https://juejin.cn/post/7157334059192942606

前言

不管是作为程序员还是游戏玩家,相信机械键盘都不陌生,机械键盘的灯光有一种叫做呼吸灯模式,会随着时间推移,不断闪烁,变换颜色,我一直挺好奇这个是怎么实现的,所以今天就拿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{
    width100%;
    height100%;
    overflow: hidden;
    display: flex;
    justify-content: center;
    align-items: center;
    background-color#1e2759;
  }
  • 实现霓虹效果

霓虹效果通过容器与容器的before与after伪元素来实现,容器本身声明径向渐变背景与背景图,然后设置背景的叠加方式是multiply 正片叠底,这样我们就初步得到了一个有着模糊光圈的圆

 .container{
    width100%;
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    height100%;
    backgroundradial-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;
    top0;
    left0;
    right0;
    bottom0;
    margin: auto;
    width600px;
    height600px;
    border-radius50%;
    backgroundradial-gradient(rgba(255,0,0,.75), transparent, transparent);
  }
  .container::after{
    content'';
    display: block;
    position: absolute;
    top0;
    left0;
    right0;
    bottom0;
    margin: auto;
    width800px;
    height800px;
    border-radius50%;
    backgroundradial-gradient(rgba(255,0,0,.75), transparent, transparent);
  }
  • 径向渐变的用法
background-image: radial-gradient(shape size at position, start-color, ..., last-color);
  • shape 渐变形状是圆形还是椭圆形  接收两个值 circleellipse
  • size 渐变的大小
  • start-color...end-color 组成渐变的颜色,以逗号隔开
  • 背景混合模式的用法 这个属性定义了背景的混合模式,默认是正常,multiply是正片叠底,其他的就有待大家探索了
background-blend-modenormal|multiply|screen|overlay|darken|lighten|color-dodge|saturation|color|luminosity;
  • 呼吸霓虹的实现 滤镜+动画

这里我们需要用到一个非常经典的滤镜 hue-rotate 这个滤镜我不止一次用过,每次用,都对这个滤镜所实现的效果叹为观止,这个滤镜的作用是将当前的颜色做反相,以角度为单位值,从0deg360deg,结合我们的动画,我们的呼吸霓虹就可以实现了,这里动画我们采用的是fromto的属性,这个属性与写0%100%的效果是一样的

.container{
  animation: hue-rotate 5s linear infinite;
}
@keyframes hue-rotate {
    from{
      filterhue-rotate(0deg);
    }
    to{
      filterhue-rotate(360deg);
    }
  }
  • 加个icon

实现完以后,感觉实在是太空了,所以就找到字节logo的svg形式,设置透明填充,然后通过drop-shadow滤镜进行了镂空 drop-shadow与box-shadow属性差不多,但是实现的效果有一些区别,drop-shadow可以针对不规则图形添加阴影。

.icon svg path{
  stroke#fff;
  stroke-width10px;
  fill: transparent;
  filterdrop-shadow(0 20px 10px #333blur(2px);
}


- EOF -


加主页君微信,不仅前端技能+1

主页君日常还会在个人微信分享前端开发学习资源技术文章精选,不定期分享一些有意思的活动岗位内推以及如何用技术做业余项目

加个微信,打开一扇窗



推荐阅读  点击标题可跳转

1、2022 年你不知道的 CSS 新特性

2、如何用一行 CSS 实现 10 种现代布局

3、纯 CSS 实现十个还不错的 Loading 效果


觉得本文对你有帮助?请分享给更多人

推荐关注「前端大全」,提升前端技能

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存