我有一个只包含矩形的集合。
var hoverTrigger = this.paper.set();
var outline = this.paper.rect();
outline.attr({
...
hoverTrigger.push(outline)
this.sprite.push(hoverTrigger);
当鼠标悬停时,矩形应该会扩展,并添加一些链接,当鼠标关闭时,链接消失,矩形再次变小。
hoverTrigger.hover(function () {
var link = this.paper.text();
hoverTrigger.push(link);
outline.animate({
...
}, function() {
link.remove();
outline.animate({
...
});
然而,似乎悬停函数单独应用于集合中的每个项目,而不是整个集合,因为当您将鼠标移到链接上时,悬停函数会触发,链接会消失。有时,该框会快速连续地在事件上悬停或悬停,并发出闪烁。
是否有一种方法将悬停应用于一组事物,使鼠标在集合中的两个事物之间移动不会触发悬停关闭?
最近我自己也遇到了这个限制,我决定为Raphael写一个名为hoverInBounds
的小扩展来解决这个问题。
简单地说,一旦鼠标进入元素,我们就会跟踪它实际移动到其边界外的时间-然后执行悬停函数,而不是之前。
演示:http://jsfiddle.net/amustill/Bh276/1
Raphael.el.hoverInBounds = function(inFunc, outFunc) {
var inBounds = false;
// Mouseover function. Only execute if `inBounds` is false.
this.mouseover(function() {
if (!inBounds) {
inBounds = true;
inFunc.call(this);
}
});
// Mouseout function
this.mouseout(function(e) {
var x = e.offsetX || e.clientX,
y = e.offsetY || e.clientY;
// Return `false` if we're still inside the element's bounds
if (this.isPointInside(x, y)) return false;
inBounds = false;
outFunc.call(this);
});
return this;
}
在创建Raphael纸对象之前放置上面的代码块
我以前碰到过这个问题。我找到了两个解决方案。
在其他元素上创建一个矩形,不透明度设置为0
var paper = new Raphael( 0, 0, 100, 100 );
var rect = paper.rect( 0, 0, 100, 100 ).attr({ opacity: 0 });
rect.hover( func_in, func_out );
这只适用于只有一个整体动作的元素,如点击。
另一个选项是当悬停在一组元素上时取消悬停功能
var funcOutTimer;
set.hover( function( ) {
if( funcOutTimer ) { // Hovered into this element in less than 100 milliseconds => cancel
window.clearTimeout( funcOutTimer);
} else {
// do stuff
}
},
function( ) {
funcOutTimer = setTimeout( function( ) {
// do stuff
}, 100 ); // wait for 100 milliseconds before executing hover out function
});
基本上,hover in函数只在第一次进入元素集合时执行,而hover out函数只会在最后你悬停到的元素不属于该元素集合时执行一次。
我发现这与下面的
一起工作myCircleElement.hover (
function(e) { myTextElement.animate({opacity:1}, 800); },
function(e) {
var x = e.layerX || e.x,
y = e.layerY || e.y;
// Return `false` if we're still inside the element's bounds
if (this.isPointInside(x, y)) return false;
// otherwise do something here.. eg below
myTextElement.animate({opacity:0}, 800); //
}
);
Bruno详述的方法有这个小问题:
如果你在其他元素上创建了一个矩形,如果其他元素是文本,那么这些文本就不能在网页中被选中。但它是有效的。
顺便说一下,属性"透明度":0是不够的,我不得不在我的例子中添加"填充":"白色"属性。你需要像这样把对象放到前面:obj.toFront();对象是一个拉斐尔形状,如"矩形"等。
我在mouseover和mouseout事件上测试了它,它可以工作。
查看我的小提琴:链接到小提琴
function withArray(x,y){
var rect = paper.rect(x, y, 100, 60).attr({
fill: "green"
});
rect.text = paper.text(x+(100/2), y + 30, 'rect w/array').attr({
'font-size': 12,
"fill": "white"
});
var rectover = paper.rect(x,y,100,60).attr({
fill: "white",
opacity: 0
});
var myArray = paper.set();
myArray.push(rect, rect.text, rectover);
myArray.mouseover(function() {
var anim = Raphael.animation({
transform: ['S', 1.5, 1.5, (rect.attr("x")), (rect.attr("y"))]
}, 100, "backOut", function() {
});
myArray.animate(anim);
}).mouseout(function() {
var anim = Raphael.animation({
transform: [""]
}, 50, "backOut", function() {
});
myArray.stop().animate(anim);
});
}