2016-08-27 17 views
0

我刚刚通过THIS SVG动画演示,其直观,我是通过JS代码,并发现下面的代码行;`getShift`和变换如何在SVG上工作

var g = Snap(); 
g.attr({ 
    viewBox: [0, 0, 800, 600] 
}); 

Snap.load("map.svg", function (f) { 
    function getShift(dot) { 
     return "t" + (400 - dot.x) + "," + (300 - dot.y); 
    } 
    var gr = f.select("g"), 
     wrd = f.select("#world").attr({fill: "#fff"}), 
     syd = f.select("#sydney").attr({fill: "red"}), 
     msk = f.select("#san_francisco").attr({fill: "red"}), 
     pth = f.select("#flight"), 
     pln = f.select("#plane"), 
     top = g.g() 
    // DIFF above line of code , what is g.g(); 
    top.attr({ 
     mask: g.rect(100, 0, 600, 600).attr({ 
      fill: "r(.5,.5,.25)#fff-#000" 
     }) 
    }); 
    top.add(gr); 
    var click = top.text(410, 310, "click!").attr({ 
     font: "20px Source Sans Pro, sans-serif", 
     fill: "#fff" 
    }); 
    pth.attr({ 
     display: "none" 
    }); 
    // DIFF , i am not quite understanding below line of code. 
    pln = gr.g(pln, pln.clone()); 
    pln.attr({ 
     display: "none" 
    }); 
    pln[0].attr({ 
     stroke: "#fff", 
     strokeWidth: 2 
    }); 
    gr.attr({ 
     transform: getShift({ 
      x: syd.attr("cx"), 
      y: syd.attr("cy") 
     }) 
    }); 

现在我的问题是关于下面的行代码:

    gr.attr({ 
         transform: getShift({ 
          x: syd.attr("cx"), 
          y: syd.attr("cy") 
         }) 
        }); 

我beleive gr正在转换层,但我不完全理解这行代码,究竟什么是getShift当然我也明白上面的syd层的'cx'和'cy'属性被用来转换元素,但是这行代码如何作为一个整体工作,以及什么是getShift

回答

1

getShift本身与Snap库没有任何具体关系。它在你包含代码的顶部定义,并简单地返回基于对象的字符串您提供:

function getShift(dot) { 
    return "t" + (400 - dot.x) + "," + (300 - dot.y); 
} 

所以,如果你getShift与具有以下属性,{x: 10, y: 20}对象的参数,然后getShift将返回字符串"t380,290"

然而,该字符串可以被Snap使用来转换元素。具体来说,它使用如下:

gr.attr({transform: "t380,290"}); 

(根据我的虚构的初始值)。

它似乎正在尝试做以下事情:翻译整个组("gr")(即整个世界地图?),以便澳大利亚悉尼("syd")的位置在坐标(400, 300),也就是说,在屏幕/窗口/ div的一个令人愉快的视觉中心部分。没有经过整个代码,似乎这可能会为动画的结尾设置特征。

+0

非常感谢很多安德鲁,但我教过变换的价值永远不会包括像't'这样的字母,我的意思是在css中它通常是'transform:translate(50%,50%)',我不太了解语法,或者只是因为我是SVG新手。 –

+0

“翻译”使用“t”来自Snap.svg库,而不是来自SVG规范本身。我发现Snap文档令人沮丧,所以我不能指出你对它的转换语法的“官方”Snap解释。然而,Snap库是由编写Raphael库的同一人编写的,虽然两个库之间存在明显差异,但也许[此信息](http://dmitrybaranovskiy.github.io/raphael/reference.html# Element.transform)来自Raphael文档将有助于解释“翻译”的“t”,“旋转”等的“r”。 –