用css动态实现圆环百分比分配——初探css3动画
最近的小程序项目有个设计图要求做一个圆环,两种颜色分配,分别代表可用金额和冻结金额。要是就直接这么显示,感觉好像挺没水平??于是我决定做个动态!
在mdn把新特性gradients(渐变)、transitions(过渡)、 animations(动画) 都看了一遍,不禁感叹css牛逼!这三个新特性加上canvas,仿佛一瞬间有了正面刚js的能耐。用js很难过渡得那么完美,而且浏览器的css渲染明显比用js性能好得多。
然后看了张鑫旭(传说中玩转css的那个男人)的一篇关于圆环的博文,拍案叫绝。链接=>3种纯CSS实现中间镂空的12色彩虹渐变圆环方法
只能说服气!除了灵活运用各种css特性之外,鑫大佬最让我佩服的是他的创造性思维。会让你不禁感叹:卧槽,还有这种操作?!想到了高中物理老师每次装完逼讲的一句话:思想有多远,就能走多远。
虽然demo跟我的需求不太一样,问题还是没有解决,但我认真看完之后还是学会了很多,对我后面的代码帮助很大。鑫大佬这篇博文的重点还是在渐变,而我需要动态平缓连续得实现颜色的分配,比如原本整个环是绿色,然后慢慢地60%被红色占了,而且整个过程要平滑。跟我的需求最接近的就是倒计时那个demo,linear-gradient线性渐变实现的多彩圆环demo,但不是连续的过程,而是通过剪裁,每次剪30度。
看了其他一些博客分享,好像也没有找到合适的,那没办法了...只能自己想一个!
因为再写这个demo的时候,发现小程序和H5在css表现上还是有些差异(具体有哪些差异,在文末总结),所以还是贴H5代码好了。
不多说,直接上代码
代码部分
//html部分
<div class="circle">
<div class="circle-left"></div>
<div class="circle-right"></div>
<div class="circle-bottom-left"></div>
<div class="circle-bottom-right"></div>
</div>
<div class="info">¥4500/¥5000</div>
//css部分
.circle {
-webkit-mask: radial-gradient(transparent 150px, #000 150px);
width: 400px;
height: 400px;
overflow: hidden;
border-radius: 50%;
position: relative;
}
.circle-left {
width: 50%;
height: 100%;
background: #24B39B;
transform-origin: 100% 50%;
position: absolute;
left: 0;
z-index: 0;
}
.circle-right {
width: 50%;
height: 100%;
background: #24B39B;
transition: transform 1s linear;
transform-origin: 0% 50%;
position: absolute;
right: 0;
z-index: 2;
}
.circle-bottom-left {
width: 50%;
height: 100%;
background: rgb(234, 67, 15);
position: absolute;
left: 0;
z-index: -1;
}
.circle-bottom-right {
width: 50%;
height: 100%;
background: rgb(234, 67, 15);
position: absolute;
right: 0;
z-index: 1;
}
.info {
width: 400px;
height: 400px;
line-height: 400px;
text-align: center;
margin-top: -400px;
}
//js代码
window.onload = function () {
var red = 4500, total = 5000 //红色区域代表的金额和总金额
var percent = red / total
var right = document.getElementsByClassName('circle-right')[0]
var left = document.getElementsByClassName('circle-left')[0]
if (percent <= 0.5) { //红色区域不超过一半
right.style.transform = `rotate(${percent * 360}deg)`
} else { //红色区域超过一半的情况,重点部分
right.style.transform = `rotate(180deg)`
right.style.transition = `opacity 0s step-end 1s, transform 1s linear` //timing-function需要设为linear来达到视觉上的平缓过渡
right.style.opacity = 0
left.style.transition = `transform ${(percent - 0.5) / 0.5}s linear 1s`
left.style.transform = `rotate(${percent * 360 - 180}deg)`
}
}
效果图
思路
st=>start: 开始
e=>end: 结束
con=>condition: degree<=180?
op1=>operation: 右绿旋转
op2=>operation: 右绿旋转180度,opacity变为0,然后左绿旋转
st->con
con(yes)->op1->e
con(no)->op2->e
难点在于红色区域大于一半的情况,左右绿色半圆的衔接,过渡要自然,不能让人看出什么明显的破绽。
**这种情况我的做法是:4个半圆(红绿各两个)的z-index设为左红<左绿<右红<右绿
两个绿半圆的transform的time-function(时间函数)统一设为linear(线性)。右绿旋转180度(1秒)后opacity立即变成0(时间函数step-end),这样就不会挡住左红露出。然后左绿开始转(transform延迟1秒执行,因为要等待右绿转完),它转的时间要根据度数动态控制,比如总共要转270度,右绿转了180度,所以左绿只需要转90度。这就好办了,为了保持右绿的旋转速度,时间和度数要成比例,右绿转180度用1s,左绿转90度只能用0.5s
优点
1. 不需要js代码动态实现动画(js只用来计算度数和触发transition)
2. 因为对js几乎没什么依赖,浏览器内核直接渲染,性能较好,过渡自然
3. 代码量很少
不足
1. 因为是css3的属性,兼容不会太好
2. 时间函数只能用线性linear,用默认的ease(不匀速)会衔接不上
3. 只能两种颜色分布,再加一种的话行不通
有更好办法实现相同效果的大佬,欢迎留言!
问题探究&解决
虽然效果图gif画质有点感人,但还是可以发现一个问题:内环边缘明显很粗糙!这个要怎么解决呢?
中间这个透明遮罩的代码是`-webkit-mask: radial-gradient(transparent 150px, #000 150px);
我的做法就是把transparent 150px改成transparent 148px,就是说空出一两个像素点,让粗糙的部分虚化。
至于为什么会出现粗糙,额。。。我觉得是150px这一层上了太多颜色,加上本来画弧圈就没有防锯齿处理,色素点可能会拥挤,加剧了锯齿状这种效果。具体是什么原因,或者有更好的解决办法,欢迎大佬指教。
修改后的效果图
是不是明显好很多~
上文提到的小程序的css和h5的差异,经过再一次的实验,发现不是小程序内核渲染的问题,应该是微信开发者工具显示的问题。。。希望尽快能得到改善,不然对开发人员影响挺大的
这个info的盒子margin-top负数在工具中显示翻不上去,但内容50000上去了.
过了几秒再点(啥都没干),这个info的盒子又跑到这里来
为了验证这个info的盒子到底有没有上去,我加了一个红色的盒子,发现并没有被info盒子挤掉
取消info的margin-top属性,红色的盒子被挤掉,内容50000也下来了
终于!!!原来都是开发者工具摆的乌龙,其实info盒子一直在上面,只是调试不能正常显示他的位置。。。
话说回来,小程序不能获取DOM节点操作DOM,突然觉得只能数据驱动,不能操作DOM节点有时也挺麻烦的,transition那些需要动态改的样式只能写到style了。。。
最后,看好小程序,希望各种问题能尽快完善,越来越好。
用css动态实现圆环百分比分配——初探css3动画的更多相关文章
- CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码
CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码 CSS Animatie 彩蛋爆料直击现场 CSS Animatie是一款在线制作CSS3动画的工 ...
- animate.css 一些常用的CSS3动画效果
大家已经开始在项目中使用一些CSS3动画效果了吧,这让网站在高端浏览器上看起来很上流.animate.css是一个老外做的各种CSS3动画的合集,比较全,也很炫,大家可以参考学习一下. 项目主页:ht ...
- css3圆环百分比,菜单栏定位导航
前段时间,社区个人中心改版,看了下设计图,当时隐约感觉到有两个地方(圆环百分比,菜单栏定位导航)比较麻烦.设计图大致如下: 首先看圆环百分比,网上的做法大致分两种,一种是用了CSS3中的transfo ...
- js、css动态压缩页面代码
1.js.css动态压缩页面代码 <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- Android NumberProgressBar:动态移动显示百分比进度的进度条
Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.c ...
- 奇思妙想 CSS 3D 动画 | 仅使用 CSS 能制作出多惊艳的动画?
本文将从比较多的方面详细阐述如何利用 CSS 3D 的特性,实现各类有趣.酷炫的动画效果.认真读完,你将会收获到: 了解 CSS 3D 的各种用途 激发你新的灵感,感受动画之美 对于提升 CSS 动画 ...
- 【WEB前端系列之CSS】CSS3动画之Animation
前言 动画使用示例https://github.com/AndyFlower/web-front/tree/master/css3/loading 学习CSS3中Animation之前先来看一个动画特 ...
- CSS属性、伪类选择器,CSS3选择器
CSS1时IE6是部分支持,伟大的IE6!CSS2时IE6部分支持,伟大的IE6依旧是部分支持!CCS3盛行CSS4也已经提上日程的现在,IE6完全不支持.IE6你该走了,我们会永远记住你的功绩的!I ...
随机推荐
- Ribbon&OpenFeign配置使用
目录 Ribbon 是什么 工作流程 怎么用 负载算法 官方提供算法 使用方法 自定义负载算法 在rule包下新建MyRule 修改自定义策略类RbRule 测试 OpenFeign 是什么 怎么用 ...
- json web token JWT实现TP5创建和验证
根据博客进行jwt初始化配置 https://blog.csdn.net/weixin_43389208/article/details/117442266?spm=1001.2014.3001.55 ...
- 输入URL到页面加载过程
URL(uniform resource location) : 统一资源定位符,用来作为互联网上各种资源的标识符,可理解为身份证号 . 注意点:浏览器为了保证安全性,设定了跨域保护策略, 即窗口之间 ...
- MySQL 8.0安装以及初始化错误解决方法
MySQL 8.0 安装配置及错误排查 官网下载 CentOS7环境下的具体安装步骤 初始化MySQL发生错误的解决方法 忘记数据库root密码 官网下载 mysql官网下载链接:https://de ...
- 防止入侵 两步修改XP远程管理默认端口
自Windows 2000开始,微软就提供一项终端服务(Terminal Server)这项服务可以将远程的桌面传递到本地.通过该服务,可视化的远程管理可以非常方便的实现.继Windows 2000之 ...
- php——新闻项目改写
主要思路:遵守java开发规范,保持接口一致性 如何保持接口的一致性: (1).url的一致性:使用@RequestingMapping注解 (2).参数的一致性: 使用@ReuqestParam注解 ...
- Acwing 社交距离 分类讨论+贪心
一种新型疾病,COWVID-19,开始在全世界的奶牛之间传播. Farmer John 正在采取尽可能多的预防措施来防止他的牛群被感染. Farmer John 的牛棚是一个狭长的建筑物,有一排共 N ...
- go语言学习入门篇1---go语言的主要特性与发展
1.1 影响 Go 语言发展的早期编程语言 正如 "21 世纪的 C 语言" 这句话所说,Go 语言并不是凭空而造的,而是和 C++.Java 和 C# 一样属于 C 系.不仅如此 ...
- [WC2018]州区划分(FWT,FST)
[WC2018]州区划分(FWT,FST) Luogu loj 题解时间 经典FST. 在此之前似乎用到FST的题并不多? 首先预处理一个子集是不是欧拉回路很简单,判断是否连通且度数均为偶数即可. 考 ...
- 不想业务被中断?快来解锁华为云RDS for MySQL新特性
摘要:新特性上线!华为云RDS for MySQL又添新技能,实力保障业务连续性. 本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:Gauss ...