Tengo un contenedor con azulejos (hierba, agua, etc.) y en algunos de ellos tengo elementos (sprites de borde, árboles y elementos generales). Debido a la naturaleza de los sprites, todos los elementos son de 64x64, mientras que los mosaicos son solo de 32x32.No desencadenar evento de desplazamiento sobre niños
Mi problema es que quiero desencadenar un evento de desplazamiento en las teselas, pero a veces son sombreadas por elementos de otras teselas.
La imagen siguiente muestra el problema. El área verde gruesa es la que realmente se queda suspendida cuando quiero pasar el azulejo del árbol.
the problem http://upload.cip.nu/pfile.php?file_id=2327
El 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;
}
El HTML, simplificado:
<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>
Aquí está la demostración en vivo http://sleavely.com/tiles/
yo no sé ni cómo expresar la pregunta, pero aquí va:
¿Es posible activar solo el evento en el elemento primario (.tile) para que los elementos secundarios (.item) no ofusquen qué mosaico realmente sobrevuelo?
EDIT: Gracias a @Brilliand he implementado la siguiente
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');
¿Podemos ver su javascript? Nada en el código que publicó hasta ahora se refiere al vuelo estacionario. – Fresheyeball
Guau, esta es una pregunta muy específica. Pero creo que todo se reduce a un evento burbujeante. – Jivings
@Fresheyeball: ahora mismo es básicamente un 'jQuery (" # map_viewport "). On (" hover "," .tile ", función (e) {' que uso para alternar una clase en el mosaico. El problema es que el evento se desencadena en el mosaico incorrecto. – Sleavely