2012-12-19 73 views
25

Tôi đang cố gắng tạo các thành phần div và in các mục đó theo cách động. Tôi đã tạo a demo để hiển thị nơi tôi đã tiếp cận.Căn chỉnh div bên cạnh các mục danh sách

Vấn đề với mã của tôi là mã không hiển thị ngay bên cạnh danh sách nơi tôi muốn. Thay vào đó nó được hiển thị ở phía dưới. Có thể hiển thị div mới ngay cạnh phần tử mà tôi đang di chuột qua không?

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

Trả lời

23

Bạn cần phải thiết lập vị trí của #bubble tương đối so với li đang được chuột di qua . Hãy thử điều này:

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

Lưu ý rằng tôi đã xoá việc sử dụng live() vì nó đã bị phản đối, và sử dụng on() với một đại biểu để thay thế. Ngoài ra tôi đã sử dụng sự kiện hover.

+0

+1 để sử dụng '.on' và cũng làm cho fiddle đẹp hơn :-) –

+0

nhưng nếu div đang được tạo động, chỉ hoạt động lần đầu tiên ... – user1371896

+0

@ user1371896 không đúng, tôi đang sử dụng 'on()' với một trình xử lý ủy nhiệm, vì vậy nó sẽ hoạt động như 'live()' nhưng có hiệu năng tốt hơn. –

1

Nếu bạn cung cấp cho các <ul><div> phong cách sau đây cần làm việc.

display: inline; 
float: left; 
+0

không hoạt động theo cách đó. Các bong bóng div vẫn ở đầu trang. –

+0

có lẽ tôi đã không hiểu bạn vấn đề một cách chính xác nhưng quy tắc css sau đây làm việc cho tôi: 'ul, div {float: left; display: inline} ' – micha

7

Hope this helps:

JS-Fiddle Demo

tôi gắn #bubble đến li

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

      } 
    }); 
+1

+1 mặc dù' hiển thị: inline-block' là vấn đề trong IE7 mà không có một số ít hack hacks –

2

Hãy làm những gì Mica nói và cũng loại bỏ vị trí: tuyệt đối;

Vì vậy, css nên

#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

gì về một giải pháp CSS tinh khiết?

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

Trong tất cả các giải pháp được cung cấp, tôi chắc chắn thích cái này và thậm chí nó hoạt động trong IE7! Tốt đẹp! – SaschaM78

+1

@ SaschaM78 cảm ơn, thưa ngài. Tôi thường thích giải pháp mà phá vỡ IE7: P nhưng trong trường hợp này tôi sẽ làm cho một ngoại lệ. – mkey

+1

Câu hỏi của OP nêu rõ: * Tôi đang cố gắng tạo các phần tử div và ** in ** các mục vào chúng *. Vấn đề với giải pháp CSS thuần túy của bạn là bạn không thể in mục đó vào phần 'div' được tô sáng. Mặc dù công việc ấn tượng! –

3

Hãy thử điều này:

var bubble = $("#bubble"); 

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

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

Điều này không là gắn thêm các yếu tố bong bóng để các yếu tố trên mà chuột kết thúc. Bằng cách áp dụng display: inline vào div, bạn có thể làm cho nó xuất hiện bên cạnh anh chị em của nó thay vì dưới nó như nó sẽ làm gì nếu bạn sử dụng mã này trực tiếp.

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

Không ít hơn 10 đối tượng jQuery được sử dụng, với 7 đối tượng sử dụng cùng một bộ chọn ... tốt đau buồn! –

+0

cảm ơn nhận xét của bạn. Tôi chưa bao giờ nghĩ về điều đó. Nó sẽ cải thiện phong cách của tôi! –

+0

Không có vấn đề gì, vẻ đẹp thực sự của jQuery là khả năng tạo chuỗi, vì vậy '$ ('# bubble'). Empty(). Css ({" top ": ''," left ": ''});' sẽ đạt được điều tương tự với chỉ một đối tượng jQuery như trên không :) –

2

Lý do sử dụng .on() khi phần tử #bubble đã tồn tại.

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

nếu tôi danh sách của tôi được căn chỉnh sang phải không ?? – user1371896

+0

Sau đó, chỉ cần sử dụng 'left: offset.left - $ (" # bong bóng "). Width()' để đặt thuộc tính css bên trái. Fiddle [** đây **] (http://jsfiddle.net/bruno/y44dR/25/) – Bruno

Các vấn đề liên quan