使用 snap svg 的发光效果
Glow effect using snap svg
我正在尝试使用 snap SVG 添加发光效果。与 raphael.js
不同,我相信 Snap
默认不支持发光。但是,存在阴影效应。我尝试使用设置的间隔来应用阴影,以便它模仿发光的行为。但它并没有像预期的那样工作。我想让阴影淡入淡出 4-5 次,让它看起来像发光。在这里,我调用了影子,但无论将它添加到 setinterval
代码,它仍然存在。这是 JS FIDDLE
代码
var s = Snap("#main");
var thinkers = s.select("#lastImage");
var light = s.select("#look2");
// setinterval with counter
function setIntervalX(callback, delay, repetitions) {
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
}
}, delay);
}
// function to add glow
function addShadow() {
var f = s.filter(Snap.filter.shadow(2, 2, 10, "#ffffff"));
light.attr({
filter: f
});
}
// remove glow/shadow
function removeShadow() {
var k = s.filter(Snap.filter.shadow(0, 0, 0, "#ffffff"));
light.attr({
filter: k
});
}
setTimeout(shadow, 500)
function shadow() {
setIntervalX(addShadow, 1000, 4);
}
我将展示一种略微不同的滤镜方式,我认为它适用于任何滤镜,因为您可以通过普通的 svg 标记来指示它,然后打开更多滤镜,您可以上网找找用。
因此它允许您选择任何过滤器、任何组合并更改该过滤器的任何属性(您可以组合它们)。
假设您找到一些 svg 滤镜效果,用它创建一个字符串,例如...
var myFilter = '<filter id="glow" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur id="gauss" stdDeviation="10 10" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="glow"/><feMergeNode in="glow"/></feMerge></filter>';
使用 Snap 创建您的过滤器,(它将是一个片段,因此我们需要将其附加到论文中)...
如果我们给了它们一个 id,或者通过 css 选择器和 Snap( someCssselector ) ,我们可以访问任何元素,如下所示。
s.append( Snap.parse(myFilter) );
var glowFilter = Snap('#glow');
var gaussian = Snap('#gauss');
var t = s.rect(100,100,100,100).attr({ stroke: 'yellow', fill: 'orange', filter: glowFilter });
然后我们可以创建一个带有回调的动画函数,并改变任何过滤器的参数...
var onOff = 1;
function animGlow() {
var start = 0; var end = 10;
if( onOff ) { start = 10; end = 0 };
onOff = onOff ? 0 : 1;
Snap.animate(start,end,function( amount ) {
gaussian.attr({ stdDeviation: amount + ' ' + amount });
}, 800, mina.linear, animGlow);
}
animGlow();
这将有望提供一些想法。如果您只想要 Snap 阴影,则有更简单的方法,但我只是想突出显示替代路线。
要 KISS 发光(不如 Raphael 发光)并添加阻力,试试这个:
var s = Snap("#svgTest");
//set up a shadow for hover over images shadow(dx, dy, 'color', opacity??? 3 seems darkest)
var glow = s.filter(Snap.filter.shadow(0, 2, 'yellow', .8));
//rect1 has glow
var rect1 = s.rect(10,10,50,50).attr({ fill: 'green', filter: glow });
//rect2 only has glow on hover
var rect2 = s.rect(100,100,50,50)
.attr({ fill: 'green' })
.hover(function() {
//on hover..add fn glow above
this.attr({filter : glow});
},
function() {
//on hover out, set filter to null..delete glow
this.attr({filter : ''});
}
); //end hover
// make all dragable
var move = function(dx,dy) {
//console.log("dx: " +dx + " dy: " + dy);
this.attr({
transform: this.data('origTransform') + (this.data('origTransform') ? "T" : "t") + [dx, dy]
});
}
var start = function() {
this.data('origTransform', this.transform().local );
}
var stop = function() { //do nothing
}
var selectAll = s.group(rect1, rect2);
selectAll.drag(move, start, stop );
我正在尝试使用 snap SVG 添加发光效果。与 raphael.js
不同,我相信 Snap
默认不支持发光。但是,存在阴影效应。我尝试使用设置的间隔来应用阴影,以便它模仿发光的行为。但它并没有像预期的那样工作。我想让阴影淡入淡出 4-5 次,让它看起来像发光。在这里,我调用了影子,但无论将它添加到 setinterval
代码,它仍然存在。这是 JS FIDDLE
代码
var s = Snap("#main");
var thinkers = s.select("#lastImage");
var light = s.select("#look2");
// setinterval with counter
function setIntervalX(callback, delay, repetitions) {
var x = 0;
var intervalID = window.setInterval(function () {
callback();
if (++x === repetitions) {
window.clearInterval(intervalID);
}
}, delay);
}
// function to add glow
function addShadow() {
var f = s.filter(Snap.filter.shadow(2, 2, 10, "#ffffff"));
light.attr({
filter: f
});
}
// remove glow/shadow
function removeShadow() {
var k = s.filter(Snap.filter.shadow(0, 0, 0, "#ffffff"));
light.attr({
filter: k
});
}
setTimeout(shadow, 500)
function shadow() {
setIntervalX(addShadow, 1000, 4);
}
我将展示一种略微不同的滤镜方式,我认为它适用于任何滤镜,因为您可以通过普通的 svg 标记来指示它,然后打开更多滤镜,您可以上网找找用。
因此它允许您选择任何过滤器、任何组合并更改该过滤器的任何属性(您可以组合它们)。
假设您找到一些 svg 滤镜效果,用它创建一个字符串,例如...
var myFilter = '<filter id="glow" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur id="gauss" stdDeviation="10 10" result="glow"/><feMerge><feMergeNode in="glow"/><feMergeNode in="glow"/><feMergeNode in="glow"/></feMerge></filter>';
使用 Snap 创建您的过滤器,(它将是一个片段,因此我们需要将其附加到论文中)... 如果我们给了它们一个 id,或者通过 css 选择器和 Snap( someCssselector ) ,我们可以访问任何元素,如下所示。
s.append( Snap.parse(myFilter) );
var glowFilter = Snap('#glow');
var gaussian = Snap('#gauss');
var t = s.rect(100,100,100,100).attr({ stroke: 'yellow', fill: 'orange', filter: glowFilter });
然后我们可以创建一个带有回调的动画函数,并改变任何过滤器的参数...
var onOff = 1;
function animGlow() {
var start = 0; var end = 10;
if( onOff ) { start = 10; end = 0 };
onOff = onOff ? 0 : 1;
Snap.animate(start,end,function( amount ) {
gaussian.attr({ stdDeviation: amount + ' ' + amount });
}, 800, mina.linear, animGlow);
}
animGlow();
这将有望提供一些想法。如果您只想要 Snap 阴影,则有更简单的方法,但我只是想突出显示替代路线。
要 KISS 发光(不如 Raphael 发光)并添加阻力,试试这个:
var s = Snap("#svgTest");
//set up a shadow for hover over images shadow(dx, dy, 'color', opacity??? 3 seems darkest)
var glow = s.filter(Snap.filter.shadow(0, 2, 'yellow', .8));
//rect1 has glow
var rect1 = s.rect(10,10,50,50).attr({ fill: 'green', filter: glow });
//rect2 only has glow on hover
var rect2 = s.rect(100,100,50,50)
.attr({ fill: 'green' })
.hover(function() {
//on hover..add fn glow above
this.attr({filter : glow});
},
function() {
//on hover out, set filter to null..delete glow
this.attr({filter : ''});
}
); //end hover
// make all dragable
var move = function(dx,dy) {
//console.log("dx: " +dx + " dy: " + dy);
this.attr({
transform: this.data('origTransform') + (this.data('origTransform') ? "T" : "t") + [dx, dy]
});
}
var start = function() {
this.data('origTransform', this.transform().local );
}
var stop = function() { //do nothing
}
var selectAll = s.group(rect1, rect2);
selectAll.drag(move, start, stop );