CSS 圆锥渐变+MASK遮罩实现WIFI图标

前言

👏CSS 圆锥渐变+MASK遮罩实现WIFI图标,速速来Get吧~

🥇文末分享源代码。记得点赞+关注+收藏!

1.实现效果

image.png

2.实现步骤

  • 定义css变量--bg背景色,--dot弧宽度,--w父元素宽度,--gap,各弧度之间的间距
:root {
  --bg: #fff;
  --dot: 20px;
  --w: 300px;
  --gap: 45px;
}
  • 定义父元素container
image.png
<div class="container"></div>
.container {
    width: var(--w);
    position: relative;
    border: 1px solid red;
}
  • 父元素内添加一个子元素line
image.png
<div class="container">
    + <div class="line" ></div>
</div>
  • 设置line样式为absolute定位,设置宽高为--w,圆角50%,背景设置圆锥渐变,--bg占据35%,剩下为透明色;

conic-gradient():
CSS 函数 conic-gradient() 创建了一个由渐变组成的图像,渐变的颜色变换围绕一个中心点旋转(而不是从中心辐射)。锥形渐变的例子包括饼图和色轮 color wheels (en-US). conic-gradient() 函数的结果是 gradient 数据类型的对象,是一种特殊的 image 数据类型。

image.png
.line{
    position: absolute;
    width: var(--w);
    height: var(--w);
    border-radius: 50%;
    background: conic-gradient(var(--bg) 35%, transparent 35%);
}
  • 为line设置mask遮罩,弧形宽度为--dot,那么渐变的值则为父元素宽度的一半(--w/2)减去dot
image.png
.line{
     -webkit-mask: radial-gradient(
        transparent calc(var(--w) / 2 - var(--dot) - 1px),
        #000 calc(var(--w) / 2 - var(--dot))
      );
}
  • 为line添加前后伪元素,居于圆的正中间,宽高为dot,圆角50%,背景色为--bg;
image.png
.line::before,
.line::after {
    content: "";
    position: absolute;
    width: var(--dot);
    height: var(--dot);
    border-radius: 50%;
    left: calc(var(--w) / 2 - var(--dot) / 2);
    top: calc(var(--w) / 2 - var(--dot) / 2);
    background: var(--bg);
}
  • mask遮罩的存在,使得伪元素不可见,通过调试可以看到相应的位置;
image.png
  • 调整前伪元素的位置,使其移动到圆弧的最上方
image.png
.line::before {
   transform: translate(0, calc(var(--dot) / 2 - var(--w) / 2));
 }
  • 调整后伪元素的位置,使其移动到圆弧的最下方
image.png
.line::after {
    transform: rotate(calc(360deg * 0.35))
    translate(0, calc(var(--dot) / 2 - var(--w) / 2));
}
  • 将line元素整体旋转60deg,就得到一个完整的圆弧了
image.png
.line{
    transform: rotate(-60deg);
}
  • 接下来,我们实现剩余圆弧以及中间圆点
  • 再次定义两个line元素
<div class="container">
     <div class="line" ></div>
    + <div class="line" ></div>
    + <div class="line" ></div>
</div>
image.png
  • 第三个圆环宽度
image.png
  • 可以得到,每个圆环的宽度为calc(var(–w) - var(–gap) * 2 * var(–i)),i为当前圆环的索引位置(从0开始,依次+1)
  • 为line元素设置行内css变量--i
<div class="container">
    <div class="line" style="--i: 0"></div>
    <div class="line" style="--i: 1"></div>
    <div class="line" style="--i: 2"></div>
</div>
  • 修改line元素的宽高,将相关的--w替换为--width
image.png
.line {
    --width: calc(var(--w) - var(--gap) * 2 * var(--i));
    width: var(--width);
    height: var(--width);
    -webkit-mask: radial-gradient(
        transparent calc(var(--width) / 2 - var(--dot) - 1px),
        #000 calc(var(--width) / 2 - var(--dot))
      );
}
.line::before,
.line::after {
    left: calc(var(--width) / 2 - var(--dot) / 2);
    top: calc(var(--width) / 2 - var(--dot) / 2); *
}
.line::before {
    transform: translate(0, calc(var(--dot) / 2 - var(--width) / 2));
}
.line::after {
    transform: rotate(calc(360deg * 0.35))
      translate(0, calc(var(--dot) / 2 - var(--width) / 2));
}
  • 为每个半圆环(line元素)设置top,第一个圆环为0,第二个为gap,第三个为gap*2,可得到top为 calc(var(–gap) * var(–i)),并水平居中
image.png
.line{
    /* 水平居中 */
    left: calc(50% - var(--width) / 2);
    /* 距离顶部的距离,根据gap来定 */
    top: calc(var(--gap) * var(--i));
}
  • 父元素内添加dot元素,宽高为dot,背景色为--bg,圆角50%,水平居中,top为第一个圆环的位置即为calc(var(--gap) * 3)
image.png
<div class="container">
    + <div class="dot"></div>
</div>
.dot {
    position: absolute;
    width: var(--dot);
    height: var(--dot);
    border-radius: 50%;
    top: calc(var(--gap) * 3);
    background: var(--bg);
    left: calc(50% - var(--dot) / 2);
}
  • 设置父元素的高度为calc(var(--gap) * 3 + var(--dot))
image.png
image.png
.container {
    + height: calc(var(--gap) * 3 + var(--dot));
}
  • 去掉父元素辅助线条,就完成啦~


    image.png

3.实现代码

<style>
:root {
  --bg: #fff;
  --dot: 20px;
  --w: 300px;
  --gap: 45px;
}
.container {
  width: var(--w);
  height: calc(var(--gap) * 3 + var(--dot));
  position: relative;
}
.line {
  position: absolute;
  --width: calc(var(--w) - var(--gap) * 2 * var(--i));
  width: var(--width);
  height: var(--width);
  /* 水平居中 */
  left: calc(50% - var(--width) / 2);
  /* 距离顶部的距离,根据gap来定 */
  top: calc(var(--gap) * var(--i));
  border-radius: 50%;
  background: conic-gradient(var(--bg) 35%, transparent 35%);
  -webkit-mask: radial-gradient(
    transparent calc(var(--width) / 2 - var(--dot) - 1px),
    #000 calc(var(--width) / 2 - var(--dot))
  );
  transform: rotate(-60deg);
}
.line::before,
.line::after {
  content: "";
  position: absolute;
  width: var(--dot);
  height: var(--dot);
  border-radius: 50%;
  left: calc(var(--width) / 2 - var(--dot) / 2);
  top: calc(var(--width) / 2 - var(--dot) / 2);
  background: var(--bg);
}
.line::before {
  transform: translate(0, calc(var(--dot) / 2 - var(--width) / 2));
}
.line::after {
  transform: rotate(calc(360deg * 0.35))
    translate(0, calc(var(--dot) / 2 - var(--width) / 2));
}
.dot {
  position: absolute;
  width: var(--dot);
  height: var(--dot);
  border-radius: 50%;
  top: calc(var(--gap) * 3);
  background: var(--bg);
  left: calc(50% - var(--dot) / 2);
}
</style>
<body>
<div class="container">
  <div class="line" style="--i: 0"></div>
  <div class="line" style="--i: 1"></div>
  <div class="line" style="--i: 2"></div>
  <div class="dot"></div>
</div>
</body>

4.写在最后🍒

看完本文如果觉得对你有一丢丢帮助,记得点赞+关注+收藏鸭 🍕
更多相关内容,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339