js矢量图类库:Raphaël—JavaScript Library

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

Raphaël is a small JavaScript library that should simplify your work with vector graphics on the web. If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it simply and easily with this library.

Raphaël ['ræfeɪəl] uses the SVG W3C Recommendation and VML as a base for creating graphics. This means every graphical object you create is also a DOM object, so you can attach JavaScript event handlers or modify them later. Raphaël’s goal is to provide an adapter that will make drawing vector art compatible cross-browser and easy.

Raphaël currently supports Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+ and Internet Explorer 6.0+.

 

最近在做一个关于客户与品牌,客户与代理关系的展示,由于用二维表展示不是很直观,所以就想做个比较直观的,在网上搜到了Raphael,就小试了一下,感觉不错;

下面是试用结果截图:

image

image

源码如下:

 

var data = {"customer": "方正电子","brands":[{ "brand": "经略广告" },{ "brand": "文韬采编" },{ "brand": "飞腾创艺" },{ "brand": "畅享全媒体" }]};var r = Raphael("holder", 500, 500);angle = 0;var interval = 36;if (data != null && data.brands.length > 0) {if (data.brands.length < 13) {interval = 360 / data.brands.length;}}var centerX = 250;var centerY = 250;var mc = Raphael.getColor();mc = Raphael.getColor();// mc = Raphael.getColor();var index = 0;while (angle < 360) {var color = Raphael.getColor();(function (t, c) {r.circle(centerX, 400, 50).attr({ stroke: c, fill: c, transform: t, "fill-opacity": .4 }).click(function () {}).mouseover(function () {this.animate({ "fill-opacity": .95 }, 500);}).mouseout(function () {this.animate({ "fill-opacity": .4 }, 500);});})("r" + angle + " " + centerX + " " + centerY + "", color);var path_transform = "r" + angle + " " + centerX + " " + centerY + "";r.path("M" + centerX + "," + centerY + "L" + centerX + ",350z").attr({ stroke: mc, fill: mc, transform: path_transform + "," + mc, "fill-opacity": .4 });var brandName = r.text(centerX, 400, data.brands[index].brand).attr({font: '16px Arial',fill: '#000',transform: path_transform + "," + mc}).toFront();brandName.rotate(0 - angle, brandName.x, brandName.y);index++;angle += interval;}var s = r.set();s.push(r.circle(centerX, centerY, 60));s.attr({ stroke: mc, fill: mc }).mouseover(function () {this.animate({ "fill-opacity": 1.75 }, 500);}).mouseout(function () {this.animate({ "fill-opacity": 1 }, 500);});s.push(r.text(centerX, centerY, data.customer).attr({ font: '16px Arial', fill: '#fff' }));
var data = {"customer": "联想集团","agents":[{ "agent": "中关村在线" },{ "agent": "苏宁电器" },{ "agent": "国美电器" },{ "agent": "京东商城" },{ "agent": "淘宝商城" }]};var containerW = 500;var containerH = 500;var r = Raphael("holder", containerW, containerH);var boxW = 70; //方框宽度var boxH = 30;  //方框高度var subBoxY = 150; //代理框的y坐标var paddingY = 10; //图的内边距 var angle = 0;var interval = 10;if (data != null && data.agents.length > 0) {if ((parseInt(boxW, 10) * data.agents.length) < containerW) {//间隔=(containerW-代理个数*boxW)/代理个数+1)interval = ((parseInt(containerW, 10) - (parseInt(boxW, 10) * data.agents.length)) / (data.agents.length + 1));}}var mainColor = Raphael.getColor();mainColor = Raphael.getColor();//画当前客户框var mainBoxX = ((parseInt(containerW, 10) - parseInt(boxW, 10)) / 2);var mainBox = r.rect(mainBoxX, paddingY, boxW, boxH).attr({ stroke: mainColor, fill: mainColor, "fill-opacity": .4 }).mouseover(function () {this.animate({ "fill-opacity": .95 }, 500);}).mouseout(function () {this.animate({ "fill-opacity": .4 }, 500);});//写客户名称r.text(mainBoxX+(boxW/2), paddingY+(boxH/2), data.customer).attr({ font: '12px Arial', fill: '#fff' })//画中间横线var mX = (interval + ((parseInt(boxW, 10) / 2)));var mY = ((parseInt(subBoxY, 10) - parseInt(paddingY, 10) - parseInt(boxH, 10)) / 2) + parseInt(paddingY, 10) + parseInt(boxH, 10);r.path(Raphael.format("M{0},{1}L{2},{3}z",mX,mY,(containerW - mX),mY));//画当前客户和横线的连接线r.path(Raphael.format("M{0},{1}L{2},{3}z",(parseInt(containerW, 10)/2),mY,(parseInt(containerW, 10) / 2),parseInt(paddingY, 10) + parseInt(boxH, 10)));angle = interval;$.each(data.agents, function (i) {//生成多个代理框var color = Raphael.getColor();var box1 = r.rect(angle, subBoxY, boxW, boxH).attr({ stroke: color, fill: color, "fill-opacity": .4 }).click(function () {}).mouseover(function () {this.animate({ "fill-opacity": .95 }, 500);}).mouseout(function () {this.animate({ "fill-opacity": .4 }, 500);});//画线r.path(Raphael.format("M{0},{1}L{2},{3}z",(angle+(boxW/2)),subBoxY,(angle+(boxW/2)),mY));//写代理名称r.text(angle + (boxW / 2), subBoxY + (boxH / 2), data.agents[i].agent).attr({ font: '12px Arial', fill: '#fff' })angle += parseInt(boxW, 10) + interval;});

转载于:https://www.cnblogs.com/HeroBeast/archive/2011/12/20/2295021.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;

//Innodb批量页面刷盘情况下的"两次写"//之前的文章中&#xff0c;我们介绍过innodb的两次写特性&#xff0c;这里给出链接&#xff1a;InnoDB的两次写特性今天我们完善一下这部分的内容。我们知道innodb数据页的默认大小是16kb&#xff0c;磁盘和内存通过数据页进行…

实例解析linux内核I2C体系结构(1)

作者&#xff1a;刘洪涛,华清远见嵌入式学院讲师。 一、概述 谈到在linux系统下编写I2C驱动&#xff0c;目前主要有两种方式&#xff0c;一种是把I2C设备当作一个普通的字符设备来处理&#xff0c;另一种是利用linux I2C驱动体系结构来完成。下面比较下这两种驱动。 第一种方…

★ Flex を使って Scalable Vector Graphics とビットマップを描画する

from: http://www.ibm.com/developerworks/jp/web/library/wa-svgbitmap/Flex を使って Scalable Vector Graphics とビットマップを描画するSandeep Malik, Tech Lead, IBM 概要&#xff1a; SVG (Scalable Vector Graphics) はグラフィックスの領域で最も重要な技術の 1 つで…

g5420 win7集显驱动_台式机装WIN7?雷我已经趟完了

注&#xff1a;本文只用于PC爱好者交流测试&#xff0c;文中所有测试版系统均只用于测试&#xff0c;不得用于个人或商业用途。Windows全面更新至win10版本后&#xff0c;改装Win7系统逐渐变得越来越艰难。厂商BIOS中逐渐舍弃了原始界面改为图形化&#xff0c;传统Legacy模式无…

制作完整的java可执行文件

帮教务处的老师做了一个小软件&#xff0c;所以学习了一下制作java可执行文件&#xff0c;在此分享一下。 说明&#xff1a;因为是做完很长一段时间后再截的图&#xff0c;可能有点纰漏&#xff0c;大体应该没什么问题。 我的eclipse工程文件目录: bin | images&#xff08;放图…

ajax中async_小猿圈web前端之ajax的同步和异步有怎样的区别?

对于ajax我们应该知道ajax是主要用来在前端页面中向服务器后端请求数据&#xff0c;ajax中根据async的值不同分为同步&#xff08;async false&#xff09;和异步&#xff08;async true&#xff09;两种执行方式&#xff0c;那么&#xff0c;ajax的同步和异步请求两种方式有…

mysql存储引擎的区别_Mysql的两种存储引擎以及区别

一、Mysql的两种存储引擎1、MyISAM&#xff1a;①不支持事务&#xff0c;但是整个操作是原子性的(事务具备四种特性&#xff1a;原子性、一致性、隔离性、持久性)②不支持外键&#xff0c;支持表锁&#xff0c;每次所住的是整张表MyISAM的表锁有读锁和写锁(两个锁都是表级别)&a…

带给你灵感的3D街画艺术设计

3D街头艺术画已在16世纪以来意大利文艺复兴时期的Madonnari画家创造了令人惊叹的壁画来装饰豪华别墅的内墙。3D艺术也可以跟踪它的航线&#xff0c;。这里有一些新的图像&#xff0c;这将使你想知道它是如何可能的使东西是如此逼真&#xff0c;3D设计们不要错过 1。 &#xff0…

[原]2011年度生活三层总结

一年了。 想到自己从开始没有目标&#xff0c;误打误撞的来到了提高班到现在的成长。我是多么的幸运&#xff0c;幸运的来到廊坊师范&#xff08;现在都要称之为母校了&#xff09;&#xff0c;幸运的来到了提高班&#xff0c;遇到了米老师&#xff0c;在此感谢。 一年了。改变…

hp laser103 属性没有配置项_哦?在hp打印机面板上就可以更改打印机ip地址

修改打印机IP的方法有很多但都没有直接从打印机控制面板上修改方便过瘾虽然有些机器不支持但是惠普大部分机器还是可以的今天我们就以 LaserJet M227 系列打印机为例hp官方为大家介绍一下具体的设置方法步骤一&#xff1a;打印配置报告查看有效IP地址如果机器是2行控制面板 1.在…

python去掉最高分和最低分_去掉一个最高分,去掉一个最低分求平均值(trimmean)...

如下图&#xff1a;演讲比赛&#xff0c;要求去掉一个最高分&#xff0c;去掉一个对低分后求平均值。当然这个太简单了&#xff0c;我们可以用max求出最大值&#xff0c;用min求出最小值&#xff0c;然后sum求出数据总和&#xff0c;用(总和-最大值-最小值)/(数据总个数-2)。思…

[Oracle整理]CASE-END

说明&#xff1a;本内容是工作用到的知识点整理&#xff0c;来自工作中和网络。 代码于Oracle9上测试。 作用: 1可用来进行数据资料行转列的功能 2可用来对数据进行判断&#xff0c;类似decode&#xff0c;但CASE语句在处理范围条件的时候会显得非常灵活。如果只是需要匹配少量…

C# 线程手册 第三章 使用线程 Monitor.TryEnter()

Monitor 类的TryEnter() 方法在尝试获取一个对象上的显式锁方面和 Enter() 方法类似。然而&#xff0c;它不像Enter()方法那样会阻塞执行。如果线程成功进入关键区域那么TryEnter()方法会返回true. TryEnter()方法的三个重载方法中的两个以一个timeout类型值作为参数&#xff0…

pycharm不同py文件共享参数_PyCharm安装笔记

1. 介绍1.1 介绍今天福哥带着大家学习如何安装非常好用的Python编辑器&#xff0c;也就是jetbrains全家桶的PyCharm编辑器。PyCharm是jetbrans开发的一款专门用来编写Python程序的编辑器&#xff0c;它的自动补全、代码联想、框架支持、插件支持以及高效的反应速度成为了编写Py…

Windows与linux双系统安装

[源] [http://xiaomaimai.blog.51cto.com/1182965/294256] Windows与linux双系统 Linux的安装方式有硬盘安装、网络安装、光驱安装。 双系统的安装最后先安装windows&#xff0c;再安装linux&#xff0c;因为windows每次安装时都会重新修改系统引导文件&#xff0c;如果安装…

第一步:Axure 使用svn多人协作产品开发(提交文件)

注册登陆http://www.svnxiezuo.com站点 注册登陆http://www.svnxiezuo.com站点 从注册http://www.svnxiezuo.com站点获取svn项目地址 编辑axure文件 开始创建axure共享文件 创建axure共享文件 axure提交文件到svn版本库当中 登陆http://www.svnxiezuo.com站点svn版本库 axure创…

python socketio async client_electron/socket.io client-python socketio/aiohttp server//连接失败

此websocket连接失败。有趣的是这几天前还在起作用。我把电子从6降到了5.0.6,但这没用。服务器from aiohttp import webimport socketioapp web.Application()sio socketio.AsyncServer()# or sio socketio.AsyncServer(cors_allowed_origins*)sio.attach(app)sio.on(connec…

领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型

领导者/追随者&#xff08;Leader/Followers&#xff09;模型和半同步/半异步&#xff08;half-sync/half-async&#xff09;模型都是常用的客户-服务器编程模型。这几天翻了些文章&#xff0c;发现对领导者/追随者模型说的比较少&#xff0c;下面就这个模型打个比方&#xff1…

网络编程模型综述 之 成熟的IO框架介绍

ACE “重量级的C I/O框架&#xff0c;用面向对象实现了一些I/O策略和其它有用的东西&#xff0c;特别是它的Reactor是用OO方式处理非阻塞I/O&#xff0c;而Proactor是用OO方式处理异步I/O的( In particular, his Reactor is an OO way of doing nonblocking I/O, and Proactor …

网络编程模型综述 之 多线程模型

每个连接对应一个线程 一个网络socket对应一个处理线程&#xff0c;socket采用阻塞I/O模型&#xff1b; 这种模型是小程序和java常用的策略&#xff0c;对于交互式的长连接应用也是常见的选择(比如BBS)&#xff0c;也常用来做内部服务器交互的模型。这种策略很难满足高性能程序…