`getShift` 和 transform 如何在 SVG 上工作
How does `getShift` and transform work on an SVG
我刚刚浏览了 THIS SVG 动画演示,它简单明了,我只是浏览了 JS 代码并开始执行以下代码行;
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")
})
});
我相信 gr
层正在转换,但我并不完全理解这行代码,getShift
到底是什么,当然我确实理解 'cx'和上面 syd
层的 'cy' 属性被用来转换元素,但是这行代码如何作为一个整体工作以及什么是 getShift
?
getShift
本身与 Snap 库没有任何关系。它在您包含的代码的顶部定义,并且只是 returns 一个基于您提供的对象的字符串:
function getShift(dot) {
return "t" + (400 - dot.x) + "," + (300 - dot.y);
}
因此,如果您使用具有以下属性的对象的参数调用 getShift
,{x: 10, y: 20}
,那么 getShift
将 return 字符串 "t380,290"
.
但是,Snap 然后可以使用该字符串来转换元素。具体使用如下:
gr.attr({transform: "t380,290"});
(基于我虚构的初始值)。
它似乎正在尝试做以下事情:翻译整个组("gr"
)(即整个世界地图?)使得澳大利亚悉尼的位置("syd"
) 在坐标 (400, 300) 处结束,即在 screen/window/div 的一个令人愉快的可见的中心部分。不看整个代码,好像是在设置动画结束的特性。
我刚刚浏览了 THIS SVG 动画演示,它简单明了,我只是浏览了 JS 代码并开始执行以下代码行;
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")
})
});
我相信 gr
层正在转换,但我并不完全理解这行代码,getShift
到底是什么,当然我确实理解 'cx'和上面 syd
层的 'cy' 属性被用来转换元素,但是这行代码如何作为一个整体工作以及什么是 getShift
?
getShift
本身与 Snap 库没有任何关系。它在您包含的代码的顶部定义,并且只是 returns 一个基于您提供的对象的字符串:
function getShift(dot) {
return "t" + (400 - dot.x) + "," + (300 - dot.y);
}
因此,如果您使用具有以下属性的对象的参数调用 getShift
,{x: 10, y: 20}
,那么 getShift
将 return 字符串 "t380,290"
.
但是,Snap 然后可以使用该字符串来转换元素。具体使用如下:
gr.attr({transform: "t380,290"});
(基于我虚构的初始值)。
它似乎正在尝试做以下事情:翻译整个组("gr"
)(即整个世界地图?)使得澳大利亚悉尼的位置("syd"
) 在坐标 (400, 300) 处结束,即在 screen/window/div 的一个令人愉快的可见的中心部分。不看整个代码,好像是在设置动画结束的特性。