Как расположить один элемент относительно другого с jQuery?

Этот ответ должен быть довольно коротким и сладким, чтобы ответить (часть) озаглавленного вопроса. Если вы хотите получить более подробный ответ, объясняющий, почему вы должны их там поместить, пожалуйста, перейдите здесь .


Общее правило для размещения typename в основном, когда вы используете параметр шаблона, и хотите получить доступ к вложенному typedef или с использованием псевдонима, например:

template
struct test {
    using type = T; // no typename required
    using underlying_type = typename T::type // typename required
};

Обратите внимание, что это также относится к метафункциям или вещи, которые также принимают общие параметры шаблона. Однако, если предоставленный параметр шаблона является явным типом, вам не нужно указывать typename, например:

template
struct test {
    // typename required
    using type = typename std::conditional::type;
    // no typename required
    using integer = std::conditional::type;
};

Общие правила добавления определителя template в основном аналогичны, за исключением они обычно включают шаблонные функции-члены (статические или другие) структуры / класса, которые сами шаблоны, например:

Учитывая эту структуру и функцию:

template
struct test {
    template
    void get() const {
        std::cout << "get\n";
    }
};

template
void func(const test& t) {
    t.get(); // error
}

Попытка доступа t.get() изнутри функции приведет к ошибке:

main.cpp:13:11: error: expected primary-expression before 'int'
     t.get();
           ^
main.cpp:13:11: error: expected ';' before 'int'

Таким образом, в этом контексте вам понадобится ключевое слово template заранее и вызвать его так:

t.template get()

Таким образом, компилятор будет анализировать это правильно, а не t.get < int.

351
задан Andreas Niedermair 2 November 2015 в 22:17
поделиться

6 ответов

ПРИМЕЧАНИЕ: Для этого требуется пользовательский интерфейс jQuery (а не только jQuery).

Теперь вы можете использовать:

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

Для быстрого позиционирования ( jQuery UI / Position ).

Вы можете загрузить пользовательский интерфейс jQuery здесь .

202
ответ дан 23 November 2019 в 00:24
поделиться

Это - то, что работало на меня в конце.

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();
};
15
ответ дан paul 23 November 2019 в 00:24
поделиться

tl; доктор: (пробуют его здесь )

, Если у Вас есть следующий 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>

тогда можно использовать следующий код 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();
});

, Но это не работает!

Это будет работать, пока меню и заполнитель имеют того же родителя смещения. Если они не делают, и у Вас нет вложенных правил CSS, что уход, где в DOM #menu элемент, использует:

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

незадолго до строки, которая располагает #menu элемент.

, Но это все еще не работает!

у Вас могло бы быть некоторое странное расположение, которое не работает с этим подходом. В этом случае просто используйте плагин положения jQuery.ui (как упомянуто в ответ ниже), который обрабатывает каждую мыслимую возможность. Обратите внимание, что Вы будете иметь к show() элемент меню прежде, чем звонить position({...}); плагин не может расположить скрытые элементы.

Обновление отмечает 3 года спустя в 2012:

(Исходное решение заархивировано здесь для потомства)

Так, оказывается, что исходный метод, который я имел здесь, был далек от идеала. В частности, это перестало бы работать если:

  • родитель смещения меню не является родителем смещения заполнителя
  • , заполнитель имеет границу/дополнение

К счастью, jQuery представил методы (position() и outerWidth()) путь назад в 1.2.6, которые делают нахождение правильных значений в последнем случае здесь намного легче. Для бывшего случая, append луг элемент меню к работам заполнителя (но нарушит правила CSS на основе вложения).

398
ответ дан Community 23 November 2019 в 00:24
поделиться

Что-то вроде этого?

$(menu).css("top", targetE1.y + "px"); 
$(menu).css("left", targetE1.x - widthOfMenu + "px");
2
ответ дан slf 23 November 2019 в 00:24
поделиться

Это работает на меня:

var posPersonTooltip = function(event) {
var tPosX = event.pageX - 5;
var tPosY = event.pageY + 10;
$('#personTooltipContainer').css({top: tPosY, left: tPosX});
2
ответ дан graham.reeds 23 November 2019 в 00:24
поделиться

Вот написанная мной функция jQuery, которая помогает мне позиционировать элементы.

Вот пример использования:

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

В приведенном выше коде правый нижний угол # el1 выравнивается с правым верхом # el2. ['cc', 'cc'] будет центрировать # el1 в # el2. Убедитесь, что # el1 имеет css position: absolute и z-index: 10000 (или какое-то действительно большое число), чтобы он оставался наверху.

Параметр смещения позволяет вам смещать координаты на указанное количество пикселей.

Исходный код ниже:

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
ответ дан 23 November 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: