Jak ustawić jeden element względem drugiego za pomocą jQuery?

Mam Ukryty DIV, który zawiera menu podobne do paska narzędzi.

Mam wiele Div, które są włączone, aby pokazać menu DIV, gdy najedziesz myszką na nich.

Czy istnieje wbudowana funkcja, która przeniesie DIV menu do prawego górnego rogu aktywnego (najechania myszką) DIV? Szukam czegoś w stylu $(menu).position("topright", targetEl);

 347
Author: Andreas Niedermair, 2008-10-01

8 answers

Możesz teraz użyć:

$("#my_div").position({
    my:        "left top",
    at:        "left bottom",
    of:        this, // or $("#otherdiv")
    collision: "fit"
});

Do szybkiego pozycjonowania (jQuery UI/Position).

Uwaga: to wymaga jQuery UI (nie tylko jQuery).

Możesz pobrać jQuery UI tutaj .

 197
Author: Uriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 20:06:37

Tl; dr: (spróbuj tutaj )

Jeśli masz następujący kod HTML:

<div id="menu" style="display: none;">
   <!-- menu stuff in here -->
   <ul><li>Menu item</li></ul>
</div>

<div class="parent">Hover over me to show the menu here</div>

Następnie możesz użyć następującego kodu JavaScript:

$(".parent").mouseover(function() {
    // .position() uses position relative to the offset parent, 
    var pos = $(this).position();

    // .outerWidth() takes into account border and padding.
    var width = $(this).outerWidth();

    //show the menu directly over the placeholder
    $("#menu").css({
        position: "absolute",
        top: pos.top + "px",
        left: (pos.left + width) + "px"
    }).show();
});

Ale to nie działa!

Będzie to działać tak długo, jak menu i Element Zastępczy mają ten sam element nadrzędny offset. Jeśli nie, a nie masz zagnieżdżonych reguł CSS, które dbają o to, gdzie w DOM znajduje się element #menu, Użyj:

$(this).append($("#menu"));

Tuż przed linią, która pozycjonuje #menu element.

Ale to nadal nie działa!

Możesz mieć jakiś dziwny układ, który nie działa z tym podejściem. W takim przypadku wystarczy użyć jQuery.wtyczka pozycyjna ui (Jak wspomniano w odpowiedzi poniżej), która obsługuje każdą możliwą ewentualność. Zauważ, że musisz show() element menu przed wywołaniem position({...}); wtyczka nie może pozycjonować ukrytych elementów.

Update notes 3 lata później w 2012:

(The oryginalne rozwiązanie jest zarchiwizowane tutaj dla potomności)

Okazuje się więc, że oryginalna metoda, którą tu zastosowałem, była daleka od ideału. W szczególności nie powiodłoby się, gdyby:

  • rodzic przesunięcia menu nie jest rodzicem przesunięcia elementu zastępczego
  • W tym przypadku nie jest to możliwe.]}

Na szczęście jQuery wprowadziło metody (position() i outerWidth()) w 1.2.6, które znacznie ułatwiają znalezienie odpowiednich wartości w tym drugim przypadku. Dla poprzedniego przypadku, append dodanie elementu menu do elementu zastępczego działa (ale łamie reguły CSS oparte na zagnieżdżeniu).

 395
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:10

To mi się udało.

var showMenu = function(el, menu) {
    //get the position of the placeholder element  
    var pos = $(el).offset();    
    var eWidth = $(el).outerWidth();
    var mWidth = $(menu).outerWidth();
    var left = (pos.left + eWidth - mWidth) + "px";
    var top = 3+pos.top + "px";
    //show the menu directly over the placeholder  
    $(menu).css( { 
        position: 'absolute',
        zIndex: 5000,
        left: left, 
        top: top
    } );

    $(menu).hide().fadeIn();
};
 13
Author: paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 07:16:12

Oto funkcja jQuery, którą napisałem, która pomaga mi pozycjonować elementy.

Oto przykładowe użycie:

$(document).ready(function() {
  $('#el1').position('#el2', {
    anchor: ['br', 'tr'],
    offset: [-5, 5]
  });
});

Powyższy kod wyrównuje prawy dolny róg #el1 z prawym górnym rogu #el2. ['cc',' cc'] wyśrodkowałoby # el1 na # el2. Upewnij się, że # el1 ma css position: absolute i z-index: 10000 (lub jakąś naprawdę dużą liczbę), aby utrzymać go na szczycie.

Opcja offset pozwala na przesunięcie współrzędnych o określoną liczbę pikseli.

Kod źródłowy jest poniżej:

jQuery.fn.getBox = function() {
  return {
    left: $(this).offset().left,
    top: $(this).offset().top,
    width: $(this).outerWidth(),
    height: $(this).outerHeight()
  };
}

jQuery.fn.position = function(target, options) {
  var anchorOffsets = {t: 0, l: 0, c: 0.5, b: 1, r: 1};
  var defaults = {
    anchor: ['tl', 'tl'],
    animate: false,
    offset: [0, 0]
  };
  options = $.extend(defaults, options);

  var targetBox = $(target).getBox();
  var sourceBox = $(this).getBox();

  //origin is at the top-left of the target element
  var left = targetBox.left;
  var top = targetBox.top;

  //alignment with respect to source
  top -= anchorOffsets[options.anchor[0].charAt(0)] * sourceBox.height;
  left -= anchorOffsets[options.anchor[0].charAt(1)] * sourceBox.width;

  //alignment with respect to target
  top += anchorOffsets[options.anchor[1].charAt(0)] * targetBox.height;
  left += anchorOffsets[options.anchor[1].charAt(1)] * targetBox.width;

  //add offset to final coordinates
  left += options.offset[0];
  top += options.offset[1];

  $(this).css({
    left: left + 'px',
    top: top + 'px'
  });

}
 6
Author: Venkat D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 00:19:21

Dlaczego komplikować zbyt wiele? Rozwiązanie jest bardzo proste

Css:

.active-div{
position:relative;
}

.menu-div{
position:absolute;
top:0;
right:0;
display:none;
}

Jquery:

$(function(){
    $(".active-div").hover(function(){
    $(".menu-div").prependTo(".active-div").show();
    },function(){$(".menu-div").hide();
})

Działa nawet jeśli,

  • dwa divy umieszczone gdziekolwiek indziej
  • Zmiana rozmiaru przeglądarki
 3
Author: gtamil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-29 11:59:17

Możesz użyć wtyczki jQuery PositionCalculator

Ta wtyczka zawiera również obsługę kolizji (flip), dzięki czemu menu podobne do paska narzędzi może być umieszczone w widocznej pozycji.

$(".placeholder").on('mouseover', function() {
    var $menu = $("#menu").show();// result for hidden element would be incorrect
    var pos = $.PositionCalculator( {
        target: this,
        targetAt: "top right",
        item: $menu,
        itemAt: "top left",
        flip: "both"
    }).calculate();

    $menu.css({
        top: parseInt($menu.css('top')) + pos.moveBy.y + "px",
        left: parseInt($menu.css('left')) + pos.moveBy.x + "px"
    });
});

Dla tego znacznika:

<ul class="popup" id="menu">
    <li>Menu item</li>
    <li>Menu item</li>
    <li>Menu item</li>
</ul>

<div class="placeholder">placeholder 1</div>
<div class="placeholder">placeholder 2</div>

Oto skrzypce: http://jsfiddle.net/QrrpB/1657/

 3
Author: TLindig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 14:24:37

Coś takiego?

$(menu).css("top", targetE1.y + "px"); 
$(menu).css("left", targetE1.x - widthOfMenu + "px");
 2
Author: slf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 15:22:34

To działa dla mnie:

var posPersonTooltip = function(event) {
var tPosX = event.pageX - 5;
var tPosY = event.pageY + 10;
$('#personTooltipContainer').css({top: tPosY, left: tPosX});
 2
Author: devXen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-15 19:22:02