JQuery position(). top возвращает 0 вместо реального значения

Согласно официальной документации jQuery, эта функция должна:

"Получить текущие координаты первого элемента в наборе согласованных элементов относительно родителя смещения".

Ожидается, что следующий код вернет значение 51, но оно вернет значение 0. Может ли кто-нибудь представить понимание так же, почему? Спасибо заранее.

Я знаю, что добавление css (top: xx) работает, если да, то эта позиция position() работает только для случая, когда элемент имеет свойство css верхнего?

<html>

<head>
    <style type="text/css">
        .outer
        {
            width:200px;
            height:200px;
            overflow-y:auto;
            border:1px dotted grey;
            position:absolute;
        }
        .inner
        {
            width:50px;
            height:50px;
            margin-top:  50px;
            border:1px solid red;
        }
    </style>
    <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
    <script type="text/javascript"">

        $(document).ready(function () {
            $('.inner').mousedown(function (e) {
                alert($(this).position().top);
            })
        })
    </script>
</head>
<body>

    <div class="outer">
        <div class="inner"></div>
    </div>
</body>
</html>

Ответ 1

Описание API верное. Внутренний элемент имеет (начальное) значение свойства CSS по умолчанию top:auto. Существует margin-top:50px, который, как вы знаете, создает впечатление, что внутренний элемент 50px сверху, но это не так. jQuery вернет position().top = 0, так как элемент top действительно 0px из родительского элемента.

Чтобы jQuery возвращал ожидаемое значение с помощью функции .position(), вам нужно было бы установить внутреннюю <div> относительно (или абсолютную зависимость по вашим потребностям) родительскому элементу и поставьте верхнее значение и удалите свойство margin-top, например:

.inner {
  position:relative;
  top:50px;
  ...
}

Ответ 2

Это предупреждение 0, которое на 100% правильное, потому что top только возвращает значения, отличные от 0, когда вы используете их для размещения элемента, но здесь вы используете поля и отступы для позиционирования, чтобы использовать их, чтобы получить максимальное расстояние. Как

$(document).ready(function () {
            $('.inner').mousedown(function (e) {
                alert($(this).css("margin-top"));
            })
        })

Если вы хотите использовать позицию, сделайте это

.inner
        {   position:absolute;
            width:50px;
            height:50px;
            top:  50px;
            border:1px solid red;
        }

а затем выполните обычное кодирование

Ответ 3

Помогает ли вам это?:

document.getElementById("innerDiv").offsetTop;

Или используйте jquery Offset Метод:

Метод .offset() позволяет нам получить текущую позицию элемент относительно документа. Сравните это с .position(), который извлекает текущую позицию относительно родителя смещения. При позиционировании нового элемента поверх существующего для глобального манипуляции (в частности, для реализации drag-and-drop),.offset() является более полезным.