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对象:可以在本地运行程序.操纵注册表内容.创建快捷方式或访问 ...
随机推荐
- [翻译] Visual Studio 2019 RC版发布
[翻译] Visual Studio 2019 RC版发布 原文: Visual Studio 2019 Release Candidate (RC) now available 今天,我们将分享 V ...
- [转]kaldi 神经网络
转自:http://blog.csdn.net/xmdxcsj/article/details/54695506 overview type author CPU/GPU feature nnet1 ...
- 自定义滚动条样式(layui.v1)
来源于 layui css 代码 ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-button, ::-w ...
- Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表
操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...
- 全栈开发工程师微信小程序-上(下)
全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- python 实现wav的波形显示(时域和频域)
音频处理中,经常要看一下啊频域图是什么样子的,这里自己写了一个小程序,可以完美的同步显示时域和频域图,直接上代码: #wave data -xlxw #import import wave as we ...
- redis 删除大key集合的方法
redis大key,这里指的是大的集合数据类型,如(set/hash/list/sorted set),一个key包含很多元素.由于redis是单线程,在删除大key(千万级别的set集合)的时候,或 ...
- [干货,阅后进BAT不是梦]面试心得与总结---阿里、小米、腾讯
之前实习的时候就想着写一篇面经,后来忙就给忘了,现在找完工作了,也是该静下心总结一下走过的路程了,我全盘托出,奉上这篇诚意之作,希望能给未来找工作的人一点指引和总结, 也希望能使大家少走点弯路 , 如 ...
- 基于.net core 2.0+mysql+AceAdmin搭建一套快速开发框架
前言 .net core已经出来一段时间了,相信大家对.net core的概念已经很清楚了,这里就不再赘述.笔者目前也用.net core做过一些项目,并且将以前framework下的一些经验移植到了 ...