Визначте відстань від вершини діва до верхньої частини вікна за допомогою javascript


127

Як визначити відстань між самою вершиною поділки до вершини поточного екрана? Я просто хочу, щоб відстань пікселів до вершини поточного екрану, а не до верху документа. Я спробував кілька речей , як .offset()і .offsetHeight, але я просто не можу обернути мій мозок навколо нього. Дякую!



7
el.getBoundingClientRect().top+window.scrollY
кабінка

3
@caub Ех, це просто el.getBoundingClientRect().top. Додавання позиції прокрутки додає відстань до верхньої частини документа. developer.mozilla.org/de/docs/Web/API/Element/…
рись

Так, просто хотілося неперевірити
кают

Відповіді:


239

Ви можете використати .offset()для зміщення в порівнянні з documentелементом, а потім використати scrollTopвластивість windowелемента, щоб знайти, наскільки далеко вниз сторінка прокручується користувачем:

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);

Тепер distanceзмінна займає відстань від вершини#my-element елемента і верхньої частини.

Ось демонстрація: http://jsfiddle.net/Rxs2m/

Зауважте, що негативні значення означають, що елемент знаходиться над верхньою складкою.


Як я можу перевірити, чи відстань є конкретним числом? Я хочу зробити елемент клейким, якщо він знаходиться вгорі на
120 пікселів

@ThessaVerbruggen Ви можете перевірити distanceзмінну, щоб побачити, чи є її значення, 120але я б рекомендував перевірити діапазон замість точного числа. Якщо, наприклад, ви прокручуєте колесо миші, ви можете дуже добре пропустити більше 120. Тож якщо ви намагаєтеся застосувати якийсь CSS або щось, коли елемент знаходиться в межах 120 пікселів у верхній частині сторінки, можливо, скористайтеся if (distance < 120) { /* do something */}. Ось оновлена ​​демонстрація: jsfiddle.net/na5qL91o
Jasper

Одна проблема, якщо я це роблю: липка частина блимає, коли я прокручую. Я здогадуюсь, тому що він перераховує, коли я прокручую. Будь-яка ідея, як це виправити? Мій код: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# second'). Offset (). Top, distance = (elementOffset - scrollTop); якщо (відстань <120) {$ ('# вторинний'). addClass ('липкий');} else {$ ('# вторинний'). RemoveClass ('липкий');}});
Фесса Вербругген

60

Ваніль:

window.addEventListener('scroll', function(ev) {

   var someDiv = document.getElementById('someDiv');
   var distanceToTop = someDiv.getBoundingClientRect().top;

   console.log(distanceToTop);
});

Відкрийте консоль браузера та прокрутіть сторінку, щоб побачити відстань.


14
Це працює лише в тому випадку, якщо користувач не прокрутив сторінку. В іншому випадку distanceToTopповернення відносне (може бути навіть негативним, якщо користувач прокрутив минуле). Щоб врахувати це, використовуйтеwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.

2
@ty ОП шукає відстань до верхньої частини екрана, а не до верхньої частини документа - негативне значення було б дійсним у цьому випадку
Drenai

16

Цього можна досягти виключно за допомогою JavaScript .

Я бачу відповідь, яку хотів написати, відповів рись у коментарях до питання.

Але я все одно напишу відповідь, тому що, як і я, люди іноді забувають читати коментарі.

Отже, якщо ви просто хочете отримати відстань елемента (у пікселях) у верхній частині екрана, ось що вам потрібно зробити:

// Fetch the element
var el = document.getElementById("someElement");  

використовувати getBoundingClientRect ()

// Use the 'top' property of 'getBoundingClientRect()' to get the distance from top
var distanceFromTop = el.getBoundingClientRect().top; 

Це воно!

Сподіваюся, це комусь допоможе :)


1
getBoundingClient () не працює, замість цього .getBoundingClientRect ()
Elnoor

@Elnoor Дякую за пропозицію :) Я вніс відповідні зміни.
Фуркан Рагамат

Просто приголомшлива робота @MohammedFurqanRahamathM. Дуже дякую за вашу відповідь :) Це працює як шарм !! :)
Меріанос Нікос

1
@MerianosNikos Дякую Я радий, що це допомогло :)
Furqan Rahamath

1
але це спрацює лише в тому випадку, якщо ви не перезавантажились посередині сторінки, правильно?
Вибачте SEO

7

Я використав це:

                              myElement = document.getElemenById("xyz");
Get_Offset_From_Start       ( myElement );  // returns positions from website's start position
Get_Offset_From_CurrentView ( myElement );  // returns positions from current scrolled view's TOP and LEFT

код:

function Get_Offset_From_Start (object, offset) { 
    offset = offset || {x : 0, y : 0};
    offset.x += object.offsetLeft;       offset.y += object.offsetTop;
    if(object.offsetParent) {
        offset = Get_Offset_From_Start (object.offsetParent, offset);
    }
    return offset;
}

function Get_Offset_From_CurrentView (myElement) {
    if (!myElement) return;
    var offset = Get_Offset_From_Start (myElement);
    var scrolled = GetScrolled (myElement.parentNode);
    var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
    return {lefttt: posX , toppp: posY };
}
//helper
function GetScrolled (object, scrolled) {
    scrolled = scrolled || {x : 0, y : 0};
    scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
    if (object.tagName.toLowerCase () != "html" && object.parentNode) { scrolled=GetScrolled (object.parentNode, scrolled); }
    return scrolled;
}

    /*
    // live monitoring
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  Get_Offset_From_CurrentView(myElement);  
        console.log(Positionsss);
    });
    */

+1 для показу цього елемента.offsetTop існує. element.getBoundingClientRect (). top надає мені дивну поведінку. Я шукав відстань від верху веб-сторінки до верхньої частини елемента.
alexandre1985

0

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

Код:

const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
$(window).scroll(function(){
var scrollTop     = $(window).scrollTop(),
elementOffset = $('.for-scroll').offset().top,
distance      = (elementOffset - scrollTop);
if(distance < vh){
    console.log('in view');
}
else{
    console.log('not in view');
}
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.