Chrome - 在向 *ngFor 视图添加元素时,始终向下滚动到最后一个元素

Posted

技术标签:

【中文标题】Chrome - 在向 *ngFor 视图添加元素时,始终向下滚动到最后一个元素【英文标题】:Chrome - On adding elements to *ngFor view always scroll down to last element 【发布时间】:2021-01-27 14:03:56 【问题描述】:

我有一个包含视频列表的简单页面。在页面底部,我有“加载更多”按钮。如果用户单击该按钮,我会发出 http 请求并将数据添加到现有的视频数组中。

简化后的代码如下所示:

组件:

export class AppComponent implements OnInit 
  public videoList = [];

  constructor(private appService: AppService) 

  public ngOnInit(): void 
    this.loadVides();
  

  public loadMore(): void 
    this.loadVides();
  

  private loadVides(): void 
    this.appService.loadVideos().subscribe((videos) => 
      this.videoList = [...this.videoList, ...videos];
      console.log('Data was loaded');
    )
  


模板:

<div *ngFor="let video of videoList">
  <div style="height: 100px;">video.name</div>
</div>  


<div class="d-flex justify-content-center mt-2 mb-4">
  <button class="btn btn-outline-danger btn-lg" (click)="loadMore()">Load more...</button>
</div>

有什么问题:

在加载更多项目后,Firefox 页面不会滚动,所以我看到了第一个新项目。在 chrome 中,页面滚动到最后,所以我再次看到最后一个新项目和“加载更多”按钮。

演示:

https://stackblitz.com/edit/angular-ivy-quwfxx?devtoolsheight=33&file=src/app/app.component.html

【问题讨论】:

【参考方案1】:

您可以像这样添加overflow-anchor:none:-

<div *ngFor="let video of videoList">
  <div style="height: 100px;">video.name</div>
</div>  


<div style="overflow-anchor:none" class="d-flex justify-content-center mt-2 mb-4">
  <button class="btn btn-outline-danger btn-lg" (click)="loadMore()">Load more...</button>
</div>

overflow-anchor 属性使我们能够选择退出 滚动锚定,这是一种浏览器功能,旨在允许内容加载到用户当前 DOM 位置之上而不更改内容完全加载后用户的位置。

我参考了这个答案 - https://css-tricks.com/almanac/properties/o/overflow-anchor/

【讨论】:

【参考方案2】:

你可以模糊你的按钮,所以 chrome 不会试图稳定滚动位置

<button class="btn btn-outline-danger btn-lg" #btn (click)="btn.blur(); loadMore()">Load more...</button>

【讨论】:

以上是关于Chrome - 在向 *ngFor 视图添加元素时,始终向下滚动到最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

*ngFor 在添加新输入元素时重置所有表单值

如何在视图中仅循环一次对象(单个 *ngFor)?

如何为非 li 元素申请 ngfor?

C# WPF 如何在向 Stackpanel 添加许多 UI 元素时保持应用程序响应

检索表中 *ngFor 元素的 ID - Angular

在向儿童故事添加儿童故事时,TFS故事从董事会中消失