JS 操作svg画图
背景:
一共有3个文件:svg文件,html文件,js文件。
有一个svg图,使用embed标签,引入到了html文件中
svg文件:
<svg width="640" height="400" xmlns="http://www.w3.org/2000/svg" id="svgColumn">
<text x="200" y="20" font-size="20">SVG 华东地区手机12个月的数据 柱状图</text>
<line x1="20" y1="380" x2="620" y2="380" stroke="black" stroke-width="1.5" />
<line x1="20" y1="380" x2="20" y2="1" style="stroke: black; stroke-width: 1.5" />
<path d="M600 360 L620 380 L600 400 Z" style="stroke: black; stroke-width: 1" />
<path d="M1 20 L20 1 L40 20 Z" style="stroke: black; stroke-width: 1" />
</svg>
HTML文件中:
<div id="svg1">
<embed src="./baidu34-36(svg-canvas)/column.svg" id="embed" width="640" height="400"
type="image/svg+xml">
</div>
然后使用js文件来操纵svg,插入图形。
第一个拦路虎:获得svg dom,
如果你的svg是直接写在html文件中,那么,svg和HTML共用一个document,可以直接通过document.getElementById(svg的id)就可以获得。
可是,一般情况下,不建议混在一起使用,比如我这里的column图就是单独一个svg文件,然后使用embed插入到HTML中的。
注意:使用embed、object插入的svg文件,其有完全属于自己的document:

此时,再想拿到svg, 则需要使用:getSVGDocument();
使用方法: 先拿到embed节点,再拿svg document,再拿svg节点:
function drawColumn(data) {
var nameSpace = 'http://www.w3.org/2000/svg';
var max = Math.max.apply(null, data);
var proportion = 350/max;
var interval = 35; //column间隔
var columnStyle = 'stroke: blue; fill: orange';
var embedSVG = document.getElementById('embed').getSVGDocument().getElementById('svgColumn');
//关键代码:embedSVG的赋值。最后的getElementById('svgColumn'),是svg文件中,svg标签的id
for (let singleColumn of data) {
var rect = document.createElementNS(nameSpace,'rect');//creat新的svg节点,rect。
rect.style = columnStyle; //给rect节点设置style
height = singleColumn*proportion;
rect.setAttribute('width', '30'); //使用setAttribute来设置rect节点属性
rect.setAttribute('height', height);
rect.setAttribute('x', interval);
rect.setAttribute('y', 380-height);
embedSVG.appendChild(rect); //将这个新的rect节点 添加到svg节点里
interval += 45
}
}
注意:
此外,不同于HTML元素对象可以直接对一些属性赋值,SVG元素对象都需要通过调用setAttribute()方法来设定属性值。
使用 rect.width = 30 不起作用。
参考链接:http://blog.iderzheng.com/something-about-svg-with-javascript/
JS 操作svg画图的更多相关文章
- js操作svg整体缩放
首先我们先创建一个svg整体布局,代码如下: <!DOCTYPE html> <html> <head> <title>js操作svg实现整体缩放< ...
- 原创 HTML5:JS操作SVG实践体会
在工业信息化系统里,常常需要动态呈现系统的数据在一张示意图里,用于展现系统状态,分析结果等.这样用JavaScript操作svg 元素就有现实意义.本人近期做了一些实践,现分享一下. 需求: 你下面这 ...
- Svg 画图(电池)
公司现在在做充电桩项目,其中要显示充电桩的电池充电情况,功能展示的时候要画图,之前做的时候准备使用HightChar来画,但是,hightchar好像没有这样的电池图形,最后,项目经理要我自己通过sv ...
- JS操作未跨域iframe里的DOM
这里简单说明两个方法,都是未跨域情况下在index.html内操作b.html内的 DOM. 如:index.html内引入iframe,在index内如何用JS操作iframe内的DOM元素? 先贴 ...
- ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作
ThinkPHP 表单提交操作成功后执行JS操作如何刷新父页面或关闭当前页等操作 .操作成功后刷新父页面 $this->assign('jumpUrl', "javascript:wi ...
- jquery.cookie.js 操作cookie实现记住密码功能的实现代码
jquery.cookie.js操作cookie实现记住密码功能,很简单很强大,喜欢的朋友可以参考下. 复制代码代码如下: //初始化页面时验证是否记住了密码 $(document).ready( ...
- JS操作JSON总结
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...
- Seen.js – 使用 SVG 或者 Canvas 渲染 3D 场景
Seen.js 渲染3D场景为 SVG 或者 HTML5 画布.Seen.js 包含对于 SVG 和 HTML5 Canvas 元素的图形功能的最简单的抽象.所有这个库的其它组件都是不用关心将要渲染的 ...
- [荐]使用Js操作注册表
使用Js操作注册表 要操作注册表需要通过ActiveX控件调用WScript.shell对象,通过该对象的一些方法来操作. WshShell对象:可以在本地运行程序.操纵注册表内容.创建快捷方式或访问 ...
随机推荐
- mvc网站迁移.net core记录
接口return Json()时序列号小写的问题 在Startup.cs->ConfigureServices方法配置一下解决 public void ConfigureServices(ISe ...
- 隔壁小孩都要知道的Drupal配置
i春秋作家:Arizona 原文来自:隔壁小孩都要知道的Drupal配置 隔壁小孩都要知道的Drupal配置 Drupal是一个开源的PHP内容管理系统,具有相当复杂的架构.它还具有强大的安全模型.感 ...
- 站在JAVA数据结构的视角看待简单表结构
1.前言: 我们提到程序中的集合的时候,往往脑海中会浮现出, 如ArrayList和LinkedList以及和HashMap.当然在提到ArrayList和LinkedList的时候,我们大多数的人都 ...
- 《Java 多线程编程核心技术》- 笔记
作为业务开发人员,能够在工作中用到的技术其实不多.虽然平时老是说什么,多线程,并发,注入,攻击!但是在实际工作中,这些东西不见得用得上.因为,我们用的框架已经把这些事做掉了. 比如web开发,外面有大 ...
- dubbo实用知识点总结(一)
1. dubbo基础架构 架构 特性 服务提供者 服务消费者 配置可以用dubbo.properties来替换 2. 注解配置 提供方(注意:serivce注解是dubbo的service) 消费者 ...
- [干货,阅后进BAT不是梦]面试心得与总结---阿里、小米、腾讯
之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人一点指引和总结, 也希望能使大家少走点弯路 , 如 ...
- okHttp超时报错解决方案
Android 使用okhttp,如果客户端等待的时间超过了okHttp的默认时间,就会报错java.net.SocketTimeoutException: timeout 所以,需要在调用okHtt ...
- 关于 Abp 替换了 DryIoc 框架之后的问题
在之前有些过一篇文章 <使用 DryIoc 替换 Abp 的 DI 框架> ,在该文章里面我尝试通过以替换 IocManager 内部的 IContainer 来实现使用我们自己的 DI ...
- CentOS 7配置MariaDB允许指定IP远程连接数据库
防火墙 CentOS7 之前的防火墙是不一样的,比如你要添加3306端口: ## 全部 iptables -A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT # ...
- Spring系列之手写注解与配置文件的解析
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 引入 在前面我们已经完成了IOC,DI,AOP的实现,基本的功能都已经 ...