DevExtreme v24.1 is now available.

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

Your search did not match any results.

Angular Popover

The Popover component shows pop-up notifications within a box with an arrow that points to a specified UI element. In this demo, you can hover the mouse pointer over one of the details labels or click the more link to display Popover.

DevExtreme Accessibility Compliance
DevExtreme component libraries meet a variety of WCAG and Section 508 compliance standards. To assess this demo’s accessibility level, click the Run AXE® Validation button to launch the AXE® web accessibility evaluation tool.
All trademarks or registered trademarks are property of their respective owners. AXE® Terms of Use
The overall accessibility level of your application depends on the Popover features used.
Backend API
<div class="dx-fieldset form"> <div class="dx-field"> <div class="dx-field-label">Default mode</div> <div class="dx-field-value-static"> <p> <span id="subject1">Google AdWords Strategy</span> (<a id="link1">details</a>) </p> <dx-popover target="#link1" showEvent="mouseenter" hideEvent="mouseleave" position="top" [width]="300" > <div *dxTemplate="let data = model; of: 'content'"> Make final decision on whether we are going to increase our Google AdWord spend based on our 2013 marketing plan. </div> </dx-popover> </div> </div> <div class="dx-field"> <div class="dx-field-label">With title</div> <div class="dx-field-value-static"> <p> <span id="subject2"> Rollout of New Website and Marketing Brochures </span> (<a id="link2">details</a>) </p> <dx-popover target="#link2" showEvent="mouseenter" hideEvent="mouseleave" position="bottom" [width]="300" [showTitle]="true" title="Details" > <div *dxTemplate="let data = model; of: 'content'"> The designs for new brochures and website have been approved. Launch date is set for Feb 28. </div> </dx-popover> </div> </div> <div class="dx-field"> <div class="dx-field-label">With animation</div> <div class="dx-field-value-static"> <p> <span id="subject3"> Create 2012 Sales Report </span> (<a id="link3">details</a>) </p> <dx-popover target="#link3" showEvent="mouseenter" hideEvent="mouseleave" position="top" [width]="300" > <dxo-animation> <dxo-show type="pop" [from]="{ scale: 0 }" [to]="{ scale: 1 }" ></dxo-show> <dxo-hide type="fade" [from]="1" [to]="0"></dxo-hide> </dxo-animation> <div *dxTemplate="let data = model; of: 'content'"> 2012 Sales Report has to be completed so we can determine if major changes are required to sales strategy. </div> </dx-popover> </div> </div> <div class="dx-field"> <div class="dx-field-label">With overlay</div> <div class="dx-field-value-static"> <p> <span id="subject4">Website Re-Design Plan</span> (<a id="link4">more</a>) </p> <dx-popover target="#link4" showEvent="click" position="top" [width]="300" [shading]="true" shadingColor="rgba(0, 0, 0, 0.5)" > <div *dxTemplate="let data of 'content'"> The changes in our brochure designs for 2013 require us to update key areas of our website. </div> </dx-popover> </div> </div> </div>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxPopoverModule, DxTemplateModule } from 'devextreme-angular'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', templateUrl: `app/app.component.html`, styleUrls: [`app/app.component.css`], }) export class AppComponent { } @NgModule({ imports: [ BrowserModule, DxPopoverModule, DxTemplateModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .form a { cursor: pointer; white-space: nowrap; border-bottom: 1px dashed; text-decoration: none; } ::ng-deep .form p { margin: 0; } ::ng-deep #link4 { border-bottom-style: solid; }
// 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/ const componentNames = [ 'accordion', 'action-sheet', 'autocomplete', 'bar-gauge', 'box', 'bullet', 'button-group', 'button', 'calendar', 'chart', 'check-box', 'circular-gauge', 'color-box', 'context-menu', 'data-grid', 'date-box', 'date-range-box', 'defer-rendering', 'diagram', 'draggable', 'drawer', 'drop-down-box', 'drop-down-button', 'file-manager', 'file-uploader', 'filter-builder', 'form', 'funnel', 'gallery', 'gantt', 'html-editor', 'linear-gauge', 'list', 'load-indicator', 'load-panel', 'lookup', 'map', 'menu', 'multi-view', 'nested', 'number-box', 'pie-chart', 'pivot-grid-field-chooser', 'pivot-grid', 'polar-chart', 'popover', 'popup', 'progress-bar', 'radio-group', 'range-selector', 'range-slider', 'recurrence-editor', 'resizable', 'responsive-box', 'sankey', 'scheduler', 'scroll-view', 'select-box', 'slider', 'sortable', 'sparkline', 'speed-dial-action', 'splitter', 'switch', 'tab-panel', 'tabs', 'tag-box', 'text-area', 'text-box', 'tile-view', 'toast', 'toolbar', 'tooltip', 'tree-list', 'tree-map', 'tree-view', 'validation-group', 'validation-summary', 'validator', 'vector-map', ]; window.exports = window.exports || {}; window.config = { transpiler: 'ts', typescriptOptions: { module: 'system', emitDecoratorMetadata: true, experimentalDecorators: true, }, meta: { 'typescript': { 'exports': 'ts', }, 'devextreme/time_zone_utils.js': { 'esModule': true, }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme/viz/palette.js': { 'esModule': true, }, '@angular/platform-browser-dynamic': { 'esModule': true, }, '@angular/platform-browser': { 'esModule': true, }, '@angular/core': { 'esModule': true, }, '@angular/common': { 'esModule': true, }, '@angular/common/http': { 'esModule': true, }, '@angular/compiler': { 'esModule': true, }, '@angular/animations': { 'esModule': true, }, '@angular/forms': { 'esModule': true, }, }, paths: { 'npm:': 'https://unpkg.com/', 'bundles:': '../../../../bundles/', }, map: { 'ts': 'npm:plugin-typescript@4.2.4/lib/plugin.js', 'typescript': 'npm:typescript@4.2.4/lib/typescript.js', /* @angular */ '@angular/compiler': 'bundles:@angular/compiler.umd.js', '@angular/platform-browser-dynamic': 'bundles:@angular/platform-browser-dynamic.umd.js', '@angular/core': 'bundles:@angular/core.umd.js', '@angular/core/primitives/signals': 'bundles:@angular/core.primitives.signals.umd.js', '@angular/common': 'bundles:@angular/common.umd.js', '@angular/common/http': 'bundles:@angular/common-http.umd.js', '@angular/platform-browser': 'bundles:@angular/platform-browser.umd.js', '@angular/platform-browser/animations': 'bundles:@angular/platform-browser.umd.js', '@angular/forms': 'bundles:@angular/forms.umd.js', /* devextreme */ 'devextreme': 'npm:devextreme@24.1.7/cjs', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13', 'devextreme/bundles/dx.all': 'npm:devextreme@24.1.7/bundles/dx.all.js', 'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.12', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.56', /* devextreme-angular umd maps */ 'devextreme-angular': 'bundles:devextreme-angular/devextreme-angular.umd.js', 'devextreme-angular/core': 'bundles:devextreme-angular/devextreme-angular-core.umd.js', 'devextreme-angular/http': 'bundles:devextreme-angular/devextreme-angular-http.umd.js', ...componentNames.reduce((acc, name) => { acc[`devextreme-angular/ui/${name}`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}.umd.js`; return acc; }, {}), 'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js', 'tslib': 'npm:tslib@2.6.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', '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.8/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.8/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.13/inferno/package.json', 'npm:rxjs@7.5.3/package.json', 'npm:rxjs@7.5.3/operators/package.json', 'npm:devexpress-diagram@2.2.12/package.json', 'npm:devexpress-gantt@4.1.56/package.json', ], }; System.config(window.config); // System.import('@angular/compiler').catch(console.error.bind(console));
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <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=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.7/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.13.3/bundles/zone.umd.min.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>

Attach Popover to a Page Element

Popover displays an arrow that points to a page element. To specify the element, set the target property to a CSS selector. In this demo, target elements are selected by id.

You can use the position property to position Popover relative to the target element. If you do not specify this property, Popover is displayed under the element.

Show and Hide Popover

The showEvent and hideEvent properties allow you to show and hide Popover in response to certain events. These properties can accept one or multiple names of DOM events or DevExtreme UI events separated by a space character.

You can also specify a delay before the events occur. Set the showEvent and hideEvent properties to an object with the name (one or multiple event names) and delay properties.

In this demo, the last Popover appears when you click its target element because its showEvent property is set to the DevExtreme dxclick event. Other Popover components appear and disappear on the mouseenter and mouseleave DOM events.

Specify Content

Popover consists of content area and a title. You can specify static content in the HTML markup as shown in this demo. If Popover should display dynamic content, use the contentTemplate property to specify a template. To display the title, enable the showTitle property and set the title property to the title text.

Animate Popover

If you want to show and hide Popover with animation effects, assign an object with the show and hide fields to the animation property. Each of these fields accepts an object that configures the animation type and other properties. In this demo, Popover appears with a pop-up animation and fades away when it disappears.

Shade the Background

You can show Popover with a shaded background. To do this, enable the shading property and specify a shadingColor.