【问题标题】:Synchronize 2 separate scrollbars in Angular 8在 Angular 8 中同步 2 个单独的滚动条
【发布时间】:2022-01-13 19:06:16
【问题描述】:

我在另一个sidenav 中有一个sidenav,每个sidenav 都有自己的滚动条。我想找到一种方法来同步它们,这样当一个向上或向下滚动时,另一个也可以这样做。

这是我的 HTML 文件中的代码结构:

<mat-sidenav-container class="sidenav-container"> ---> CONTAINER 1

   <mat-sidenav class="sidenav" fixedInViewport="false" mode="side" role="navigation" opened="true" >
      <mat-nav-list>
          *group of mat-list-item*
      </mat-nav-list>
   </mat-sidenav>

   <mat-sidenav-content>

      <mat-sidenav-container class="sidenav-container"> ---> CONTAINER 2
          <mat-sidenav class="secondSidenav" fixedInViewport="false" mode="side" role="navigation" opened="true">
              <mat-nav-list>
                 *group of mat-list-item*
              </mat-nav-list>
          </mat-sidenav>
          <mat-sidenav-content> *something* </mat-sidenav-content>
       </mat-sidenav-container>

   </mat-sidenav-content>
</mat-sidenav-container>

滚动条来自 mat-sidenav-containers。我想同步容器 1 和容器 2 的滚动条。

这是滚动条的图像:

我尝试了一些方法,但没有任何效果。我可以尝试什么?

【问题讨论】:

  • 你能用你想要做的例子来创建一个堆栈闪电战吗?

标签: angular angular-material scrollbar angular8


【解决方案1】:

可能通过使用HTMLElementscroll 事件我们可以实现这一点。 我已经为 mat-sidenav's

更新了带有滚动事件的代码 sn-p
  1. 首先 mat-sidenav 添加这个事件 (scroll)="updateLeftScroll(scrollOne, scrollTwo)" #scrollOne
  2. 第二个 mat-sidenav 添加这个事件 (scroll)="updateRightScroll(scrollTwo, scrollOne)" #scrollTwo

如下图

.HTML

    <mat-sidenav-container class="sidenav-container">
   <mat-sidenav class="sidenav" fixedInViewport="false" mode="side" role="navigation" opened="true" (scroll)="updateLeftScroll(scrollOne, scrollTwo)" #scrollOne>
      <mat-nav-list>
          *group of mat-list-item*
      </mat-nav-list>
   </mat-sidenav>

   <mat-sidenav-content>

      <mat-sidenav-container class="sidenav-container">
          <mat-sidenav class="secondSidenav" fixedInViewport="false" mode="side" role="navigation" opened="true" (scroll)="updateRightScroll(scrollTwo, scrollOne)" #scrollTwo>
              <mat-nav-list>
                 *group of mat-list-item*
              </mat-nav-list>
          </mat-sidenav>
          <mat-sidenav-content> *something* </mat-sidenav-content>
       </mat-sidenav-container>

   </mat-sidenav-content>
</mat-sidenav-container>

.ts

   updateLeftScroll(scrollOne: HTMLElement, scrollTwo: HTMLElement){
     scrollTwo.scrollTop = scrollOne.scrollTop;
     scrollTwo.scrollBy = scrollOne.scrollBy;
  } 
  updateRightScroll(scrollTwo: HTMLElement, scrollOne: HTMLElement) {
    scrollOne.scrollTop = scrollTwo.scrollTop;
    scrollOne.scrollBy = scrollTwo.scrollBy;
  }

注意:以上两行代码足以同步两个滚动条,如果需要执行其他逻辑可以在方法中编写我们自己的逻辑。

【讨论】:

  • 这给了我一个错误:'MatSidenav' 类型的参数不可分配给 HTMLElement 类型的参数我尝试将 HTMLElement 更改为 Element,但它会引发相同的错误。我还尝试使用 @ViewChild 和 ElementRef 来缓解这个错误,虽然错误不再出现,但它什么也没做。
  • 也许您可以在 MatSidenav 顶部添加一个 DIV 并将此滚动事件应用于该 div,例如 &lt;div (scroll)="updateLeftScroll(scrollOne, scrollTwo)" #scrollOne&gt; &lt;mat-sidenav class="sidenav" fixedInViewport="false" mode="side" role="navigation" opened="true"&gt; &lt;mat-nav-list&gt; *group of mat-list-item* &lt;/mat-nav-list&gt; &lt;/mat-sidenav&gt; &lt;/div&gt;
  • @ThomasGM 您是否真的将“读取”属性设置为 @ViewChild 的 ElementRef?像这样:@ViewChild('scrollOne', { read: ElementRef }) scrollbarOne?另外,对@SRMKumar 所写的内容进行了一点补充:如果您实际上在每个滚动条上使用@ViewChild,则无需将模板引用传递给updateRightScroll(..)updateRightScroll(...) 中的滚动条,您可以改为引用它们如:this.scrollbarOne.nativeElementthis.scrollbarTwo.nativeElement 在方法体内。
  • @ardentia 是的,我做到了,但它并没有真正做任何事情。我想过使用 CdkScrollable,但我也不能让它工作。
  • @ThomasGM 您能否提供一个 StackBlitz 示例来说明您遇到的问题?
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
相关资源
最近更新 更多