DevExtreme v23.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.
Tabs

Tabs

The Tabs component allows you to create a tabbed UI to navigate between pages or views. You can create tab items in the items array, or populate tab items from a dataSource.

Configure Overflow Behavior

The Tabs component stretches to fit its container if you do not specify the component's width. When the total tab width exceeds the component’s width, navigation buttons appear. A user can click these buttons to scroll through the tabs. Use the showNavButtons and scrollByContent properties to control this behavior.

Customize Tab Contents and Appearance

You can initialize a tab’s contents (text, icons and badges) with values from underlying data objects. This example demonstrates this technique. You can also specify an item template (itemTemplate) to customize tabs.

Process Tab Selection

Specify the selectedIndex property to select a specific tab. Use the onItemClick function to process clicks on tabs.

Backend API
Copy to CodeSandBox
Apply
Reset
<div id="longtabs"> <div class="caption">Tabs</div> <dx-tabs [dataSource]="longtabs"></dx-tabs> </div> <div id="scrolledtabs"> <div class="caption">Tabs with Overflow</div> <dx-tabs [dataSource]="longtabs" [width]="300" [scrollByContent]="true" [showNavButtons]="true" ></dx-tabs> </div> <div id="tabs"> <div class="caption">API</div> <dx-tabs #apiTabs [dataSource]="tabs" [selectedIndex]="0" (onItemClick)="selectTab($event)" ></dx-tabs> <div class="content dx-fieldset"> <div class="dx-field"> <div class="dx-field-label">Selected index:</div> <div class="dx-field-value"> <dx-select-box [dataSource]="tabs" displayExpr="text" valueExpr="id" [inputAttr]="{ 'aria-label': 'Tab' }" (onItemClick)="selectTab($event)" [(value)]="apiTabs.selectedIndex" ></dx-select-box> </div> </div> <div class="dx-field"> <div class="dx-field-label">Selected content:</div> <div class="dx-field-value-static left-aligned"> {{ tabContent }} </div> </div> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxTabsModule, DxSelectBoxModule } from 'devextreme-angular'; import { Tab, Longtab, Service } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: 'app/app.component.html', styleUrls: ['app/app.component.css'], providers: [Service], }) export class AppComponent { longtabs: Longtab[]; tabs: Tab[]; tabContent: string; constructor(service: Service) { this.longtabs = service.getLongtabs(); this.tabs = service.getTabs(); this.tabContent = this.tabs[0].content; } selectTab(e) { this.tabContent = this.tabs[e.itemIndex].content; } } @NgModule({ imports: [ BrowserModule, BrowserTransferStateModule, DxTabsModule, DxSelectBoxModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .content { text-align: justify; margin-top: 25px; } ::ng-deep #longtabs { margin-top: 20px; } ::ng-deep #scrolledtabs { margin-top: 20px; } ::ng-deep #tabs { margin-top: 60px; } ::ng-deep .caption { font-size: 16px; padding-bottom: 3px; padding-left: 10px; } ::ng-deep .left-aligned { text-align: left; }
import { Injectable } from '@angular/core'; export class Tab { id: number; text: string; icon: string; content: string; } export class Longtab { text: string; } const tabs: Tab[] = [ { id: 0, text: 'user', icon: 'user', content: 'User tab content', }, { id: 1, text: 'comment', icon: 'comment', content: 'Comment tab content', }, { id: 2, text: 'find', icon: 'find', content: 'Find tab content', }, ]; const longtabs: Longtab[] = [ { text: 'user' }, { text: 'analytics' }, { text: 'customers' }, { text: 'search' }, { text: 'favorites' }, { text: 'additional' }, { text: 'clients' }, { text: 'orders' }, { text: 'shipment' }, ]; @Injectable() export class Service { getTabs(): Tab[] { return tabs; } getLongtabs(): Longtab[] { return longtabs; } }
// In real applications, you should not transpile code in the browser. // You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/localization.js': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', }, map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', '@angular/core': 'npm:@angular/core@12.2.17', '@angular/platform-browser': 'npm:@angular/platform-browser@12.2.17', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic@12.2.17', '@angular/forms': 'npm:@angular/forms@12.2.17', '@angular/common': 'npm:@angular/common@12.2.17', '@angular/compiler': 'npm:@angular/compiler@12.2.17', 'tslib': 'npm:tslib@2.3.1/tslib.js', 'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js', 'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@23.1.5/cjs', 'devextreme/bundles/dx.all': 'npm:devextreme@23.1.5/bundles/dx.all.js', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.2/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.1', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.48', 'devextreme-angular': 'npm:devextreme-angular@23.1.5', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.11', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, 'rxjs': { defaultExtension: 'js', }, 'rxjs/operators': { defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.11/inferno/package.json', 'npm:@angular/*/package.json', 'npm:@angular/common@12.2.17/*/package.json', 'npm:rxjs@7.5.3/package.json', 'npm:rxjs@7.5.3/operators/package.json', 'npm:devextreme-angular@23.1.5/*/package.json', 'npm:devextreme-angular@23.1.5/ui/*/package.json', 'npm:devextreme-angular@23.1.5/package.json', 'npm:devexpress-diagram@2.2.1/package.json', 'npm:devexpress-gantt@4.1.48/package.json', ], }; System.config(window.config);
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.12.0/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.13/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import("app").catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>