在 Angular 4 中单击时滚动到元素

IT技术 javascript html angular typescript
2021-03-08 10:23:50

我希望能够在按下按钮时滚动到目标。我在想这样的事情。

<button (click)="scroll(#target)">Button</button>

在我的component.ts一个方法中。

scroll(element) {
    window.scrollTo(element.yPosition)
}

我知道上面的代码无效,只是为了表明我的想法。我刚刚开始学习 Angular 4,之前没有 Angular 经验。我一直在寻找类似的东西,但所有的例子都在 AngularJs 中,它与 Angular 4 有很大不同

6个回答

你可以这样做:

<button (click)="scroll(target)"></button>
<div #target>Your target</div>

然后在您的组件中:

scroll(el: HTMLElement) {
    el.scrollIntoView();
}

编辑:我看到评论指出由于元素未定义,这不再有效。在 Angular 7 中创建了一个StackBlitz 示例,它仍然有效。有人可以提供一个不起作用的例子吗?

它现在对我很好。但是在我犯了一个愚蠢的错误并使用id="target"而不是#target之前,它给了我“el 是未定义的错误”!
2021-04-16 10:23:50
@Anthony 它允许您引用要传递给scroll组件上的函数的元素。请注意,单击事件调用scroll(target). 如果您想从组件内部访问该元素而不必传入该元素,则可以使用@ViewChild.
2021-04-19 10:23:50
以下链接将是一个正确的解决方案stackoverflow.com/questions/47616843/...
2021-05-04 10:23:50
@N15M0_jk 是的,还有一个对象可以与其他选项一起传入,具体取决于您的需要。developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
2021-05-06 10:23:50
我相信如果带有 的元素#target在 an 内会发生未定义的错误*ngIf,但是如果您使用@ViewChild来自@abbastec 的链接中方法,它应该可以工作
2021-05-06 10:23:50

这是我如何使用 Angular 4 做到的。

模板

<div class="col-xs-12 col-md-3">
  <h2>Categories</h2>
  <div class="cat-list-body">
    <div class="cat-item" *ngFor="let cat of web.menu | async">
      <label (click)="scroll('cat-'+cat.category_id)">{{cat.category_name}}</label>
    </div>
  </div>
</div>

将此功能添加到组件中。

scroll(id) {
  console.log(`scrolling to ${id}`);
  let el = document.getElementById(id);
  el.scrollIntoView();
}
使用 Angular 11
2021-04-19 10:23:50
您尚未在模板中设置 elementRefs 或 HTML id。您要滚动到的 'cat-'+cat.category_id 元素究竟在哪里?
2021-04-20 10:23:50
这是一个更好的答案。您可以将滚动条放到另一个组件上。
2021-05-04 10:23:50
嘿@Keegan,在这种情况下,您可能认为这web.menu是一个类别数组。
2021-05-08 10:23:50
这应该是公认的答案。为 Angular 9 工作。
2021-05-15 10:23:50

在 Angular 7 中工作完美

HTML

<button (click)="scroll(target)">Click to scroll</button>
<div #target>Your target</div>

在组件中

scroll(el: HTMLElement) {
    el.scrollIntoView({behavior: 'smooth'});
}
{行为:'平稳'}的奖励
2021-04-22 10:23:50
它对我有用.. 特别感谢 {behavior: 'smooth'}
2021-04-30 10:23:50
如果#target在按钮之后定义,这将不起作用,例如,如果您有浮动标题,这是相关的...
2021-05-08 10:23:50
太棒了,对我也有用,并欣赏平滑滚动的好处
2021-05-10 10:23:50

实际上有一种纯 javascript 方法可以在不使用setTimeoutorrequestAnimationFrame或 jQuery 的情况下完成此操作

简而言之,在 scrollView 中找到要滚​​动到的元素,然后使用scrollIntoView.

el.scrollIntoView({behavior:"smooth"});

这是一个plunkr

适用于 Chrome 和 Firefox,但不适用于 Safari。
2021-04-29 10:23:50
scrollIntoView 的 scrollIntoViewOptions(作为参数的对象)目前仅与 Firefox 兼容。
2021-05-03 10:23:50
这个答案有两种不同的方式: 1. 这是动画平滑滚动,而不是跳跃。2. 这个答案不会滚动窗口,而是在窗口内移动滚动视图。例如,如果您在窗口中有一个水平滚动视图。以 plunkr 为例。
2021-05-16 10:23:50

Jon 有正确的答案,这适用于我的 angular 5 和 6 项目。

如果我想单击以从导航栏平滑滚动到页脚:

<button (click)="scrollTo('.footer')">ScrolltoFooter</button>
<footer class="footer">some code</footer>

scrollTo(className: string):void {
   const elementList = document.querySelectorAll('.' + className);
   const element = elementList[0] as HTMLElement;
   element.scrollIntoView({ behavior: 'smooth' });
}

因为我想从页脚滚动回页眉,所以我创建了一个该函数所在的服务,并将其注入导航栏和页脚组件,并在需要的地方传入“页眉”或“页脚”。只记得给组件声明实际使用的类名:

<app-footer class="footer"></app-footer>