jQuery отримує розташування елемента відносно вікна


168

З огляду на HTML DOM ID, як отримати позицію елемента щодо вікна в JavaScript / JQuery? Це не те саме, що відносно документа або батьківського зміщення, оскільки елемент може знаходитися всередині iframe або деяких інших елементів. Мені потрібно отримати розміщення на екрані прямокутника елемента (як у положенні та розмірі), як він відображається в даний час. Негативні значення прийнятні, якщо елемент на даний момент поза екраном (був прокручений).

Це для програми iPad (WebKit / WebView). Кожного разу, коли користувач натискає спеціальне посилання у UIWebViewвікні, я повинен відкрити перегляд попу, що відображає додаткову інформацію про посилання. У вікні переходу необхідно відобразити стрілку, яка вказує назад на ту частину екрана, яка викликає його.

Відповіді:


264

Спочатку захопіть положення. Offset елемента та обчисліть його відносне положення відносно вікна

Посилання :
1. зміщення
2. прокручування
3. scrollTop

Ви можете спробувати цю загадку

Наступні кілька рядків коду пояснюють, як це можна вирішити

коли виконується подія .scroll , ми обчислюємо відносне положення елемента щодо об’єкта вікна

$(window).scroll(function () {
    console.log(eTop - $(window).scrollTop());
});

коли прокрутка виконується в браузері, ми називаємо вищезгадану функцію обробника подій

фрагмент коду


function log(txt) {
  $("#log").html("location : <b>" + txt + "</b> px")
}

$(function() {
  var eTop = $('#element').offset().top; //get the offset top of the element
  log(eTop - $(window).scrollTop()); //position of the ele w.r.t window

  $(window).scroll(function() { //when window is scrolled
    log(eTop - $(window).scrollTop());
  });
});
#element {
  margin: 140px;
  text-align: center;
  padding: 5px;
  width: 200px;
  height: 200px;
  border: 1px solid #0099f9;
  border-radius: 3px;
  background: #444;
  color: #0099d9;
  opacity: 0.6;
}
#log {
  position: fixed;
  top: 40px;
  left: 40px;
  color: #333;
}
#scroll {
  position: fixed;
  bottom: 10px;
  right: 10px;
  border: 1px solid #000;
  border-radius: 2px;
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>

<div id="element">Hello
  <hr>World</div>
<div id="scroll">Scroll Down</div>


1
Дякую за сценарій Це, здається, працює на робочому столі, але не працює на iPad. Здається, що $ (window) .scrollTop () і $ (window) .scrollLeft () не оновлюються в iPad. Ви можете спробувати мою версію через jsbin.com/ogiwu4/5
adib

2
Вони не оновлюються на iPad, оскільки саме вікно не прокручується - користувач прокручується всередині вікна. Так і стосується базового веб-сайту, але не впевнений у тому, що стосується мобільних пристроїв, можливо, там є більше варіантів.
eselk

Це має бути невдалим, якщо елемент знаходиться в іншому прокручуваному елементі, наприклад. г. <div>. Ви вважаєте лише прокрутку документа, але не інший елемент прокрутки.
ygoe

71

Спробуйте обмежувальний ящик. Це просто:

var leftPos  = $("#element")[0].getBoundingClientRect().left   + $(window)['scrollLeft']();
var rightPos = $("#element")[0].getBoundingClientRect().right  + $(window)['scrollLeft']();
var topPos   = $("#element")[0].getBoundingClientRect().top    + $(window)['scrollTop']();
var bottomPos= $("#element")[0].getBoundingClientRect().bottom + $(window)['scrollTop']();

7
getBoundingClientRect () - це відповідь на цю проблему. Дякую програмомер.
Влад Лего

1
це працювало добре. Мені просто довелося включити код, щоб виправити свою прокрутку, окрім вашого scrollLetf та scrollTop: topPos = topPos - $ (window) .scrollTop (); leftPos = leftPos - $ (вікно) .scrollLeft (); rightPos = rightPos - $ (вікно) .scrollTop (); bottomPos = bottomPos - $ (вікно) .scrollLeft ();
Сезар

1
день, коли люди збираються навчитися обгортати речі приємним корисним методом
ммм

@Noldorin опора на IE / Край виглядає добре для мене: caniuse.com/#feat=getboundingclientrect
prograhammer

1
@prograhammer Мій поганий, ти маєш рацію. Я прочитав це на якомусь веб-сайті і взяв його слово за номінал ... виявляється, це було неправильно (або, принаймні, не працює на старому IE).
нолдорін

6
function getWindowRelativeOffset(parentWindow, elem) {
        var offset = {
            left : 0,
            top : 0
        };
        // relative to the target field's document
        offset.left = elem.getBoundingClientRect().left;
        offset.top = elem.getBoundingClientRect().top;
        // now we will calculate according to the current document, this current
        // document might be same as the document of target field or it may be
        // parent of the document of the target field
        var childWindow = elem.document.frames.window;
        while (childWindow != parentWindow) {
            offset.left = offset.left + childWindow.frameElement.getBoundingClientRect().left;
            offset.top = offset.top + childWindow.frameElement.getBoundingClientRect().top;
            childWindow = childWindow.parent;
        }
        return offset;
    };

ви можете назвати це так

getWindowRelativeOffset(top, inputElement);

Я зосереджуюсь на IE лише відповідно до моєї вимоги, але подібне можна зробити для інших браузерів


4

Це звучить більше, як вам потрібна підказка для вибраного посилання. Є багато підказок jQuery, спробуйте jQuery qTip . У ньому багато варіантів і легко змінювати стилі.

В іншому випадку, якщо ви хочете зробити це самостійно, ви можете використовувати jQuery .position(). Більше інформації про .position()це на http://api.jquery.com/position/

$("#element").position(); поверне поточне положення елемента щодо батьківського зміщення.

Є також jQuery .offset (); що поверне позицію відносно документа.


2
Це насправді не підказка, але для відкриття нативного віджета інтерфейсу для додавання анотацій.
адиб


1
    function trbl(e, relative) {
            var r = $(e).get(0).getBoundingClientRect(); relative = $(relative);

            return {
                    t : r.top    + relative['scrollTop'] (),
                    r : r.right  + relative['scrollLeft'](),
                    b : r.bottom + relative['scrollTop'] (),
                    l : r.left   + relative['scrollLeft']() 

            }
    }

    // Example
    trbl(e, window);

1

Спробуйте це, щоб отримати розташування елемента відносно вікна.

        $("button").click(function(){
            var offset = $("#simplebox").offset();
            alert("Current position of the box is: (left: " + offset.left + ", top: " + offset.top + ")");
        });
    #simplebox{
        width:150px;
        height:100px;
        background: #FBBC09;
        margin: 150px 100px;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Get Box Position</button>
    <p><strong>Note:</strong> Play with the value of margin property to see how the jQuery offest() method works.</p>
    <div id="simplebox"></div>

Детальніше @ Отримайте положення елемента щодо документа за допомогою jQuery

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.