在我的应用程序中,我使用的是材料选择组件。
我想要实现的预期行为是:当我打开绑定到选择器的选择器字段时,应滚动到视口顶部,并且选项应显示在其下方。
演示:https://stackblitz.com/edit/angular-g6s73z
我发现一个问题,当选择器靠近视口底部时,选项将最终显示在屏幕之外。
问题:https://streamable.com/r3ekd
我找不到解决方法。我尝试在使用scrollIntoView
的地方实施自定义滚动策略,然后在内容溢出时手动重新定位选择面板。它在Android和iOS上存在问题,因此我放弃了这个想法。
有人有类似的问题吗?如何解决这个问题?也许我错过了什么?
自定义滚动策略
enable() {
setTimeout(() => {
document.querySelector('#field').scrollIntoView({behavior: 'smooth'});
this.scrollDispatcher.scrolled().subscribe(() => {
this.overlayRef.updatePosition();
});
this.scrollDispatcher.scrolled().pipe(debounceTime(50), take(1)).subscribe(() => {
if (parseFloat(this.overlayRef.hostElement.style.top) <= 0) {
this.overlayRef.overlayElement.style.top = coerceCssPixelValue(12);
}
});
this.overlayRef.updatePosition();
disablePageScroll();
}
答案 0 :(得分:0)
很好的观察
经调查,很明显
mat-select
被带到视图的顶部...并且mat-select
的位置在所有情况下都是正确的(当mat-select
位于视图的中间并且{ {1}}位于视图的最底部)mat-select
时打开div,上面有mat-select
类;在这个div上,有一个内联分配给它的css cdk-overlay-10
值[这是问题所在,而这个bottom
值将div推离了屏幕] bottom
,我们的问题将得到解决...只有一个警告,当我们单击top:0
时会发生两种情况:( 1)页面滚动(2)选项div变得可见...因此,改进的解决方案将是使用自定义动画缓慢显示div,以便在div变得可见之前完成滚动。 / li>
相关的 CSS :
mat-select