无法将带有 SnapSVG 的元素添加到我的页面
Can't add elements with SnapSVG to my Page
所以我正在使用 SnapSVG 来操作(动画化)我用 Inkscape 创建的 SVG 文件。不同元素(如矩形或圆形)的动画效果非常好。我遇到的问题是,当我尝试使用 SnapSVG 代码添加一个新元素(如矩形)时,它不起作用,并且整个屏幕都是空白的(一切都消失了)。为什么我有这个问题?甚至可以使用 SnapSVG 将新元素添加到现有 SVG 文件中吗?
下面我向您展示了一些代码,说明我如何操作 SVG 以及它如何在我的页面上的 DIV 中显示。我还向您展示了我如何尝试使用 SnapSVG
添加新元素
我几乎尝试了所有方法。我可以将新元素的代码放在现有 SVG 的代码之外,但它总是出现在 SVG 文件之外。
<head>
<meta charset="utf-8">
<title>Inkscape Animated Icon Snap</title>
<!--We need to add the Snap.svg script to our document-->
<script src="snap.svg.js"></script>
<script>
//Run script right away
window.onload = function () {
//We'll be appending the icon to this DIV later
var s = Snap("#svgDiv");
//Have Snap load the SVG file
Snap.load("icon.svg", function(f) {
s.append(f);
//Assign the white rectangle
whiteRect = f.select("#whiteRect");
//Assign the whole icon group
icon = f.select("#icon");
//When the icon is hovered over, have the white rectangle move up slightly with elastic properties
icon.hover(function() {
whiteRect.animate({y:18}, 500, mina.elastic);
},
//And return to original position when not hovered over
function() {
whiteRect.animate({y:23.984177}, 500, mina.elastic);
}
);
var bigCircle = s.circle(0, 0, 20).attr({fill: 'green' });
icon.append(bigCircle);
//Finally append the icon to iconDiv in the body
});
};
</script>
</head>
<body>
<!--Here's the DIV that will hold the animated SVG icon-->
<svg id="svgDiv"></svg>
</body>
所以基本上我想要的只是添加到我的 SVG 文件中的另一个矩形。我得到的是空白页。
2 件主要事情 spring 需要注意(如果没有 html/svg 也很难确定)。
首先,必须在 SVG 元素上调用 Snap,而不是 HTML 元素,所以当我看到这一行时...
var s = Snap("#iconDiv");
这几乎可以肯定是错误的。它不能是 div 或任何 HTML 元素。 Snap 适用于 SVG 元素,
var s = Snap("#anSVGselement");
是需要的。
其次,你的台词
s.append(f);
想直后Snap.load()
Snap.load("icon.svg", function(f) {
// stuff here probably won't work, there are some minimal methods like select, but not like hover etc
s.append(f);
//do stuff now it's appended
var icon = s.select("#icon");
var bigCircle = s.circle(10, 970, 20);
icon.append(bigCircle);
});
问题是,此时 f 只是一个片段,它在 DOM 中还没有位置,因此 'hover' 等方法在您添加 with 之前不可用附加到 DOM。添加后,这些方法就可用了。有一些方法可用,例如 select,然后再追加(因此您 'may' 能够 select 片段中的一个元素,然后追加它,而不是追加我认为的所有内容)。
另请注意,icon.svg 文件上有一些变换,因此您需要像我的示例一样调整圆圈以获得正确的 cx/cy,或者添加一个变换以匹配(或从原始 svg 中删除转换并具有正确的 cx/cy)
所以我正在使用 SnapSVG 来操作(动画化)我用 Inkscape 创建的 SVG 文件。不同元素(如矩形或圆形)的动画效果非常好。我遇到的问题是,当我尝试使用 SnapSVG 代码添加一个新元素(如矩形)时,它不起作用,并且整个屏幕都是空白的(一切都消失了)。为什么我有这个问题?甚至可以使用 SnapSVG 将新元素添加到现有 SVG 文件中吗?
下面我向您展示了一些代码,说明我如何操作 SVG 以及它如何在我的页面上的 DIV 中显示。我还向您展示了我如何尝试使用 SnapSVG
添加新元素我几乎尝试了所有方法。我可以将新元素的代码放在现有 SVG 的代码之外,但它总是出现在 SVG 文件之外。
<head>
<meta charset="utf-8">
<title>Inkscape Animated Icon Snap</title>
<!--We need to add the Snap.svg script to our document-->
<script src="snap.svg.js"></script>
<script>
//Run script right away
window.onload = function () {
//We'll be appending the icon to this DIV later
var s = Snap("#svgDiv");
//Have Snap load the SVG file
Snap.load("icon.svg", function(f) {
s.append(f);
//Assign the white rectangle
whiteRect = f.select("#whiteRect");
//Assign the whole icon group
icon = f.select("#icon");
//When the icon is hovered over, have the white rectangle move up slightly with elastic properties
icon.hover(function() {
whiteRect.animate({y:18}, 500, mina.elastic);
},
//And return to original position when not hovered over
function() {
whiteRect.animate({y:23.984177}, 500, mina.elastic);
}
);
var bigCircle = s.circle(0, 0, 20).attr({fill: 'green' });
icon.append(bigCircle);
//Finally append the icon to iconDiv in the body
});
};
</script>
</head>
<body>
<!--Here's the DIV that will hold the animated SVG icon-->
<svg id="svgDiv"></svg>
</body>
所以基本上我想要的只是添加到我的 SVG 文件中的另一个矩形。我得到的是空白页。
2 件主要事情 spring 需要注意(如果没有 html/svg 也很难确定)。
首先,必须在 SVG 元素上调用 Snap,而不是 HTML 元素,所以当我看到这一行时...
var s = Snap("#iconDiv");
这几乎可以肯定是错误的。它不能是 div 或任何 HTML 元素。 Snap 适用于 SVG 元素,
var s = Snap("#anSVGselement");
是需要的。
其次,你的台词
s.append(f);
想直后Snap.load()
Snap.load("icon.svg", function(f) {
// stuff here probably won't work, there are some minimal methods like select, but not like hover etc
s.append(f);
//do stuff now it's appended
var icon = s.select("#icon");
var bigCircle = s.circle(10, 970, 20);
icon.append(bigCircle);
});
问题是,此时 f 只是一个片段,它在 DOM 中还没有位置,因此 'hover' 等方法在您添加 with 之前不可用附加到 DOM。添加后,这些方法就可用了。有一些方法可用,例如 select,然后再追加(因此您 'may' 能够 select 片段中的一个元素,然后追加它,而不是追加我认为的所有内容)。
另请注意,icon.svg 文件上有一些变换,因此您需要像我的示例一样调整圆圈以获得正确的 cx/cy,或者添加一个变换以匹配(或从原始 svg 中删除转换并具有正确的 cx/cy)