昨日、mat-drawer
およびAngulars router-outlet
に関連していると思われるCSSの問題に直面しました。フルページflexboxに2つの子があります。上部にmat-toolbar
があり、下部にカスタムコンポーネントapp-sidenav
があります。これは正常に機能し、アプリサイドナビが埋められますflexboxは伸縮性があるため、ページの残りの部分です。続行する前に、この簡略化された設定を確認してください。
<div class="flex">
<mat-toolbar></mat-toolbar>
<app-sidenav></app-sidenav>
</div>
関連するCSSは
.flex { width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: stretch; }
mat-toolbar { flex: 0 0 auto; }
app-sidenav { flex: 1 1 0; }
app-sidenavコンポーネントで、次のテンプレートを取得しました
<mat-drawer-container>
<mat-drawer></mat-drawer>
<mat-drawer-content>
<main><router-outlet></router-outlet></main>
</mat-drawer-content>
</mat-drawer-container>
そして、関連するスタイルは
mat-drawer-container, mat-drawer-content { display: block; height: 100%; }
main { height: 100%; overflow-y: auto; }
これは問題なく機能し、app-sidenav
の高さを超えるコンテンツがない場合を除き、高さは適切です。スクロールバーはmain
- tagではなく外側のflexboxコンポーネントに表示されます。また、高さで!important
をテストしましたが、100vh
でも成功していません。メインタグでoverflow-y
を機能させるにはどうすればよいですか?
私は単純なトリックがあると確信していますが、知ることはできません。ご協力いただきありがとうございます。乾杯!
編集:
この問題について stackblitz を作成しました。 ciaoコンポーネントに移動すると、スクロールバーがメインタグではなくドキュメントルートに表示されることがわかります。
@Sakkeerの実用的なソリューションに加えて、position属性をハッキングせずにflexを使用する別の方法を見つけました。次のcssルールを既存のスタイルに追加(置換ではなく)するだけです。
app-sidenav { display: flex; }
mat-drawer-container { flex: 1 1 auto; }
メインのCSSクラスでこれを試してください
main {
position: absolute;
right: 0px;
left: 0px;
bottom: 0px;
top: 0px;
}
<mat-drawer-container autosize style="position: absolute;right: 0px;left: 0px;bottom: 0px;top: 0px;">
<mat-drawer #drawer mode="side" class="toolbar">
<app-sidenav></app-sidenav>
</mat-drawer>
<router-outlet></router-outlet>
</mat-drawer-container>
上記のコードは、スタイルを直接配置して自動サイズを使用することで、mat-drawer-containerがルーターページで重複しないように機能しました。