美文网首页web收录Vue
svgjs入门教程1

svgjs入门教程1

作者: 前端西瓜哥 | 来源:发表于2018-12-16 14:27 被阅读29次

    SVG.js是一款操作 SVG 和创建 SVG 动画的轻量的js库。本教程使用的 svgjs 版本是 2.7.1

    开始

    首先我们创建根部 svg。

    var draw = SVG('drawing').size(300, 300)
    

    这样我们在 id 为 drawing 的元素下,创建了一个指定高宽的 svg 元素(默认高宽是100%),并返回一个 svgjs 的 SVG.Doc 实例对象。根 svg 的高宽都默认设置为 100%。

    下面我们创建一个位于 (10, 10) 的宽为50,高为40, 填充色为 #f06 的矩形。

    draw.rect(50, 40).move(10, 10).attr({fill: '#f06'});
    

    svgjs 提供的是一种链式写法,有很好的可读性。

    Parents

    本节讲的是可以包含其他元素的元素的使用方法。

    SVG.Parent 指的是可以包含其他元素的类,它直接继承自 SVG.js 的最底层的 SVG.Element 类。

    SVG() 方法可以创建一个根 svg 节点,并返回一个 SVG.Doc 实例。该方法需要传入的是一个 id 名。

    var draw = SVG('drawing')
    

    通过 nested() 方法,我们可以创建一个内嵌svg。

    var nested = draw.nested()
    

    创建一个 g 元素:

    var group = draw.group()
    

    创建一个 symbol,通过 use() 方法创建一个使用了这个 symbol 的 use 元素。

    var symbol = draw.symbol()
    symbol.rect(100, 100).fill('#f09')
    
    var use  = draw.use(symbol).move(200, 200)
    

    defs 元素会在根 svg 创建的时候就创建好,是无法再创建一个的(当然,其实你还是可以通过 draw.element('defs')draw.svg('<defs></defs>')的方式创建一个)。获取 defs 实例对象引用的方法是 defs()

    var defs = draw.defs()
    

    所有子元素都可以创建一个超链接。下面方法先创建了一个 a 元素,再嵌入 rect 元素。

    var link = draw.link('http://svgdotjs.github.io/')
    var rect = link.rect(100, 100)
    

    a 对象的一系列方法:

    link.to('http://apple.com')     // 修改 href 属性
    link.show('replace')            // 创建 xlink:show 属性
    link.target('_blank')
    rect.linkTo('http://svgdotjs.github.io/')  // 也是修改 href 属性,不过这个是通过子元素的方法修改的。
    rect.linkTo(function(link) {
      link.to('http://svgdotjs.github.io/').target('_blank')
    })
    

    Elements

    下面我们说一说 svg 下的元素的创建方式

    创建一个 rect:

    var rect = draw.rect(100, 100)  // 创建宽高为 100 的 rect
    

    创建一个 circle:

    var circle = draw.circle(100)  //  创建一个直径为 100 的圆,如果没有设置 cx,cy 属性的话,会默认设置为 (半径, 半径) 为圆心。
    

    创建一个 Eillpse:

    var ellipse = draw.ellipse(200, 100)
    

    创建一个 line:

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

    line.array() 可以返回一个 SVG.PointArray 实例。通过它的 value 属性能获得 line 两个点的坐标。

    line.plot() 可以重新设置两个坐标的位置。参数可以是多种类型:可以是4个数字,也可以是逗号或空格分隔数字的字符串,也可以是两个记录了点坐标的二维数组,甚至可以是一个 SVG.PointArray 实例。

    创建一个 polyline:

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

    同样,我们可以通过 array() 方法获取 polyline 的所有点坐标,使用 plot() 方法来重新设置各个点的位置。

    创建一个 polygon:

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

    polygon 和 polyline 不同,会自动首位点相连形成一个多边形,用法和 polyline 类似,这里就不展开了。

    创建一个 path

    draw.path('M0 0 H50 A20 20 0 1 0 100 50 v25 C50 125 0 85 0 85 z')
    

    参数除了可以用字符串外,还可以使用传入数组的形式。

    path.length() 可以获取 path 的长度。path.pointAt() 可以获取给定长度的点的位置。需要注意的是,path.array() 返回的数组,其命令都会转为绝对定位(如 c, v, q 会被转化为 C, V, Q)。因为 path 的很多方法(比如move)使用绝对坐标进行计算更方便一些。

    创建一个 text:

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

    svg 中的 text 的使用非常麻烦,svg.js 对于 text 的创建方法进行了优化。构造方法传入的字符串,除了创建一个 text, 还会自动创建一个 tpan,且会自动设置一个偏移量。如果字符串中有换行符,会创建多个 tspan。

    参数除了可以是数组,也可以是一个函数:

    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()
    })
    

    这里的 newline() 方法其实是给一个 tspan 设置了一个 dy 属性。如果不调用这个方法,该 tspan 会上移,这是 svg 自己的原因。

    如果你不想创建 tspan,只想在 text 下直接添加内容:

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

    text.build() 可以开启关闭 build 模式。如果关闭,在通过plain()tspan() 方法添加新内容前,会先执行 clear() 清空 text 下的所有内容。默认情况下 build 模式是关闭的,即会重置 text的意思。

    text.clear() 会清空 text 元素下的所有内容。text.length() 则会计算所有可计算文字的长度。

    text.font() 可设置字体格式,如:

    text.font({
      family:   'Helvetica'
    , size:     144
    , anchor:   'middle'
    , leading:  '1.5em'
    })
    
    text.font('family', 'Menlo')  // 也可以用键值对的形式。如果只有一个参数,可以获得这个参数代表的属性的值。
    

    tspan 通过 dy 属性来定义高度,通过 x 属性来重置水平位置。如果想设置行高,只能通过 dy 属性来模拟。svg.js 提供了 text.leading() 来设置行高。如果该方法不传参,则会返回当前的 leading 值。

    text.leading(1.5)  // 设置为字体大小的 150%
    

    text.lines() 可以得到第一级的 tspan 元素引用的数组。text.plain('str') 可以创建不包含任何style和 tspan 元素的 text。text.text() 可以设置或读取 text 元素下的文本内容。

    先到这里,还有其他元素的方法,下一篇文章再说。

    相关文章

      网友评论

        本文标题:svgjs入门教程1

        本文链接:https://www.haomeiwen.com/subject/vixxkqtx.html