转载自张旭鑫

一、从SVG实现多彩圆环倒计时效果说起

上周我做了个demo,使用SVG和stroke-dasharray和stroke-dashoffset特性实现了一个彩条圆环倒计时效果,大概长下面这样子:

原理是使用两个渐变半圆无缝叠加在一起。

使用SVG实现的优点是兼容性非常好,IE9浏览器也是支持的。

不足在于学习成本比较高,相关的SVG代码要想完整的手写出来,还是需要不少积累的。

于是我就琢磨有没有更简单的方法实现类似的多彩圆环渐变效果,最好纯CSS就能搞定。

绞尽脑汁想出了下面三种实现方法,为了尽可能验证方法的可行性,我把圆环的渐变颜色从3色变成了12色。

下面依次介绍这三种方法。

二、借助CSS3 conic-gradient锥形渐变实现12色渐变圆环

环形带上的渐变效果,本质上就是一种锥形渐变,因此,我们直接使用,CSS3 conic-gradient锥形渐变实现应该是最简单最直接的方法。

如下HTML和CSS:

<div class="circle"></div>复制代码
.circle {width: 300px; height: 300px;background: conic-gradient(#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);border-radius: 50%;
}复制代码

此时的效果如下图所示:

但是我们需要的效果不是圆饼,而是一个圆环,也就是中间区域需要镂空。

有一种比较巧妙的做法,就是搞一个跟背景色一样半径小一点的圆形饼覆盖在中间,这样视觉看上去就是一个圆环,这也是不一个不错的方法。但是如果我们的背景是一个复杂的图案,此时,这种方法恐怕就不能适用。

你怎么需要找到一种中间区域是真实镂空的方法,怎么处理呢?

我们可以借助CSS3遮罩mask属性来实现,CSS3 mask遮罩除了支持PNG图片,SVG图形,其还支持CSS3渐变背景图。于是,我们只需要使用CSS3径向渐变radial-gradient语法生成一个中间透明,边缘实色的圆环即可。

于是有(这里省略了mask属性的webkit私有前缀):

.circle {width: 300px; height: 300px;background: conic-gradient(#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);border-radius: 50%;mask: radial-gradient(transparent 110px, #000 110px);
}复制代码

于是我们的12色圆环渐变效果就实现了:

再配合JS设置clip-path剪裁我们的图形,就可以实现12色的彩虹圆环倒计时效果了。

眼见为实,您可以狠狠地点击这里:借助CSS3 mask遮罩和conic-gradient实现的多彩圆环demo

优点和不足
这个方法看上去很简单,很完美,但是却有个致命的缺陷,那就是兼容性问题!

CSS3锥形渐变conic-gradient目前仅Chrome浏览器才支持,并且Chrome浏览器还是需要开启实验功能选项才能支持!

因此当下此方法基本上没有在实际项目中应用的可能性,需要看看有没有什么其他解决方案?

三、借助CSS3 linear-gradient线性渐变近似实现12色渐变圆环

虽然锥形渐变浏览器的兼容性不怎么样,但是线性渐变它兼容性很好啊,是不是可以李代桃僵呢?

和一开始SVG圆环原理类似:
把我们的圆环分成左半部分和右半部分,左半部分是一套线性渐变,右半部分是另外一套线性渐变,然后最底部的线性渐变颜色是一样的,理论上在视觉上看起来就能够形成一个完美的环。

如下HTML和CSS代码:

<div class="circle"><div class="circle-left"></div><div class="circle-right"></div>
</div>复制代码
.circle {width: 300px; height: 300px;border-radius: 50%;mask: radial-gradient(transparent 110px, #000 110px);overflow: hidden;
}
.circle-left {width: 50%; height: 100%;background: linear-gradient(to bottom, #EDE604, #FFCC00, #FEAC00, #FF8100, #FF5800, #FF3BA7, #CC42A2);float: left;
}
.circle-right {width: 50%; height: 100%;float: right;background: linear-gradient(to bottom, #9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2);
}复制代码

然而最后的效果却是下面这样:

咦,奇怪,同样的实现原理,为什么一开始的SVG实现没有这样的现象呢?

实际上,SVG的实现底部的连接也是不完美的,但是由于我们上面的这个圆环渐变颜色比较少,同时颜色比较接近,因此不仔细看,根本看不出来,连接有问题的。

但是这里的12色渐变就不一样了,渐变颜色跨度明显区分大,因此很明显看出来接缝有问题,那有没有什么办法可以解决这个问题呢?

有!我想的办法是,就是在下面接缝不完美的地方打一个小补丁,就像是我国桥梁建造接缝处重新浇筑一样,于是HTML变成下面这样,增加一个.circle-bottom

<div class="circle"><div class="circle-left"></div><div class="circle-right"></div><div class="circle-bottom"></div>
</div>复制代码

对应的CSS如下:

.circle-bottom {position: absolute; height: 40px; width: 30px;bottom: 3px; left: 0; right: 0;margin: auto;/* 下面两个声明是补丁关键 */background: linear-gradient(to right, #DB3FA3, #C443A3);filter: blur(5px);
}复制代码

也就是接缝处搞一个小小的水平渐变,同时适当高斯模糊,淡化边界。然后肉眼所见的效果就变成下面这样,几乎看不出任何异常:

接下来就简单了,同样地,JS设置圆环clip-path动态剪裁,实现我们想要的倒计时效果。

眼见为实,您可以狠狠的点击这里:linear-gradient线性渐变实现的多彩圆环demo

优点和不足
此方法的优点在于兼容性足够(仅IE不支持),在移动端可以无障碍使用。

不足在于这个圆环的渐变并不是径向发散的,而是自上而下的,和真正意义上的圆环渐变还是有些差异的。

那有没有什么方法,既保证兼容性,同时渐变又是真正意义上的环形渐变呢?

四、借助CSS clip剪裁、transform旋转和模糊滤镜实现12色渐变圆环

此方法需要一定的理解成本,请容我慢慢道来。

1. 如何实现一个30°的扇形?

假设有如下HTML:

<div class="sector"></div>复制代码

则下面的CSS可生成一个30°的扇形:

.sector {width: 300px; height: 300px;position: absolute;clip: rect(0 300px 300px 150px);overflow: hidden;
}
.sector::after {content: '';width: 100%; height: 100%;background: currentColor;position: absolute;clip: rect(0 150px 300px 0);transform: rotate(30deg);border-radius: 50%;
}复制代码

实时效果如下:

原理如下:

  1. 外面容器原本是个正方形,但通过clip剪裁只显示右半部分;
  2. 子元素同样尺寸,但通过clip剪裁只显示左半部分。然后通过适当旋转露出我们想要的扇形区域;

原理示意图如下:

2. 如何使用12个30°扇形铺成一个圆

很简单,我们只要创新12个类似下面的HTML:

<div class="sector"></div>复制代码

然后每个扇形元素比前面一个多选转30度就可以了,然后每一个扇形设置一个渐变颜色,CSS类似下面:

.sector:nth-of-type(1) {transform: rotate(0);color: #9ED110;
}
/* 2-11 略 */
.sector:nth-of-type(12) {transform: rotate(330deg);color: #EDE604;
}复制代码

我们就可以得到类似下图的效果:

3. 如何模糊扇形色块的边界?

这个我们可以借助CSS3的filter滤镜中的高斯模糊实现,假设12个扇形元素全部都在一个类名为.sector-group的元素中,则:

.sector-group {filter: blur(15px);
}复制代码

效果如下图:

然而高斯模糊的边缘似乎有些问题,不是很清晰,怎么办?

4. 模糊的圆环边缘如何处理?

其实很简单,外部容器尺寸限制,里面模糊元素适当transform比例放大就可以了,例如:

.circle {width: 300px; height: 300px;border-radius: 50%;position: relative;overflow: hidden;
}
.sector-group {filter: blur(15px);transform: scale(1.2);
}复制代码

此时效果为:

5. 使用mask遮罩是显示边缘圆环

CSS代码示意如下(实际开发webkit前缀不可省略)

.circle {width: 300px; height: 300px;border-radius: 50%;position: relative;overflow: hidden;mask: radial-gradient(transparent 110px, #000 110px);
}
.sector-group {filter: blur(15px);transform: scale(1.2);
}复制代码

最终,我们的12色彩虹渐变圆环效果即达成,如下Firefox浏览器下截图:

接下来就简单了,同样地,JS设置圆环clip-path动态剪裁,实现我们想要的倒计时效果。

眼见为实,您可以狠狠的点击这里:借助CSS3 filter模糊和clip实现的多彩圆环demo

优点和不足
优点在于真正意义上的锥形渐变,同时12种渐变颜色头首尾如贪吃蛇一样,完全融为了一体,更有视觉优势。

不足之处在于HTML和CSS代码稍微多了点。

四、结束语

严格来讲,本文一共介绍了四种彩色圆环渐变效果的实现,可以说各有优缺点,大家可以根据自己项目情况,选择合适的方法实现。

然而一个人的积累总是有限,而创意总是无限的,因此一定还有其他更好更妙更简单的实现,欢迎分享欢迎指教!

当然彩色渐变圆环效果不一定是用在倒计时上,例如下图这种loading效果(下图是图片实现的)实际上也可以完全通过CSS实现了,比较推荐的做法是使用左右半区的线性渐变加遮罩(在retina屏幕下效果真的赞),具体代码就不展示了,大家可以自己作为课后作业实践实践。

以上就是本文的全部内容,内容略多,感谢一直阅读到此处!

转载于:https://juejin.im/post/5bb337706fb9a05ce02a8c4a

3种纯CSS实现中间镂空的12色彩虹渐变圆环方法相关推荐

  1. html背景样式代码,12种纯CSS实现的背景图案样式代码

    这是使用纯css实现的背景图案样式,可以作用于任何元素甚至文本背景. 使用方法: 1使用NPM安装并下载pattern.css. 2导入pattern.css. 3.或在html文档中加载patter ...

  2. php实现动态按钮效果,纯css实现MaterialDesign水滴动画按钮效果的js实现方法

    本篇文章给大家带来的内容是关于纯css实现Material Design水滴动画按钮效果的js实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在上一篇,我们已经实现了用纯cs ...

  3. 【CSS特效扫盲】精选40种纯CSS特效应用实例,肝了10个晚上整理纯CSS特效(上)(附源码下载)

    [写在前面]其实有时候经常会在某一天用到某种特效,然后就去网上找demo,千篇一律的CSS特效代码不说,更多的是滥竽充数,而且还没有特效预览图,因此针对我之前整理的CSS特效在这里做一个总结,希望给你 ...

  4. html5 图片hover,关于html5:两种纯CSS方式实现hover图片popout弹出效果

    实现原理 次要图形的组成元素由背景和前景图两个元素,以下示例代码中,背景元素应用伪元素 figure::before 示意, 前景元素应用 figure img 示意,当鼠标hover悬浮至figur ...

  5. 几种纯css布局的导航栏

    1.垂直导航栏 页面效果 <ul class="nav"><li><a href="home.htm">Home</a ...

  6. 纯css用图片代替checkbox和radio,无js实现方法

    html <ul id="is_offical_post_links"> <li><label><input type="che ...

  7. 纯css实现手风琴效果_创建纯CSS手风琴的4种方法

    内容手风琴是一种有用的设计模式. 您可以将它们用于许多不同的事物:用于菜单,列表,图像,文章摘录,文本片段甚至视频 那里的大多数手风琴都依赖JavaScript,主要是jQuery ,但是由于高级CS ...

  8. java实现星级评分功能_纯CSS的星级评价效果

    前言 这种星星评价效果,相信大家这个并不陌生,经常会遇到这个.现在如果要我们自己实现一个,很多人第一反应可能用JS+CSS去实现它.这种方式并没有什么不好的地方,只是我们在复用的时候不是很方便,需要带 ...

  9. 如何在HTML中设计步骤进度条,使用纯CSS制作步骤进度条

    步骤进度条的使用场景很多,比如说购物流程 .订单流程.面试流程等都要用到它.网上常见的做法是使用CSS图片精灵,该做法的优点是兼容性强,但缺点也很明显:难以自适应设备,而且会加载额外的 图片资源.有没 ...

最新文章

  1. Html_div圆角
  2. 软件测试培训完就业方向怎么选择
  3. 汇编语言Makefile
  4. Vivado 自定义VHDL的IP核
  5. 微信公众平台开发(73) 客服接口发送客服消息
  6. fastify 后台_如何使用Fastify启动和运行
  7. python 不显示前几个字符_「Python 秘籍」删除字符串中不需要的字符
  8. ubuntu 16.04 nfs服务的搭建
  9. 图灵奖颁给深度学习三巨头,他们曾是一小撮顽固的“蠢货”
  10. android 出现在默认应用程序,如何将我的应用程序设置为默认的SMS应用程序?
  11. JDK版本变化也太快了,意义有多大?
  12. 牛客网 牛客小白月赛1 A.简单题-控制输出格式setiosflags()函数+setprecision()函数
  13. 【BLE MIDI】MIDI 文件格式分析 ( MIDI 文件头解析 | MIDI 文件头标识 | MIDI 文件头长度 | MIDI 文件格式 | MIDI 轨道个数 | 基本时间 )
  14. 纯MSDOS操作系统下的计算机重启与关机
  15. Sphinx速成指南
  16. 笔记本计算机的功率一般多少,笔记本电脑功率是多少?
  17. dns服务器未响应重启就好,网络诊断提示DNS服务器未响应解决方法 - 全文
  18. 通用课程表教师表php,利用Access实现学校课程表的科学管理
  19. Reflexive公司小游戏下载地址
  20. CSS之标签选择器、ID选择器、类选择器

热门文章

  1. jenkins简单部署
  2. 用shell打印下面这句话中字母数小于6的单词
  3. Android开发学习——Android Studio配置SVN
  4. 备份MySQL数据库的命令
  5. tom启动报错:org.xml.sax.SAXParseException: Content is not allowed in prolog.
  6. 活动目录网域中禁用移动存储(U盘)
  7. WINDOWS SERVER 2003 DHCP服务器全攻略
  8. php dns更新,php_mzdns: 站群,大量域名 通过 dns 服务商 api 批量添加 ip 工具。你懂的~ 基于 mzphp2 框架。...
  9. mysql size_mysql fetch size 相关问题
  10. python数学建模可视化_数学建模之流程图和数据可视化