基于svg中的path画40%表示的环型图(js类库Raphaël)

 一、可供参考的文档资料。

raphaeljs官网:http://raphaeljs.com/

w3c关于path的介绍:http://www.w3.org/TR/2003/REC-SVG11-20030114/paths.html

mdn关于path的介绍(英文版):https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths

mdn关于path的介绍(中文版):https://developer.mozilla.org/zh-CN/docs/Web/SVG/Tutorial/Paths

二、简介

raphaeljs目前支持的浏览器: Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+, Internet Explorer 6.0+.

超级喜欢的一个demo:http://raphaeljs.com/polar-clock.html

因为它的部分功能是可以满足目前项目中的需求的。

当然,还有很多好看和实用的demo。

基本图形的画法,很简单,可以参考mdn(https://developer.mozilla.org/zh-CN/docs/Web/SVG)就可以掌握。

本文介绍使用path绘制环型图。

粗略介绍下:

path中的M表示move to,L表示line to, A表示arc.

弧形命令A是另一个创建SVG曲线的命令。基本上,弧形可以视为圆形或椭圆形的一部分。假设,已知椭圆形的长轴半径和短轴半径,另外已知两个点(它们的距 离在圆的半径范围内),这时我们会发现,有两个路径可以连接这两个点。每种情况都可以生成出四种弧形。所以,为了保证创建的弧形唯一,A命令需要用到比较 多的参数:

A rx ry x-axis-rotation large-arc-flag sweep-flag x y
a rx ry x-axis-rotation large-arc-flag sweep-flag dx dy

rx ry表示起点坐标,x y表示终点坐标。下图可以更好理解。

三、动手

给个实例吧。如下是我在理解的过程中写的代码。大家可以从官网下载raphaeljs,然后运行如下的代码。

<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta charset="utf-8">
        <title>Carl Test</title>
        <script src="./js/raphael.js"></script>
</head>
<body>
<div>
<canvas id="myc" width="300" height="300">
</canvas>
 <div >
   <svg height="52" version="1.1" width="52" xmlns="http://www.w3.org/2000/svg" style="position:relative">
      <desc>Created with Raphaël 2.1.2</desc>
      <path style="" fill="none" stroke="#f0f0f0" d="M26,4A22,22,0,1,1,25.99,4" stroke-width="6"/>
      <path style="" fill="none" stroke="#69d2ca" d="M26,4A22,22,0,0,1,37.78818948953793,44.57521436104433" stroke-width="6" />
    </svg>
</div>
 <div id="holder">
</div>
<script>
    var c = document.getElementById(‘myc‘);
    var ctx = c.getContext(‘2d‘);
    var init= true;

    for(var alpha=0;alpha<1000;alpha++){
    var R=100;
    var a = (90 - alpha) * Math.PI / 180,
                            x = 120 + R * Math.cos(a),
                            y = 120 - R * Math.sin(a);
    if(init){
     ctx.moveTo(x,y)
    }else{
        ctx.lineTo(x,y);
    }
    init=false;

    }
    ctx.stroke();
</script>
<script>
window.onload = function () {
                var r = Raphael("holder", 200, 200);
                    r.customAttributes.arc = function (value, total, R) {
                    var alpha = 360 / total * value,
                        a = (90 - alpha) * Math.PI / 180,
                        x = 100 + R * Math.cos(a),
                        y = 100 - R * Math.sin(a),
                        path;
                    if (total == value) {
                        path = [["M", 100, 100 - R], ["A", R, R, 0, 1, 1, 99.99, 100 - R]];
                    } else {
                        path = [["M", 100, 100 - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]];
                    }
                    return {path: path};
                };

                (function(){
                var value=40,total=100,R=40;
                    var t = r.path().attr({stroke: "#f0f0f0", "stroke-width": 10}).attr({arc:[100,total,R]});//100%
                    var sec = r.path().attr({stroke: "#69d2ca", "stroke-width": 10}).attr({arc: [0, total, R]});//0%            

                    sec.animate({arc: [value, total, R]}, 900, ">");//这个">"是表示动画效果的参数,900ms的时间动态画出40%的弧
                })();

};
</script>
</body>
</html>

四、总结

效果图:

为什么会有3个呢?

第一个圆是为了理解圆的参数方程,即如下代码所代表的含义。所以我用canvas画了出来。因为本人感觉使用canvas画弧或者圆,比svg好理解。只要理解这个算法就好。

  var a = (90 - alpha) * Math.PI / 180,
                            x = 120 + R * Math.cos(a),
                            y = 120 - R * Math.sin(a);

第二个圆,是直接使用svg画出来的。

第三个圆,就是raphaeljs生成在id=holder的div标签里的svg生成的环形图,亮点是动态显示。

京东旗下的金融板块,好多图都是使用Raphaël做的。如下的筹集进度就是一个环形图。

http://bill.jr.jd.com/buy/list.htm

时间: 2024-10-13 17:49:17

基于svg中的path画40%表示的环型图(js类库Raphaël)的相关文章

CSS和SVG中的剪切——clip-path属性和&lt;clipPath&gt;元素

剪切是什么 剪切是一个图形化操作,你可以部分或者完全隐藏一个元素.被剪切的元素可以是一个容器也可以是一个图像元素.元素的哪些部分显示或隐藏是由剪切的路径来决定的. 剪切路径定义了一个区域,在这个区域内的内容将会显示,而不在这个区域内的内容不会显示.这个区域被称之为“裁剪区域”.只要在这个区域之外的任何元素都不会显示.包括元素的内容.背景.边框.文本.轮廓等,甚至还包括他的子元素. 剪切的元素可以是任何容器和图片元素. 剪切路径的概念就相当于在元素上定义了一个视窗.它决定了元素哪些部分在这个“视窗

基于SVG的票面设计器开发总结

今天周六,原则上要休息,但想到下周还有一堆任务,还是先做一部分工作吧,就把之前做的票面设计器改了改,增加了上传图片和更换背景底图的功能.现在打算整理下这个设计器,也算对齐一个总结.不过这属于我们部门的产品,代码我使用截图的方式多一些.首先来看一下我做的这个票面设计器的最终效果图: 从截图中可以看到在页面里,专业点叫我在画布里增加了很多的元素,这些元素都与剧院票务相关包括项目.场次.地点,二维码等信息.上面的word截图是我今天做的功能,背景图我也换成了自定义的图片.光看这个页面其实不难做,因为页

[翻译svg教程]svg中的circle元素

svg中的<circle> 元素,是用来绘制圆形的,例如 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <circle cx="40" cy="40" r="24" style="stroke:#006600; fill:#00cc00"

svg-edit和svg中的自定义属性

用svg的码农们肯定知道,在path.rect等元数据中会加入一些自定义属性,保存于数据库,但是用svg-edit编辑器时, 读取的时候,无法读取些这些自定义属性.解决办法:找sanitize.js文件,在该数组中svgWhiteList找到相关元素,在后 面添加你自己的自定义属性就好了. "a": ["class", "clip-path", "clip-rule", "fill", "fill

SVG 学习&lt;八&gt; SVG的路径——path(2)贝塞尔曲线命令、光滑贝塞尔曲线命令

查阅一些关于贝塞尔曲线资料后,对贝塞尔曲线有了大概的了解. 个人对贝塞尔曲线的理解: 二次贝塞尔曲线:由起点.终点和一个控制点控制的范围内绘制的一条曲线: 三次贝塞尔曲线:由起点.终点和两个个控制点控制的范围内绘制的一条曲线: 四次贝塞尔曲线/五次贝塞尔曲线 ... ... 以此类推. 贝塞尔曲线命令 理解了什么是贝塞尔曲线,贝塞尔曲线命令就很好理解了. SVG中只能定义二次 三次贝塞尔曲线 二次贝塞尔曲线:Q x1 y1 x y: x1 y1 定义二次贝塞尔曲线控制点坐标, x y 定义二次贝

4种基于SVG的Material Design风格按钮点击波特效

svgripples是一款效果非常炫酷的基于SVG的Material Design风格按钮点击波特效.该点按钮击波特效共有4种不同的效果,分别为:圆形波,圆形渐变波,多边形波和线性渐变波.特效中通过TweenMax.js和SVG相结合,制作出邻人惊叹的点击波效果. 在线预览   源码下载 制作方法 HTML结构 该按钮点击波使用的SVG元素的代码非常简单.SVG中使用了<symbol>元素-它用于定义可重复使用的符号.并在<symbol>元素放置需要的SVG图形. 1 2 3 4

Silverlight中的Path

原文:Silverlight中的Path 在Silverlight中Path可能由直线.曲线.或者其他简单的图形对象组成.这篇文章旨在介绍如何使用XAML和C#来创建Path. 废话先行 Path可能由直线.曲线.简单图形对象(包括矩形.椭圆.和文本)组成.Path作为一个独立的图形对象来工作,所以对Path进行的操作,会影响到组成它的所有部分.例如,假设一个Path由一个直线.矩形和椭圆组成,我们通过红色画笔来创建Path,那么组成Path的部分(直线.矩形和椭圆)都将会使用红色画笔. 一个P

SVG 学习&lt;七&gt; SVG的路径——path

SVG的path可以理解外一支画笔,由一连串的命令控制画笔在SVG中绘制需要的形状. path通过属性 d 来编写画笔命令. 命令说明: 其中 大写命令坐标是绝对位置,小写命令坐标是相对位置. 直线命令: 例(大写命令): <path d="M10 10,L200 200,V50,H10,L10 10"/> 例(小写命令): <path d="m10 10,l200 200,v50,h10,l10 10"/> 直线命令解析: M/m:移动命令

深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例

原文:深入WPF中的图像画刷(ImageBrush)之1--ImageBrush使用举例 昨天我在<简述WPF中的画刷(Brush)??>中简要介绍了WPF中的画刷的使用.现在接着深入研究一下其中的ImageBrush. 如上文所述,ImageBrush是一种TileBrush,它使用ImageSource属性来定义图像作为画刷的绘制内容.你可以控制图像的缩放.对齐.铺设方式.ImageBrush可用于绘制形状.控件,文本等. 下面看看它的一些简单应用:首先看一下效果图片:先看看上图的左边部分