我正在尝试创建地图,当我将鼠标悬停在按钮上时,此地图的某个位置应突出显示。当鼠标进入叠加图像时,显示应该是,但当鼠标移动时,在悬停按钮内,叠加图像闪烁,并重复触发mouseEnter和mouseLeave事件。我也尝试过使用mouseOver,hover和mouseout,结果相同。我做错了吗?
HTML:
<div id="map">
<img src="images/map/map.png" />
<img src="images/map/mapHover.png" id="hoverhighlands" class="hoverButton"/>
<img src="images/map/mapHover.png" id="hovernorth" class="hoverButton"/>
<img src="images/map/mapHover.png" id="hovercentral" class="hoverButton"/>
<img src="images/map/mapHover.png" id="hoverlothian"class="hoverButton" /> <img src="images/map/mapHover.png" id="hoverwest" class="hoverButton" />
<img src="images/map/central.png" class="mapOverlay" id="central" />
<img src="images/map/highlands.png" class="mapOverlay" id="highlands" />
<img src="images/map/lothian.png" class="mapOverlay" id="lothian" />
<img src="images/map/northeast.png" class="mapOverlay" id="north"/>
<img src="images/map/west.png" class="mapOverlay" id="west"/>
</div>
JS:
function setMapOverlays() {
$(".mapOverlay").hide();
$(".hoverButton").mouseenter(
function () {
var id = $(this).attr('id');
id = id.substr(5);
showOverlay(id);
}).mouseleave(function () {
console.log('mouseleave');
var id = $(this).attr('id');
id = id.substr(5);
hideOverlay(id);
})
}
function showOverlay(id) {
$('#' + id).show();
}
function hideOverlay(id) {
$('#' + id).hide();
}
修改
好的,我知道为什么它不起作用。当.show()函数触发我的叠加图像放在hoverButtons的顶部时,触发onmouseleave。
我设法验证在mapOverlay上的hoverButton和z-index:1上放置z-index:2。这样,移动鼠标时不会触发事件。
所以我有一个临时修复。将onmouseleave事件移动到我的mapOverlays而不是我的hoverButtons就可以了。 function setMapOverlays(){ $( “mapOverlay。”)隐藏()。 $( “hoverButton”)。的mouseenter( function(){ 的console.log( '输入'); var id = $(this).attr('id'); id = id.substr(5);
showOverlay(id);
});
$('.mapOverlay').mouseleave(function () {
console.log('mouseleave');
hideOverlay($(this));
})
}
这可行,但这不是理想的行为。当鼠标移出hoverButton时,我希望Overlay隐藏起来。有关如何做到这一点的任何建议吗?
两张图片有助于解释我正在做的事情:
答案 0 :(得分:3)
不要对hoverButton类使用mouseleave事件。尝试在显示时处理覆盖中的mousemove事件,并检查是否仍然在启动叠加显示方法的元素上。
function setMapOverlays() {
$(".mapOverlay").hide();
$(".hoverButton").mouseenter(function() {
var id = $(this).attr('id');
id = id.substr(5);
showOverlay(id, this);
});
};
function showOverlay(id, initiator) {
initiator = $(initiator);
initiatorBoundary = {
x1: initiator.offset().left,
x2: initiator.offset().left + initiator.outerWidth(),
y1: initiator.offset().top,
y2: initiator.offset().top + initiator.outerHeight()
};
$('#' + id).mousemove(function(event) {
if (event.pageX < initiatorBoundary.x1 || event.pageX > initiatorBoundary.x2 || event.pageY < initiatorBoundary.y1 || event.pageY > initiatorBoundary.y2) {
$(this).hide();
}
}).show();
}
顺便说一句,也许没有覆盖元素会更容易实现。您是否考虑过在mouseenter和mouseleave上更改整个地图图像?
答案 1 :(得分:2)
我修复了你的js代码,并为img标签添加了一个data-id属性
新的HTML是:
<div id="map">
<img src="images/map/map.png" />
<img src="images/map/mapHover.png" id="hoverhighlands" class="hoverButton" data-id="highlands" />
<img src="images/map/mapHover.png" id="hovernorth" class="hoverButton" data-id="north" />
<img src="images/map/mapHover.png" id="hovercentral" class="hoverButton" data-id="central" />
<img src="images/map/mapHover.png" id="hoverlothian"class="hoverButton" data-id="lothian" />
<img src="images/map/mapHover.png" id="hoverwest" class="hoverButton" data-id="west" />
<img src="images/map/central.png" class="mapOverlay" id="central" data-id="central" />
<img src="images/map/highlands.png" class="mapOverlay" id="highlands" data-id="highlands" />
<img src="images/map/lothian.png" class="mapOverlay" id="lothian" data-id="lothian" />
<img src="images/map/northeast.png" class="mapOverlay" id="north" data-id="north" />
<img src="images/map/west.png" class="mapOverlay" id="west" data-id="west" />
</div>
新的jscode是:
function setMapOverlays() {
$(".mapOverlay").hide();
function showOverlay(id) {
$('#' + id).show();
}
function hideOverlay(id) {
$('#' + id).hide();
}
function hover() {
console.log('hover', this, arguments);
var id = $(this).data('id');
showOverlay(id);
}
function leave(evt) {
console.log('leave', this, arguments);
var id = $(this).data('id');
var hovered = evt.relatedTarget;
if ($(hovered).data('id') == id) {
$(hovered).mouseleave(leave);
return;
}
hideOverlay(id);
}
$(".hoverButton")
.mouseenter(hover)
.mouseleave(leave);
}
您可以在jsFiddle
上试试