svg 圆环进度动画

简介

近日业务需要,特来钻研一阵,最后选型svg技术实现,因为方便。

实现步骤

一、先画一圆环

<svg xmlns="http://www.w3.org/2000/svg" height="110" width="110" viewBox="0 0 110 110">
    <circle cx="50%" cy="50%" r="50" stroke-width="10" stroke="#F2F2F2" fill="none"></circle>
</svg>

定义让外层容器为宽高110px的正方形,并且定义在容器的中心处(cx="50%"" cy="50%")画半径为50px的圆(r="50"),圆的内容不着色(fill="none")。描边为10px,着描边色为灰色(stroke-width="10" stroke="#F2F2F2")

二、再来一层绿色圆环叠加

<svg xmlns="http://www.w3.org/2000/svg" height="110" width="110" viewBox="0 0 110 110">
    <circle cx="50%" cy="50%" r="50" stroke-width="10" stroke="#F2F2F2" fill="none"></circle>
    <circle id="ring" cx="50%" cy="50%" r="50" stroke-width="10" stroke="green" fill="none"
    transform="rotate(-90 55 55)"
    stroke-dasharray="100, 314"></circle>
</svg>

下面的 circle 着描边为绿,并且写上了 stroke-dasharray ,此属性参数第一个数值表示dash,这里代表覆盖范围,后一个数字表示gap长度默认为circle的周长314。此外tranform属性的作用是将圆环从0点位置开始覆盖,不写此属性则从3点位置开始覆盖(rotate第一个参数为角度,第二个和第三个参数为旋转中心,这里为容器的中心)。

三、给圆环加入渐变色

<svg xmlns="http://www.w3.org/2000/svg" height="110" width="110" viewBox="0 0 110 110">
    <linearGradient id="svg-gradient" gradientUnits="userSpaceOnUse" x1="100%" y1="100%" x2="0%" y2="0%">
        <stop offset="0%" style="stop-color:yellow"/>
        <stop offset="100%" style="stop-color:green"/>
    </linearGradient>
    <circle cx="50%" cy="50%" r="50" stroke-width="10" stroke="#F2F2F2" fill="none"></circle>
    <circle id="ring" cx="50%" cy="50%" r="50" stroke-width="10" fill="none"
    stroke="url(#svg-gradient)"
    transform="rotate(-90 55 55)"
    stroke-dasharray="200, 314"></circle>
</svg>

id为ring的 circle 改变了stroke属性为 url(#svg-gradient) ,意为以上面的 linearGradient 背景,以起点黄到终点绿渐变。

四、加入动画

<style>
circle {
    -webkit-transition: stroke-dasharray 2s;
    transition: stroke-dasharray 2s;
}
</style>

设置css动画持续2s

<svg xmlns="http://www.w3.org/2000/svg" height="110" width="110" viewBox="0 0 110 110">
    <linearGradient id="svg-gradient" gradientUnits="userSpaceOnUse" x1="100%" y1="100%" x2="0" y2="0">
        <stop offset="0%" style="stop-color:yellow"/>
        <stop offset="100%" style="stop-color:green"/>
    </linearGradient>
    <circle cx="50%" cy="50%" r="50" stroke-width="10" stroke="#F2F2F2" fill="none"></circle>
    <circle id="ring" cx="50%" cy="50%" r="50" stroke-width="10" fill="none"
    stroke="url(#svg-gradient)"
    transform="rotate(-90 55 55)"
    stroke-dasharray="0, 314"></circle>
</svg>

id为ring的 circle 改变了 stroke-dasharray 使其 dash 参数初始化为0。

var targetRing = document.getElementById('ring');
var totalLength = targetRing.getTotalLength();

targetRing.style.strokeDasharray = totalLength + ', ' + totalLength;

设置改变 circlestroke-dasharray,0为初始,而周长314为一整个圆(直径为100可算得)。

注意

如果改变了圆环尺寸,以下需要更改

  • svg 容器的 widthheight,还有 viewBox
  • 两个 circler 值 还有 stroke-width
  • #ringtransform=rotate() 里的后两个参数为容器的中心坐标
  • #ringstroke-dasharray 里的最后一个参数当为圆的周长

参考

原文地址:https://www.cnblogs.com/everlose/p/12537256.html

时间: 2024-08-29 20:30:26

svg 圆环进度动画的相关文章

svg实现圆环进度条

<!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <title>圆环进度条</title> <style type="text/css"> circle{ -webkit-transition: stroke-dasharray .25s; transition: stroke-dasharray .25s; } </s

用svg制作loading动画

首先说明:由于各浏览器对svg动画事件支持不统一,此loading动画在Firefox,Opera,Chrome中均没有问题,IE和Safari中有问题,可能是不支持SIML写动画的语法, 但是用Canvas写的话,在颜色的渐变方面会有问题: 线性渐变需要传递四个参数 xstart:渐变开始点x坐标       ystart:渐变开始点y坐标       xEnd:渐变结束点x坐标       yEnd:渐变结束点y坐标 这样画出来的渐变只能用于矩形之类的图形,无法应用在诸如扇形内,此loadi

两种CSS3圆环进度条详解

晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第一种:通过overflow溢出隐藏的方式: 这种方法好处在于容易理解,只需要一层一层的嵌套,即可得到效果,但是实现起来较为繁琐,HTML的结构也比较冗余. 先看HTML结构: <div class="circle-one"> <div class="circle

超级强大的SVG SMIL animation动画详解

本文花费精力惊人,具有先驱前瞻性,转载规则以及申明见文末,当心予以追究.本文地址:http://www.zhangxinxu.com/wordpress/?p=4333 //zxx: 本文的SVG在有缓存时候是无动画效果,此时您可以试着[右键-新标签页打开图片]. 一.SVG SMIL animation概览 1. SMIL是什么?SMIL不是指「水蜜梨」,而是Synchronized Multimedia Integration Language(同步多媒体集成语言)的首字母缩写简称,是有标准

Android 自定义View修炼-自定义加载进度动画LoadingImageView

一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. 直接看下面的效果图吧. 二.效果图 废话不说,先来看看效果图吧~~ 三.实现原理方案 1.自定义View-XCLoadingImageView,继承ImageVIew来实现,这样就不用自己再处理drawable和测量的工作内容. 2.根据蒙层颜色创建一个蒙层bitmap,然后根据这个bitmap来

模拟下载进度动画 (动画监听)

//监听事件 -(void)setUpSomething{ UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapped:)];     [self addGestureRecognizer:tapGes]; } //点击动画 #pragma mark -- UITapGesture -(void)tapped:(UITapGestureRec

SVG的路径动画效果

使用SVG animateMotion实现的一个动画路径效果,相关代码如下. 在线调试唯一地址:http://www.gbtags.com/gb/debug/c88f4099-5056-4ad7-af4e-0ededd4f65d2.htm 原文来自:SVG的路径动画效果

ProgressWheel:Android开源圆环进度条

这是一个自定义Android组件,用于代替标准进度条组件.实现各种进度条样式,包括圆环,扫描等. XML: 在你的attr.xml(res/value)中加入以下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <declare-styleable name="ProgressWheel"> <attr name="text"format="string"/> <attr name=&q

用Raphael在网页中画圆环进度条

原文 :http://boytnt.blog.51cto.com/966121/1074215 条状的进度条我们见得太多了,实现起来比较简单,它总是长方形的,在方形的区域里摆 放就不太好看了.随着css3的出现,圆环状的进度条开始用得越来越多,不过由于IE6/7/8不支持css3,我们只能换其它方法来实现.本文就采用 Raphael来画一个,这个组件对svg和vml进行了一个统一的封装,根据浏览器使用不同的技术实现绘制,因此IE也能用. 先上效果图: 效果还不错吧?代码其实也不复杂,抛砖引玉一下