似乎没有人提供代码示例,所以我会在我弄明白之后提供。感谢其他答案的见解。
这是我的做法。
把它放在某个 SCSS 中,无论是全局的还是你需要的任何地方(转换成基本的 CSS,如果你需要的话,我会留给你):
mat-tab-group[vertical] {
flex-direction: row;
::ng-deep mat-tab-header {
flex-direction: column;
border-bottom: 0px solid transparent;
border-right: 1px solid rgba(0, 0, 0, 0.12);
.mat-tab-label-container {
flex-direction: column;
.mat-tab-labels {
flex-direction: column;
}
mat-ink-bar {
left: initial !important;
bottom: initial;
right: 0;
width: 2px !important;
height: initial;
}
}
}
::ng-deep .mat-tab-body-wrapper {
flex-direction: column;
width: 100%;
}
}
:host-context(.dark) mat-tab-group[vertical] ::ng-deep mat-tab-header {
border-right: 1px solid rgba(255, 255, 255, 0.12);
}
现在对组件 TS 进行以下更改。如果您经常使用垂直选项卡,您可能希望将其放在您的主应用程序组件 TS 中。否则将其添加到每个相关组件中。
首先实现DoCheck接口,添加如下函数:
ngDoCheck() {
document.querySelectorAll("mat-tab-group[vertical]").forEach((verticalTabGroup: HTMLElement) => {
let inkBar: HTMLElement = verticalTabGroup.querySelector("mat-ink-bar");
if (!inkBar) {
return;
}
let active: HTMLElement = verticalTabGroup.querySelector(".mat-tab-label-active");
if (!active) {
return;
}
inkBar.style.top = `${active.offsetTop}px`;
inkBar.style.height = `${active.offsetHeight}px`;
});
}
也许有一个更好的方法可以在 Angular 中做到这一点,恐怕我有一个老式的香草背景,我还在学习,
缺少的一件事是,当您更改标签时,正文仍会水平滚动。这似乎是使用 JS 通过暴力强制 CSS 转换样式来完成的,因此如果不修改原始 mat-tab-group 源就无法调整它。
请记住,我只使用一个简单的标签组进行了基本测试。我不确定分页箭头是否能正常工作。我将把它作为练习留给需要它的开发人员。
另一个适合任何好奇的人的练习:也许可以使用 CSS 变换旋转整个选项卡组,然后将选项卡标签和选项卡主体旋转回以使整个事物垂直。理论上,这将允许墨条和主体过渡按原样工作。但这可能是矫枉过正。