2012-12-19 11 views
25

Próbuję tworzyć elementy i drukować elementy na nich dynamicznie. Stworzyłem a demo, aby pokazać, gdzie osiągnąłem.Wyrównanie elementu div obok elementów listy

Problem z moim kodem polega na tym, że nie pojawia się tuż obok listy, gdzie chcę. Zamiast tego jest wyświetlany na dole. Czy jest możliwe pokazanie nowego div tuż obok elementu, nad którym się unosimy?

$(".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> 

Odpowiedz

23

Musisz ustawić pozycję #bubble względem li który jest moused ponad . Spróbuj tego:

$("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

Zauważ, że usunąłem użycie live() gdyż została zaniechana i wykorzystywane on() z delegatem zamiast. Użyłem także zdarzenia hover.

+0

+1 za używanie '.on', a także sprawiają, że skrzypce są ładniejsze :-) –

+0

, ale jeśli div jest tworzony dynamicznie, działa tylko po raz pierwszy ... – user1371896

+0

@ user1371896 nie jest prawdziwe, używam 'on()' z delegowanym handlerem, więc zachowa się tak, jak "live()', ale z lepszą wydajnością. –

1

Jeśli dasz <ul> i <div> następujące style powinno działać.

display: inline; 
float: left; 
+0

nie działa w ten sposób. Dzbanek bąbelkowy pozostaje na górze. –

+0

Może nie zrozumiałem, że masz problem poprawnie, ale działa następująca reguła css: 'ul, div {float: left; display: inline} ' – micha

7

Nadzieja to pomaga:

JS-Fiddle Demo

mogę dołączyć #bubble do li

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

      } 
    }); 
+1

+1 chociaż' display: inline-block' jest problematyczny w IE7 bez brudnych małych hacków –

2

robić to, co powiedział Mika, a także usunięcia position: absolute;

Więc css powinny być

#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

Co czystego roztworu CSS?

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

Ze wszystkich podanych rozwiązań zdecydowanie wolę ten jeden i działa nawet w IE7! Miły! – SaschaM78

+1

@ SaschaM78 Dziękuję, miły panie. Zazwyczaj preferuję rozwiązania, które łamią IE7: P, ale w tym przypadku zrobię wyjątek. – mkey

+1

W pytaniu OP stwierdza się: * Próbuję utworzyć elementy div i ** wydrukować ** elementy na nich *. Problem z twoim czystym rozwiązaniem CSS polega na tym, że nie możesz wydrukować elementu na podświetlonym "div". Imponująca praca! –

3

Spróbuj tego:

var bubble = $("#bubble"); 

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

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

Co to robi to dołącza element bubble do elementu, w którym jest kursor. Poprzez zastosowanie display: inline do div możesz sprawić, by pojawił się obok swojego rodzeństwa zamiast pod nim, tak jak to zrobi, jeśli użyjesz tego kodu bezpośrednio.

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

Nie mniej niż 10 obiektów jQuery, z których 7 używa tego samego selektora ... dobry żal! –

+0

dzięki za komentarz. Nigdy o tym nie myślałem. Poprawi mój styl! –

+0

Nie ma problemu, prawdziwym pięknem jQuery jest możliwość łączenia się, więc '$ ('# bubble'). Empty(). Css ({" top ":" "," left ": ''});' would osiągnąć to samo z tylko jednym obiektem jQuery jako obciążenie :) –

2

Dlaczego używać .on() gdy już istnieje element #bubble.

$(".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

co, jeśli moja lista została wyrównana do prawej? – user1371896

+0

Następnie wystarczy użyć 'left: offset.left - $ (" # bubble "). Width()', aby ustawić lewą właściwość css. Fiddle [** here **] (http://jsfiddle.net/bruno/y44dR/25/) – Bruno

Powiązane problemy