我有一个带有瓷砖(草、水等)的容器,其中一些我有物品(边框精灵、树木和一般物品)。由于精灵的性质,所有项目都是 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');