当前位置: 首页 > 工具软件 > SVG.js > 使用案例 >

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

公孙弘图
2023-12-01

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或元素本身,上面的代码会得到下面的输出结果:

默认情况下,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文档中:

var draw = SVG('drawing')

draw.rect(100,100).animate().fill('#f03').move(100,100)

]]>

子像素的偏移修正

默认情况下子像素的偏移是不正确的,你可以通过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

超链接

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

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"的后代元素不会直接被渲染。节点在文档中有效:

var defs = draw.defs()

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

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

返回:SVG.Defs

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

绘制矩形

矩形有两个参数:它们的width和height。

var rect = draw.rect(100, 100)

返回值:SVG.rect

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

radius()

矩形也可以制作圆角:

rect.radius(10)

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

rect.radius(10, 20)

返回值:itself

绘制椭圆形

椭圆形也有两个参数:width和height。

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个参数:x1、y1、x2和y2。

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

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-size、x或leading()被修改时重建文本元素。该方法可以通过一个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:relative和left定义类似:

tspan.dx(30)

返回值:itself

dy

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

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实例:

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

 类似资料: