在web前端使用SVG
前言:
花了些时间了解了一下svg,然而仍然不怎么了解...
第一步:直接在html代码中使用svg。
首先了解几个标签:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" ...>...</svg>
svg标签,需要声明namespace,是svg的根。
<defs>...</defs>
defs标签,在其中可以定义滤镜,填充等等。
<g>...</g>
g标签,一个svg标签可以包含一个或多个g标签,一个g标签可以包含一个或多个形状,g标签可以将多个形状分在一组,一同移动、变形等等。
<rect>, <circle>...
各种形状
首先就来画个矩形:
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="400" height="400">
<g>
<rect x="-25" y="-25" rx="5" ry="5" width="50" height="50" style="fill:rgb(0,0,255);stroke-width:1;stroke:rgb(0,0,0);">
</g>
</svg>
样式的控制可以一起写在style属性里,也可以分开写比如:fill="rgb(0,0,255)" stroke=":rgb(0,0,0)" ...
然后改成用渐变色填充,渐变色就需要在defs标签里定义了:
<defs>
<linearGradient id="orange_red" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1"/>
<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1"/>
</linearGradient>
</defs>
然后在图形的fill属性使用这个渐变色:fill:url(#orange_red)
之后再加个滤镜,也定义在defs里:
<filter id="Gaussian_Blur">
<feGaussianBlur in="SourceGraphic" stdDeviation="3" />
</filter>
同样的使用的时候:filter:url(#Gaussian_Blur)
然后再来看看动画:
动画要定义在图形里,用animateTransform标签
<rect ...>
<animateTransform attributeType="xml" attributeName="transform" type="rotate"
from="0" to="360"
begin="0" dur="5s"
fill="freeze"
/>
</rect>
最后是事件:
事件可以用onclick="..."或者addEventListener的方法,除此之外还能用set标签,不过set标签与其说是定义事件,不如说是定义变化,只是这个变化需要一个事件来触发
<rect ...>
<set attributeName="fill" to="red" begin="click"/>
</rect>
用js操作svg:
创建svg,这里就需要用createElementNS这个api:
var SVGNS = 'http://www.w3.org/2000/svg';
var svg = document.createElementNS(SVGNS, 'svg');
var g = document.createElementNS(SVGNS, 'g');
var s = document.createElementNS(SVGNS, 'rect');
g.appendChild(s);
svg.appendChild(g);
document.body.appendChild(svg);
然后是事件,可以用addEventListener:
s.addEventListener('click', function () {
s.setAttribute('fill', 'rgb(255,0,0)');
});
动画,也可以像操作其他元素的动画那样:
var rotate = function () {
var t = (new Date() - rotate.t)
angel = t / 10,
px = 50 + Math.abs(100 - t / 20 % 200);
// rotate的中心是g的(0,0)点,所以这里把s的中心放到(0,0)点,然后通过g的transform来移动图形位置,这样就能让图形围绕它的中心旋转
g.setAttribute('transform', 'translate('+px+',50)');
s.setAttribute('transform', 'rotate('+angel+')');
requestAnimationFrame(rotate);
}
小结:
大致了解了下创建svg,svg事件与动画的几种方式,不过想搞个复杂的滤镜就感觉很头疼,因为文档有点儿不好搞。要想玩好svg感觉还得多研究多事件,不是个容易的事儿 :)
在web前端使用SVG的更多相关文章
- 如何使用SVG及其动画技术为你的 Web 前端开发带来一些新鲜的体验
任何有开发经验的前端工程师都会考虑到不成体系的设备生态所带来的挑战.设备间不同的屏幕尺寸.分辨率和比例使得产品难以提供一致的体验,对于那些对产品有着像素级完美追求的人这种体验差异尤其显著! SVG(可 ...
- 【Web动画】SVG 实现复杂线条动画
在上一篇文章中,我们初步实现了一些利用基本图形就能完成的线条动画: [Web动画]SVG 线条动画入门 当然,事物都是朝着熵增焓减的方向发展的,复杂线条也肯定比有序线条要多. 很多时候,我们无法人工去 ...
- web前端开发中常用的尺寸和位置
我们在日常web前端开发过程中,会经常用到各种尺寸和位置.通常是js做动画的时候.轮播图,滚屏动画,粒子,碰撞检测,拖拽,滚动加载等等.这里我将常用的尺寸和位置的获取进行总结,不包括canvas,SV ...
- web前端面试试题总结---html篇
HTML Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器 ...
- Web前端工程师成长之路——知识汇总
一.何为Web前端工程师? 前端工程师,也叫Web前端开发工程师.他是随着web发展,细分出来的行业.Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript ...
- web前端性能优化指南(转)
web前端性能优化指南 概述 1. PC优化手段在Mobile侧同样适用2. 在Mobile侧我们提出三秒种渲染完成首屏指标3. 基于第二点,首屏加载3秒完成或使用Loading4. 基于联通3G网络 ...
- 【Yeoman】热部署web前端开发环境
本文来自 “简时空”:<[Yeoman]热部署web前端开发环境>(自动同步导入到博客园) 1.序言 记得去年的暑假看RequireJS的时候,曾少不更事般地惊为前端利器,写了<Sp ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十三】
<Web 前端开发精华文章推荐>2014年第2期(总第23期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- JAVA Timer定时器使用方法(一)
设置定时任务很简单,用Timer类就搞定了. 一.延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行. 代码如下:package test;i ...
- dos 命令集
dos下下载远程服务器的文件 setp C:\WINDOWS\system32\cmd.exesetp C:\RECYCLER\cmd.exever --------查看window版本net use ...
- php各项下载地址
Apache2.4下载地址 http://www.apachehaus.com/cgi-bin/download.plx PHP5.6下载地址 http://php.net/downloads.p ...
- [iOS开发]WKWebView加载JS
最近项目要用webView加载js文件,挺同事说WKWebView比UIWebView更加好用,于是我今天就试试,百度一发,自己写了个demo. 先看我写的代码,然后再来看WKWebView跟UIWe ...
- android usb挂载分析---MountService启动
android usb挂载分析---MountService启动 分类: android框架 u盘挂载2012-03-27 23:00 11799人阅读 评论(4) 收藏 举报 androidsock ...
- 读 《我为什么放弃Go语言》 有感
最近又熟悉了下go语言,发现go语言还有许多设计不好的地方,然后又读到了<我为什么放弃Go语言>这篇文章, 对于某些方面,我还是比较认同的. 这篇文章总结了十六点,如下: 1.1 不允许左 ...
- iOS多页面传值方式之单例传值singleton
// 要实现单例传值,那就必须得新建一个类做为单例 提供创建该类对象的类方法(因为是要在alloc开辟内存空间后赋值).所有在.h文件中声明该方法 + (instancetype)defaultUII ...
- Delphi XE7 Update1 下载破解、带源码和帮助安装序列号
源:http://blog.csdn.net/tht2009/article/details/39157877 Delphi安装与破解 1.XE7 XE7Update1:http://altd.emb ...
- Nutz 第一个Demo
Nut 是什么 我这就不多解释 知道是个javaweb框架 如想仔细了解请移步管网 http://nutzam.com/ 一.项目结构(直接看图 ) 需要注意的是 src和conf 都为源码包 con ...
- (总结)Linux的chattr与lsattr命令详解
PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的li ...