我有一个包含瓷砖(草、水等)的容器,其中一些瓷砖上有物品(边框精灵、树木和一般物品)。由于精灵的性质,所有物品都是64x64,而瓷砖只有32x32。
我的问题是,我想在瓷砖上触发悬停事件,但有时它们会被另一个瓷砖的物品遮挡。
下面的图像显示了问题。粗绿色区域是当我想悬停在树瓦片上时真正被悬停的瓦片。
问题 http://upload.cip.nu/pfile.php?file_id=2327
CSS:
#map_canvas .tile{
height: 32px;
position: absolute;
width: 32px;
}
#map_canvas .tile .item{
background-position: bottom right;
background-repeat: no-repeat;
bottom: 0;
display: inline-block;
height: 64px;
margin: 0;
padding: 0;
position: absolute;
right: 0;
}
HTML,简化版:
<div class="tile" style="background-image: url(grass.png);"></div>
<div class="tile" style="background-image: url(grass.png);"></div>
<div class="tile" style="background-image: url(grass.png);">
<div class="item" style="background-image(top-left-border.png);"></div>
</div>
这是一个实时演示 http://sleavely.com/tiles/
我甚至不知道如何表达问题,但还是试一试:
是否可能仅在父元素(.tile)上触发事件,以便溢出的子元素(.item)不会混淆我真正悬停的瓷砖?
编辑:感谢@Brilliand,我实施了以下操作
function figureOutTile(e){
var $source = jQuery(e.srcElement);
if($source.hasClass("item")){
var $parent = $source.parent();
var posx = $parent.attr("col");
var posy = $parent.attr("row");
if(e.offsetY <= 32){
if(e.offsetX <= 32){
return jQuery(".tile[col="+ (posx-1) +"][row="+ (posy-1) +"]");
}else{
return jQuery(".tile[col="+ posx +"][row="+ (posy-1) +"]");
}
}else{
if(e.offsetX <= 32){
return jQuery(".tile[col="+ (posx-1) +"][row="+ posy +"]");
}else{
return $parent;
}
}
}else{
return $source;
}
}
jQuery("#map_viewport").on({
mouseenter: function(e) {
var $target = figureOutTile(e);
$target.addClass('hovered');
},
mouseleave: function() {
jQuery(".tile.hovered").removeClass('hovered');
}
}, '.tile');
jQuery("#map_viewport").on("hover", ".tile", function(e){
,我用它来在瓷砖上切换类。问题是事件触发在错误的瓷砖上。 - Sleavelyon('hover', function() {...});
,而是使用 jQuery 的hover()
或者mouseenter
/mouseleave
。 - adeneo