2012-12-19 20 views
25

Sto cercando di creare elementi div e di stamparli dinamicamente. Ho creato a demo per mostrare dove ho raggiunto.Allineamento div a destra accanto agli elementi dell'elenco

Il problema con il mio codice è che non viene visualizzato accanto all'elenco dove lo desidero. Invece è visualizzato nella parte inferiore. È possibile mostrare il nuovo div proprio accanto all'elemento che sto passando sopra?

$(".bubble").live({ 
    mouseenter : function() { 
     $("#bubble").show(); 
     $("#bubble").html($(this).attr('id')); 
    }, 
    mouseleave : function() { 
     $("#bubble").empty(); 
    } 
}); 
#bubble{ 
    width:100px; 
    height:20px; 
    background-color:#666666; 
    position:absolute; 
    display:hidden; 
} 
<ul> 
    <li><span class="bubble" id="test1">test1</span></li> 
    <li><span class="bubble" id="test2">test2</span></li> 
    <li><span class="bubble" id="test3">test3</span></li> 
    <li><span class="bubble" id="test4">test4</span></li> 
    <li><span class="bubble" id="test5">test5</span></li> 
</ul> 
<div id="bubble"></div> 

risposta

23

È necessario impostare la posizione di #bubble rispetto al li che viene moused over . Prova questo:

$("ul").on('hover', '.bubble', function(e) { 
    if (e.type == 'mouseenter') { 
     var $el = $(this); 
     $("#bubble") 
      .html($el.attr('id')) 
      .css({ 
       top: $el.offset().top, 
       left: $el.offset().left + $el.width() 
      }) 
      .show(); 
    } 
    else { 
     $("#bubble").empty(); 
    } 
}); 

Example fiddle

Si noti che ho rimosso l'uso di live() come è stato deprecato, e utilizzato on() con un delegato, invece. Inoltre ho usato l'evento hover.

+0

+1 per l'uso di '.on' e anche rendendo il violino più carino :-) –

+0

ma se il div viene creato dinamicamente, il funziona solo per la prima volta ... – user1371896

+0

@ user1371896 non è vero, sto usando 'on()' con un gestore delegato, quindi si comporterà come 'live()' ma con prestazioni migliori. –

1

Se si dà la <ul> e la <div> i seguenti stili dovrebbe funzionare.

display: inline; 
float: left; 
+0

non funziona in questo modo. Il bubble div rimane in alto. –

+0

forse non ho capito bene il tuo problema ma la seguente regola CSS funziona per me: 'ul, div {float: left; display: inline} ' – micha

7

Spero che questo aiuti:

JS-Fiddle Demo

aggiungo il #bubble alla li

$(".bubble").live({ 
      mouseenter : function() { 
       $("#bubble").html($(this).attr('id')); 
       $(this).append($("#bubble").show());    
      }, 
      mouseleave : function() { 
      $("#bubble").empty().hide(); 

      } 
    }); 
+1

+1 anche se' display: inline-block' è problematico in IE7 senza alcuni piccoli hack sporchi –

2

fare quello che ha detto Mica e rimuovere anche il position: absolute;

Quindi css dovrebbe essere

#bubble{ 
width:100px; 
height:10px; 
background-color:#666666; 
display:hidden; 
display: inline; 
float: left; 
} 

ul{ 
display: inline; 
float: left; 
} 

http://jsfiddle.net/y44dR/21/

11

Che dire di una soluzione CSS puro?

HTML:

<ul> 
<li> 
    <span class="bubble" id="test1">test1</span> 
    <div>test1</div> 
</li> 
<li> 
    <span class="bubble" id="test2">test2</span> 
    <div>test2</div> 
</li> 
<li> 
    <span class="bubble" id="test3">test3</span> 
    <div>test3</div> 
</li> 
<li> 
    <span class="bubble" id="test4">test4</span> 
    <div>test4</div> 
</li> 
<li> 
    <span class="bubble" id="test5">test5</span> 
    <div>test5</div> 
</li> 
</ul> 

CSS:

ul li div { 
    width: 100px; 
    height: 10px; 
    background-color: #666666; 
    position: absolute; 
    display: none; 
} 

ul li:hover div { 
    display: inline; 
} 

JSFiddle: http://jsfiddle.net/H2ZMc/

+0

Di tutte le soluzioni fornite preferisco decisamente questo e funziona anche in IE7! Bello! – SaschaM78

+1

@ SaschaM78 grazie, gentile signore. Di solito preferisco soluzioni che spezzano IE7: P ma in questo caso farò un'eccezione. – mkey

+1

La domanda dell'OP indica: * Sto cercando di creare elementi div e ** print ** articoli su di essi *. Il problema con la tua soluzione CSS pura è che non puoi stampare l'elemento sul 'div' evidenziato. Un lavoro impressionante però! –

3

Prova questo:

var bubble = $("#bubble"); 

$(".bubble").live({ 
    mouseenter : function(e) {  
     $("#bubble").html($(this).attr('id')); 
     e.target.appendChild(bubble); 
    }, 

    mouseleave : function() { 
     $("#bubble").empty();   
    } 
}); 

Quello che fa è aggiunge l'elemento di bolla per l'elemento su cui il mouse è sopra. Applicando display: inline allo div è possibile farlo comparire accanto al fratello anziché al di sotto di esso come farà se si utilizza direttamente questo codice.

1
$(".bubble").live({ 
    mouseenter: function() { 
     $("#bubble").show(); 
     $("#bubble").html($(this).attr('id')); 

     var p = $(this).position(); 
     $("#bubble").css({left: p.left + $(this).outerWidth(), top: p.top }); 
    }, 
    mouseleave: function() { 
     $("#bubble").empty().css({top: '', left: ''}); 
    } 
});​ 
+2

Non meno di 10 oggetti jQuery usati, di cui 7 utilizzano lo stesso selettore ... buongiorno! –

+0

grazie per il tuo commento. Non ci ho mai pensato. Migliorerà il mio stile! –

+0

Nessun problema, la vera bellezza di jQuery è la possibilità di concatenare, quindi '$ ('# bubble'). Empty(). Css ({" top ": ''," left ": ''});' ottenere la stessa cosa con un solo oggetto jQuery come overhead :) –

2

Perché utilizzare .on() quando l'elemento #bubble esiste già.

$(".bubble").hover(function() { 

    var offset = $(this).offset(); 

    $("#bubble").html($(this).attr("id")) 
     .css({ top: offset.top, left: offset.left + $(this).width() }) 
     .show(); 
}, function() { 
    $("#bubble").html("").hide(); 
}); 

Fiddle here

+0

e se la mia lista fosse allineata a destra ?? – user1371896

+0

Quindi usa 'left: offset.left - $ (" # bubble "). Width()' per impostare la proprietà css di sinistra. Fiddle [** here **] (http://jsfiddle.net/bruno/y44dR/25/) – Bruno

Problemi correlati