Javascript通过ID滚动到特定元素

Ele*_*naE 5 javascript scrollto

我有一个带有 4 个选项卡的菜单栏,当我按下每个选项卡时,它应该向下滚动到同一页面上的相应类别(特定 ID)。这是菜单的代码:

  template: `
        <div class="action-container">
          <div class="btn-group quick-navigation custom-group" role="group">
            <a *ngFor="let section of sections" [scrollTo]="section.id" (click)="active = section.id"
               class="btn btn-secondary" [class.active]="section.id == active">{{section.name}}</a>
          </div>
        </div>
      `,
Run Code Online (Sandbox Code Playgroud)

这是滚动指令:

 @Directive({
      selector: '[scrollTo]'
    })
    export class ScrollToDirective {
      @Input() scrollTo: string;
      @HostListener('click', ['$event']) onClick(e) {
        console.log(this.scrollTo);
        console.log($(`#${this.scrollTo}`).offset().top - 150);
        $('html, body').animate({
          scrollTop: $(`#${this.scrollTo}`).offset().top - 150
        }, 500);
      }
    }
Run Code Online (Sandbox Code Playgroud)

问题在于,多次切换选项卡后,特定元素的 offset().top-150 会发生变化,第一次会重定向到正确的元素,但之后页面会随机跳转到不同的元素。

我已附上控制台的打印屏幕。

控制台截图

有什么建议么?谢谢你!

Jor*_*ton 10

您不必计算任何值即可完成您想要的操作,并且根本不必使用 JavaScript。至少,因为您不想要平滑的滚动。

您可以轻松地滚动到任何具有 id 设置href属性的元素:

<a href="#my_id" id="my_link">Click me to scroll down</a>

...

<section id="my_id">...</section>
Run Code Online (Sandbox Code Playgroud)

好的,根据你的评论,这样做时与 Angular 的 Router 发生冲突,所以用一点 JavaScript 你可以解决这个问题:

document.getElementById("my_link").addEventListener("click",(e)=>{
    e.preventDefault();
    document.querySelector(e.currentTarget.href).scrollIntoView();
});
Run Code Online (Sandbox Code Playgroud)

  • 好的,您可以在 JavaScript 中执行以下操作:`document.getElementById("my_id").scrollIntoView();` (3认同)

myw*_*box 8

快速回答:

element = document.getElementById("message");
element.scrollIntoView();
Run Code Online (Sandbox Code Playgroud)