Как получить верхний набор с классом с именем «выпадающий список» в Angular

#angular #dropdown #offset #popover

Вопрос:

Мне нужен тот же результат в Angular, что и в jQuery/HTML. Используя jQuery, я получаю то же значение topOffset, если я прокручиваю или нет.

 // get the top offset of the dropdown (distance from top of the page)
var topOffset = $(".dropdown").offset().top;
 

К вашему сведению, в Angular я использую переменную шаблона с @ViewChild, но значение topOffset изменилось и не дает того же требуемого результата, что и в jQuery.

   @ViewChild('dp') dropdown: ElementRef
  functionName() {
     let topOffset = this.dropdown.nativeElement.getBoundingClientRect().top;
  }
 

Пожалуйста, дайте мне знать в комментарии, что я должен сделать, чтобы достичь требуемого результата.

Ответ №1:

Просто добавьте .top смещение относительно его места в документе, а не относительно порта просмотра

Вы можете получить смещение сверху документа, используя это

  this.dropdown.nativeElement.getBoundingClientRect().top
 

Комментарии:

1. Я уже использовал «.top», но это не требуемый результат.

Ответ №2:

Вы можете использовать offsetTop вместо getBoundingClientRect().top

  @ViewChild('dp') dropdown: ElementRef
  functionName() {
     let topOffset = this.dropdown.nativeElement.offsetTop;
  }
 

Проверьте простой пример здесь:

https://stackblitz.com/edit/angular-ivy-6jmua2?file=src/app/app.component.html

Ответ №3:

jQuery с открытым исходным кодом, если вы поищете в github (эта ссылка), вы увидите

 offset: function( options ) {
    ...
    rect = elem.getBoundingClientRect();
    win = elem.ownerDocument.defaultView;
    return {
        top: rect.top   win.pageYOffset,
        left: rect.left   win.pageXOffset
    };
 }
 

Как вы видите, вам нужно добавить win.pageYOffset

Таким образом, вы можете создать функцию

   getOffset(element:HTMLElement){
    const rect = element.getBoundingClientRect();
        const win = element.ownerDocument.defaultView;
        return {
            top: rect.top   win.pageYOffset,
            left: rect.left   win.pageXOffset
        };
  }
 

И использовать

 this.offset= this.getOffset(this.dropdown.nativeElement)
 

Вы можете увидеть в этом стекблитце