html5轻量级操纵和制作SVG动画的js库-svg.js

当前位置:主页 > Html5库 > SVG > html5轻量级操纵和制作SVG动画的js库-svg.js
html5轻量级操纵和制作SVG动画的js库-svg.js
分享:

    插件介绍

    svg.js是一个轻量级的操纵和制作SVG动画的js插件库。svg.js可以生成SVG图形、图像、文字和路径等等。svg.js还可以用于制作svg动画和互动拖拽等效果。

    浏览器兼容性

    浏览器兼容性
    时间:2015-01-31
    阅读:
简要教程

svg.js是一个轻量级的操纵和制作SVG动画的js插件库。svg.js没有任何的外部依赖,它遵循麻省理工学院的许可( MIT License)下许可证的条款。

使用方法

插入一个SVG

可以使用SVG()方法在指定的元素中创建一个SVG。

var draw = SVG('drawing').size(300, 300)
var rect = draw.rect(100, 100).attr({ fill: '#f06' })
                

第一个参数可以是一个元素的ID或元素本身,上面的代码会得到下面的输出结果:

<div id="drawing">
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300">
        <rect width="100" height="100" fill="#f06"></rect>
    </svg>
</div>
                

默认情况下,SVG的尺寸取决于它的父元素的大小,上面的代码中是#drawing

var draw = SVG('drawing').size('100%', '100%')
                
检测浏览器是否支持SVG

默然情况下,svg.js假设客户端浏览器支持SVG,你也可以测试浏览器是否支持SVG:

if (SVG.supported) {
  var draw = SVG('drawing')
  var rect = draw.rect(100, 100)
} else {
  alert('SVG not supported')
}
                
SVG文档

Svg.js可以在HTML DOM元素之外工作,例如在一个SVG文档中:

<?xml version="1.0" encoding="utf-8" ?>
<svg id="drawing" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" >
  <script type="text/javascript" xlink:href="svg.min.js"></script>
  <script type="text/javascript">
    <![CDATA[
      var draw = SVG('drawing')
      draw.rect(100,100).animate().fill('#f03').move(100,100)
    ]]>
  </script>
</svg>
                
子像素的偏移修正

默认情况下子像素的偏移是不正确的,你可以通过fixSubPixelOffset()方法来修正它:

var draw = SVG('drawing').fixSubPixelOffset()
                

父元素

主SVG文档

svg.js初始化时在给定的元素中创建一个SVG根元素,并通过SVG.Doc返回该SVG对象的实例。

var draw = SVG('drawing')
//returns: SVG.Doc
                

JavaScript继承堆栈:SVG.Doc < SVG.Container < SVG.Parent

嵌套SVG

你可以通过该特性来在一个SVG中嵌套另一个SVG。嵌套SVG和顶级SVG拥有相同的特性。

var nested = draw.nested()
var rect = nested.rect(200, 200)
//returns: SVG.Nested
                

JavaScript继承堆栈:SVG.Nested < SVG.Container < SVG.Parent

SVG组

如果你想转换一组元素为一个SVG,可以使用SVG组特性。组中的所有元素的位置都相对于包含它的组。组中的元素拥有和根SVG相同的方法:

var group = draw.group()
group.path('M10,20L30,40')
                

可以将现有的SVG元素添加到组中:

group.add(rect)
//returns: SVG.G
                

JavaScript继承堆栈:SVG.G < SVG.Container < SVG.Parent

超链接

通过一个超链接或<a>元素来创建容器可以使它的所有子元素获取该链接:

var link = draw.link('http://svgjs.com')
var rect = link.rect(100, 100)
                

超链接的url可以通过to()方法来更新:

link.to('http://www.htmleaf.com')
                

此外,超链接元素有一个show()方法可也创建xlink:show属性:

link.show('replace')
                

target()方法可以创建target属性:

link.target('_blank')
                

元素也可以通过linkTo()被链接到其它地方:

link.linkTo('http://www.htmleaf.com')
                

使用函数的方式可以同时添加多个属性:

rect.linkTo(function(link) {
  link.to('http://svgjs.com').target('_blank')
})
                

返回:SVG.A

JavaScript继承堆栈:SVG.A < SVG.Container < SVG.Parent

Defs

<defs>元素是一个引用其它元素的容器元素。一个"defs"的后代元素不会直接被渲染。<defs>节点在<svg>文档中有效:

var defs = draw.defs()
                

defs在任何使用doc()方法的元素上有效:

var defs = rect.doc().defs()
                

返回:SVG.Defs

JavaScript继承堆栈:SVG.Defs < SVG.Container < SVG.Parent

绘制矩形

矩形有两个参数:它们的widthheight

var rect = draw.rect(100, 100)
                

返回值:SVG.rect

JavaScript继承堆栈:SVG.rect < SVG.Shape < SVG.Element

radius()

矩形也可以制作圆角:

rect.radius(10)
                

上面的代码将设置rxry的值为10。如果要单独的设置rxry的值,可以:

rect.radius(10, 20)
                

返回值:itself

绘制椭圆形

椭圆形也有两个参数:widthheight

var ellipse = draw.ellipse(200, 100)
                

返回值:SVG.Ellipse

JavaScript继承堆栈:SVG.ellipse < SVG.Shape < SVG.Element

radius()

可以通过radius()方法重定义椭圆的宽度和高度:

rect.radius(75, 50)
                

返回值:itself

绘制圆形

绘制圆形仅需要一个参数:直径。

var circle = draw.circle(100)
                

返回值:SVG.Ellipse

JavaScript继承堆栈:SVG.ellipse < SVG.Shape < SVG.Element

radius()

可以通过radius()方法重定义椭圆的直径:

rect.radius(75)
                

返回值:itself

绘制直线

绘制一条直线需要4个参数:x1y1x2y2

var line = draw.line(0, 0, 100, 150).stroke({ width: 1 })
                

返回值:SVG.Line

JavaScript继承堆栈:SVG.line < SVG.Shape < SVG.Element

plot()

可以通过plot()方法来更新直线的坐标点:

line.plot(50, 30, 100, 150)
                

返回值:itself

绘制折线

一条折线包含多条直线,典型的例子是一个开口的多边形:

// polyline('x,y x,y x,y')
var polyline = draw.polyline('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
                

Polyline的参数包含一系列的空间点:x,y x,y x,y

可以使用数组来替代它们:

// polyline([[x,y], [x,y], [x,y]])
var polyline = draw.polyline([[0,0], [100,50], [50,100]]).fill('none').stroke({ width: 1 })
                

返回值:SVG.Polyline

JavaScript继承堆栈:SVG.Polyline < SVG.Shape < SVG.Element

plot()

可以通过plot()方法来更新折线的坐标点:

polyline.plot([[0,0], [100,50], [50,100], [150,50], [200,50]])
                

plot()方法也可用于动画:

polyline.animate(3000).plot([[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]])
                

返回值:itself

绘制多边形

一个多边形是一组封闭的直线的组合。

// polygon('x,y x,y x,y')
var polygon = draw.polygon('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
                

返回值:SVG.Polygon

JavaScript继承堆栈:SVG.Polygon < SVG.Shape < SVG.Element

plot()

可以通过plot()方法来更新多边形的坐标点:

polygon.plot([[0,0], [100,50], [50,100], [150,50], [200,50]])
                

plot()方法也可用于动画:

polygon.animate(3000).plot([[0,0], [100,50], [50,100], [150,50], [200,50], [250,100], [300,50], [350,50]])
                

返回值:itself

绘制路径

路径和多边形类似,但是由于它支持曲线所以要复杂一些:

draw.path('M 100 200 C 200 100 300  0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100')
                

返回值:SVG.Path

JavaScript继承堆栈:SVG.Path < SVG.Shape < SVG.Element

要了解更多关于路径数据的信息,可以参考W3的SVG文档:http://www.w3.org/TR/SVG/paths.html#PathData

plot()

可以通过plot()方法来更新路径的坐标点:

path.plot('M100,200L300,400')
                

返回值:itself

绘制图像

可以绘制你需要的图片:

var image = draw.image('/path/to/image.jpg')
                

如果你知道图片的尺寸,可以在第二个和第三个参数中设置它们:

var image = draw.image('/path/to/image.jpg', 200, 300)
                

返回值:SVG.Image

JavaScript继承堆栈:SVG.Image < SVG.Shape < SVG.Element

load()

可以通过load()方法来加载另一张图片。

draw.image('/path/to/another/image.jpg')
                

返回值:itself

loaded()

如果你不知道图片的大小,你就需要等待图片加载完毕:

var image = draw.image('/path/to/image.jpg').loaded(function(loader) {
  this.size(loader.width, loader.height)
})
                

loaded方法返回的loader随性有四个参数:

  • width
  • height
  • ratio (width / height)
  • url

返回值:itself

绘制文本

不同于HTML文本,制作SVG文本要困难得多。你没有办法插件流式文本,必须手动换行。在svg.js中有两种方法创建SVG文本。

第一个方法比较简单,为它提供文本字符串,并通过换行符来分割字符串。

var text = draw.text("Lorem ipsum dolor sit amet consectetur.\nCras sodales imperdiet auctor.")
                

这将会自动创建一个带换行的文本块。

第二种方法可以更好的控制SVG文字,但是需要更多的代码。

var text = draw.text(function(add) {
  add.tspan('Lorem ipsum dolor sit amet ').newLine()
  add.tspan('consectetur').fill('#f06')
  add.tspan('.')
  add.tspan('Cras sodales imperdiet auctor.').newLine().dx(20)
  add.tspan('Nunc ultrices lectus at erat').newLine()
  add.tspan('dictum pharetra elementum ante').newLine()
})
                

如果只有一行文本,可以使用plain()方法:

var text = draw.plain('Lorem ipsum dolor sit amet consectetur.')
                

plain()方法是SVG.Text的一个快捷方式。在不需要换行额情况下使用。

返回值:SVG.Text

JavaScript继承堆栈:SVG.Text < SVG.Shape < SVG.Element

text()

可以使用text()方法来改变文字:

text.text('Brilliant!')
                

返回值:itself

要获取文本的内容可以:

text.text()
                

返回值:string

tspan()

也可以添加一个tspan:

text.tspan(' on a train...').fill('#f06')
                

返回值:SVG.TSpan

plain()

如果元素内容不需要样式或多行,可以全部使用plain文本:

text.plain('I do not have any expectations.')
                

返回值:itself

font()

sugar.js模式可以为元素提供一些文本样式:

text.font({
  family:   'Helvetica'
, size:     144
, anchor:   'middle'
, leading:  '1.5em'
})
                

返回值:itself

build()

build()方法可以用来使用和禁用build模式。当build模式模式被禁用,plain()tspan()方法在添加新的内容之前首先调用clear()方法。当打开build模式时,plain()tspan()方法将会追加新的内容。当通过text()方法制作一个文本块的时候,build模式会在文本块被调用之前和之后自动切换。

var text = draw.text('This is just the start, ')

text.build(true)  // enables build mode

var tspan = text.tspan('something pink in the middle ').fill('#00ff97')
text.plain('and again boring at the end.')

text.build(false) // disables build mode

tspan.animate('2s').fill('#f06')
                

返回值:itself

rebuild()

这是一个内部的回调方法,你可能不会使用到。它在文本的font-sizexleading()被修改时重建文本元素。该方法可以通过一个setter来使用和禁用rebuild()方法:

text.rebuild(false) //-> disables rebuilding
text.rebuild(true)  //-> enables rebuilding and instantaneously rebuilds the text element
                
clear()

清除文本

text.clear()
                

返回值:itself

length()

获取所有文本的长度:

text.length()
                

返回值:number

lines

所有添加的tspans都被存储在lines引用中,它是SVG.Set的一个实例。

events

文本元素只有一个事件。它在每次rebuild()方法被调用时触发。

text.on('rebuild', function() {
  // whatever you need to do after rebuilding
})
                

TSpan

TSpan元素只在文本元素或其它TSpan元素中有效。在 svg.js中它有自己的class:

JavaScript继承堆栈:SVG.TSpan < SVG.Shape < SVG.Element

text()

更新tspan中的内容,参数只能是一个字符串:

tspan.text('Just a string.')
                

可以通过一个函数块来添加更多的文本内容:

tspan.text(function(add) {
  add.plain('Just plain text.')
  add.tspan('Fancy text wrapped in a tspan.').fill('#f06')
  add.tspan(function(addMore) {
    addMore.tspan('And you can doo deeper and deeper...')
  })
})
                

返回值:itself

tspan()

添加一个嵌套的tspan():

tspan.tspan('I am a child of my parent').fill('#f06')
                

返回值:SVG.TSpan

plain()

添加一些plain文本:

tspan.plain('I do not have any expectations.')
                

返回值:itself

dx

动态定义元素的x值。和html元素的position:relativeleft定义类似:

tspan.dx(30)
                

返回值:itself

dy

动态定义元素的y值。和html元素的position:relativetop定义类似:

tspan.dy(30)
                

返回值:itself

newLine()

newLine()是一个方便的添加新行的方法:

var text = draw.text(function(add) {
  add.tspan('Lorem ipsum dolor sit amet ').newLine()
  add.tspan('consectetur').fill('#f06')
  add.tspan('.')
  add.tspan('Cras sodales imperdiet auctor.').newLine().dx(20)
  add.tspan('Nunc ultrices lectus at erat').newLine()
  add.tspan('dictum pharetra elementum ante').newLine()
})
                

返回值:itself

clear()

清除所有tspan 元素的内容:

tspan.clear()
                

返回值:itself

length()

获取所有文本的长度:

tspan.length()
                

返回值:number

文本路径

svg 的一个新特性是可以制作文本路径:

var text = draw.text(function(add) {
  add.tspan('We go ')
  add.tspan('up').fill('#f09').dy(-40)
  add.tspan(', then we go down, then up again').dy(40)
})
text
  .path('M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100')
  .font({ size: 42.5, family: 'Verdana' })
                

当在文本元素上调用path()方法的时候,文本元素会变形为路径。也可以通过plot()方法来更新文本路径:

text.plot('M 300 500 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100')
                

<textPath>元素可以对自己使用textPath实例:

text.textPath.attr('startOffset', 0.5)
                

它们也可以被执行动画:

text.textPath.animate(3000).attr('startOffset', 0.8)
                

返回值:SVG.TextPath

JavaScript继承堆栈:SVG.TextPath < SVG.Element

track

直接引用路径元素:

var path = text.track
                

svg.js还提供了许多方法和事件,具体的请参考:http://documentup.com/wout/svg.js