Vertical tabs with Angular Material

前端 未结 4 463
故里飘歌
故里飘歌 2020-12-17 16:57

Using the proper Angular Material directive, how do I change the direction to vertical?

Starting with vertical tabs:

Then want to drop to content be

相关标签:
4条回答
  • 2020-12-17 17:27

    I am very new to Angular and tried to create vertical tabs using tabs, Sidenav and mat-action-list. I had to create separate component for tabs with hidden headers (because of ViewEncapsulation.None usage)

    I don't know how to create stackblitz content yet. Here is very basic implementation. Hope it helps someone.

    app.component.html

         <mat-sidenav-container class="side-nav-container">
          <mat-sidenav mode="side" opened class="sidenav">
              <mat-action-list>
                  <button mat-list-item (click)="index = 0"> tab 1 </button>
                  <button mat-list-item (click)="index = 1"> tab 2 </button>
                </mat-action-list>
          </mat-sidenav>
          <mat-sidenav-content>
              <app-tab-content [(index)]=index></app-tab-content>
          </mat-sidenav-content>
        </mat-sidenav-container>
    

    app.component.css

        .side-nav-container {
          position: absolute;
          top: 0;
          bottom: 0;
          left: 0;
          right: 0;
          background: #eee;
        }
    
    
        .sidenav {
          width: 200px;
          background: rgb(15,62,9);
        }
    
        mat-action-list .mat-list-item {
          color : white;
        }
    

    app.component.ts

        import { Component } from '@angular/core';
    
        @Component({
          selector: 'my-app',
          templateUrl: './app.component.html',
          styleUrls: ['./app.component.css']
        })
        export class AppComponent {
          index: number;
        }
    

    tab-content.component.html

           <mat-tab-group [(selectedIndex)]="index" class="header-less-tabs" animationDuration="0ms">
            <mat-tab> Content 1 </mat-tab>
            <mat-tab> Content 2 </mat-tab>
          </mat-tab-group>
    

    tab-content.component.css

        .header-less-tabs.mat-tab-group .mat-tab-header {
          display: none;
        }
    

    tab-content.component.ts

        import { Component, OnInit, ViewEncapsulation, Input } from '@angular/core';
    
        @Component({
          selector: 'app-tab-content',
          templateUrl: './tab-content.component.html',
          styleUrls: ['./tab-content.component.css'],
          encapsulation: ViewEncapsulation.None
        })
        export class TabContentComponent {
    
          @Input() index: number = 1;
    
        }
    
    0 讨论(0)
  • 2020-12-17 17:27

    So this is not perfect in my opinion but its very little code, does the trick and seems to work well with the other features of mat-tabs.

    .mat-tab-group {
        flex-direction: row !important;
    }
    
    .mat-tab-labels {
        flex-direction: column !important;
    }
    
    .mat-tab-label-active {
        border-right: 2px solid $primary-color !important;
    }
    
    .mat-ink-bar {
        display: none;
    }
    

    Since the relevant classes are rendered outside the scope of the component, you will have to set encapsulation to ViewEncapsulation.None, note: this might meddle with the component styles.

    This obviously does not solve the lack of animation but for me it was enough that the active strips gets highlighted which I achieved by simply hiding the original ink-bar and adding a border which mimics it

    0 讨论(0)
  • 2020-12-17 17:34

    Wrote angular-vertical-tabs. This simply wraps @angular/material's mat-selection-list, and uses @angular/flex-layout to reorient for different screens sizes.

    Usage

    <vertical-tabs>
      <vertical-tab tabTitle="Tab 0">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        Mauris tincidunt mattis neque lacinia dignissim.
        Morbi ex orci, bibendum et varius vel, porttitor et magna.
      </vertical-tab>
    
      <vertical-tab tabTitle="Tab b">
        Curabitur efficitur eleifend nulla, eget porta diam sodales in.
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.
        Maecenas vestibulum libero lacus, et porta ex tincidunt quis.
      </vertical-tab>
    
      <vertical-tab tabTitle="Tab 2">
        Sed dictum, diam et vehicula sollicitudin, eros orci viverra diam, et pretium
        risus nisl eget ex. Integer lacinia commodo ipsum, sit amet consectetur magna
        hendrerit eu.
      </vertical-tab>
    </vertical-tabs>
    

    Output

    Full width

    Smaller screen

    0 讨论(0)
  • 2020-12-17 17:36

    Use the below code for the vertical tab using angular material.

    HTML

    <div class="container">
      <div id="content">
        <div id="main-content">
          <mat-tab-group>
            <mat-tab label="Tab One">
              Tab One Content
            </mat-tab>
            <mat-tab label="Tab Two">
              Tab Two Content
            </mat-tab>
          </mat-tab-group>
        </div>
      </div>
    </div>
    

    SCSS

    :host {
        >.container {
            max-width: 1264px;
            width: 100%;
            margin: 0 auto;
            display: flex;
            justify-content: space-between;
            background: none;
        }
        /deep/ {
            .mat-tab-group {
                flex-direction: row;
            }
            .mat-tab-header {
              border-bottom: none;
            }
            .mat-tab-header-pagination {
                display: none !important;
            }
            .mat-tab-labels {
                flex-direction: column;
            }
            .mat-ink-bar {
                height: 100%;
                left: 98% !important;
            }
            .mat-tab-body-wrapper {
                flex: 1 1 auto;
            }
        }
    }
    
    .container {
        position: relative;
        width: 100%;
        flex: 1 0 auto;
        margin: 0 auto;
        text-align: left;
    }
    
    #content {
        box-sizing: content-box;
        margin: 0 auto;
        padding: 15px;
        width: 1264px;
        background-color: #ffffff;
    }
    
    #content {
        max-width: 1100px;
        width: 100%;
        background-color: #ffffff;
        padding: 24px;
        box-sizing: border-box;
    }
    
    #content,
    #main-content {
        &::before,
        &::after {
            content: "";
            display: table;
        }
        &::after {
            clear: both;
        }
    }
    

    Stackblitz Demo here

    0 讨论(0)
提交回复
热议问题