Angular Card Component Overview
Angular Card represents a flexible container that has different elements like title text, descriptions, image styles, call to action buttons, links and others. In order to represent a given scenario/content in the best possible way, it offers various display options, headers, footers, as well as background colors, animations, and more.
This lightweight Angular Card component is used for creating all sorts of cards, some of them can be – business cards, material flipping cards, stacked cards.
Angular Card Example
Below you can see a basic sample of a well-crafted Ignite UI for Angular Card with main card sections like image, title, subtitle, primary card content, container for a button.
Getting Started with Ignite UI for Angular Card
To get started with the Ignite UI for Angular Card component, first you need to install Ignite UI for Angular. In an existing Angular application, type the following command:
ng add igniteui-angular
For a complete introduction to the Ignite UI for Angular, read the getting started topic.
The next step is to import the IgxCardModule
inside your app.module.ts file.
// app.module.ts
...
import { IgxCardModule } from 'igniteui-angular';
// import { IgxCardModule } from '@infragistics/igniteui-angular'; for licensed package
@NgModule({
...
imports: [..., IgxCardModule],
...
})
export class AppModule {}
Alternatively, as of 16.0.0
you can import the IgxCardComponent
as a standalone dependency, or use the IGX_CARD_DIRECTIVES
token to import the component and all of its supporting components and directives.
// home.component.ts
import { IGX_CARD_DIRECTIVES } from 'igniteui-angular';
// import { IGX_CARD_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-home',
template: `
<igx-card>
<igx-card-media height="196px">
<img [src]="https://images.unsplash.com/photo-1518235506717-e1ed3306a89b?ixlib=rb-1.2.1&auto=format&fit=crop&w=640&q=50">
</igx-card-media>
<igx-card-header>
<h3 igxCardHeaderTitle>New York</h3>
<h5 igxCardHeaderSubtitle>City in New York</h5>
</igx-card-header>
<igx-card-content>
<p>New York City comprises 5 boroughs sitting where the Hudson River meets the Atlantic Ocean. At its core is Manhattan, a densely populated borough that’s among the world’s major commercial, financial and cultural centers.</p>
</igx-card-content>
<igx-card-actions>
<button igxButton igxRipple>Read More</button>
<button igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>favorite</igx-icon>
</button>
<button igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>share</igx-icon>
</button>
</igx-card-actions>
</igx-card>
`,
styleUrls: ['home.component.scss'],
standalone: true,
imports: [IGX_CARD_DIRECTIVES]
/* or imports: [IgxCardComponent,
IgxCardHeaderComponent,
IgxCardMediaDirective,
IgxCardContentDirective,
IgxCardActionsComponent,
IgxCardFooterDirective,
IgxCardHeaderTitleDirective,
IgxCardHeaderSubtitleDirective,
IgxCardThumbnailDirective,
IgxButtonDirective,
IgxRippleDirective] */
})
export class HomeComponent {}
Now that you have the Ignite UI for Angular Card module or directives imported, you can start using the igx-card
component.
Using the Angular Card Component
Then to represent the demo card template we can add the following code.
<!--card.component.html>-->
<igx-card>
<igx-card-media height="196px">
<img [src]="https://images.unsplash.com/photo-1518235506717-e1ed3306a89b?ixlib=rb-1.2.1&auto=format&fit=crop&w=640&q=50">
</igx-card-media>
<igx-card-header>
<h3 igxCardHeaderTitle>New York</h3>
<h5 igxCardHeaderSubtitle>City in New York</h5>
</igx-card-header>
<igx-card-content>
<p>New York City comprises 5 boroughs sitting where the Hudson River meets the Atlantic Ocean. At its core is Manhattan, a densely populated borough that’s among the world’s major commercial, financial and cultural centers.</p>
</igx-card-content>
<igx-card-actions>
<button igxButton igxRipple>Read More</button>
<button igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>favorite</igx-icon>
</button>
<button igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>share</igx-icon>
</button>
</igx-card-actions>
</igx-card>
You will notice a few things above. First when we want to tag an elements as a header title, like the h3
heading, we place it between the igx-card-header
tags and attach the igxCardHeaderTitle
directive to the element. Conversely, if we wanted to make another heading element a subtitle
we would attach the igxCardHeaderSubtitle
to it.
Any image or video we want to show in the Angular Card, we wrap inside the igx-card-media
tags. The igx-card-media
allows us to size the content placed inside via the width
and height
attributes. In the example above we provided just height
, which would leave the width to auto
, thus allowing the image to stretch across the entire card surface, while maintaining the set height.
You can place anything inside the igx-card-content
tags. Usually text goes there.
Finally, the igx-card-actions
is where you'd place any actionable items, like buttons. If you use the igxButton
directive on an element, it will automatically be placed correctly according to the material design spec inside the area.
Media, Thumbs, and Avatars
If you want to show an image or icon in the card header next to the title and subtitle, you can do it by using the igxCardThumbnail
directive.
Taking the card above as an example, we can edit the contents of the igx-card-header
and add a igxCardThumbnail
container to hold an icon:
<igx-card-header>
<div igxCardThumbnail>
<igx-icon>place</igx-icon>
</div>
<h3 igxCardHeaderTitle>Title</h3>
<h5 igxCardHeaderSubtitle>Subtitle</h5>
</igx-card-header>
The above example will show the icon alongside the title and subtitle in the card header.
We also automatically detect the presence of igx-avatar
or igx-card-media
placed in the card header. They will appear as if they were card thumbnails. So you can do:
<igx-card-header>
<igx-avatar>
<igx-icon>place</igx-icon>
</igx-avatar>
<h3 igxCardHeaderTitle>Title</h3>
<h5 igxCardHeaderSubtitle>Subtitle</h5>
</igx-card-header>
or, even this:
<igx-card-header>
<igx-card-media width="40px" height="40px">
<img src="https://images.unsplash.com/photo-1518235506717-e1ed3306a89b?ixlib=rb-1.2.1&auto=format&fit=crop&w=80&q=50">
</igx-card-media>
<h3 igxCardHeaderTitle>Title</h3>
<h5 igxCardHeaderSubtitle>Subtitle</h5>
</igx-card-header>
Outlined cards
The card has a type
attribute you can set to either default
(set automatically if omitted), or outlined
. The outlined
type removes any shadows from the card, replacing them with a thin border to separate the card from the background.
Angular Card Horizontal Layout
By default all sections of the card (header, content, media, actions) are laid out vertically. This is nice when we have a lot of vertical space. Say we wanted to lay out all the sections in the card horizontally. We can use the horizontal
attribute of the card to set its layout.
Here's an example of an outlined horizontal card:
<igx-card type="outlined" [horizontal]="horizontal">
<div class="h-sample-column">
<igx-card-header>
<h5 igxCardHeaderTitle>{{card.title}}</h5>
<h5 igxCardHeaderSubtitle>{{card.subtitle}}</h5>
<igx-card-media width="64px" height="64px">
<img [src]="card.imageUrl">
</igx-card-media>
</igx-card-header>
<igx-card-content>
<p>{{card.content}}</p>
</igx-card-content>
</div>
<igx-divider [vertical]="horizontal"></igx-divider>
<igx-card-actions layout="justify">
<button *ngFor="let icon of card.icons;" igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>{{icon}}</igx-icon>
</button>
</igx-card-actions>
</igx-card>
We are using the .h-sample-column
class to bundle the igx-card-header
and igx-card-content
together, keeping them aligned vertically, while other sections in the card align horizontally.
The styles that .h-sample-column
class applies are:
.h-sample-column {
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1 1 0%;
igx-card-header {
padding-bottom: 0;
}
}
Notice how the buttons in the igx-card-actions
have now switched to a vertical
layout. The igx-card-actions
has an inverse
layout relationship with its parent. So whenever the card's horizontal
attribute is set to true
the actions vertical
property will be set to true
and vice versa.
You can set the vertical
attribute of he actions area explicitly, thus overriding this default behavior.
<igx-card-actions layout="justify" [vertical]="false">
<button *ngFor="let icon of card.icons;" igxIconButton="flat" igxRipple igxRippleCentered="true">
<igx-icon>{{icon}}</igx-icon>
</button>
</igx-card-actions>
If everything went well, our card should look like this:
Alternative layouts
You can get even more creative with the layout of the igx-card
.
Below is an example showing how you can create a semi-horizontal card, where we have every section of the card laid out vertically, while the igx-card-media
appears alongside the vertical sections of the card.
<igx-card [horizontal]="horizontal">
<div igxLayout igxLayoutDir="column" igxFlex igxFlexGrow="1">
<igx-card-header>
<igx-avatar [src]="card.avatarUrl"></igx-avatar>
<h5 igxCardHeaderTitle>{{card.title}}</h5>
<h5 igxCardHeaderSubtitle>{{card.subtitle}}</h5>
</igx-card-header>
<igx-card-content>
<p>{{card.content}}</p>
</igx-card-content>
<igx-card-actions [vertical]="false">
<button *ngFor="let button of card.buttons;" igxButton="flat" igxRipple>
{{button}}
</button>
</igx-card-actions>
</div>
<igx-card-media width="96px">
<img [src]="card.imageUrl">
</igx-card-media>
</igx-card>
Angular Card Actions
The Angular Card actions area allows additional configuration to what we have already mentioned.
You can position elements in the card actions area either in the start or the end by using the igxStart
or igxEnd
directives.
<igx-card-actions>
<button igxIconButton="flat" igxStart>
<igx-icon>drag_indicator</igx-icon>
</button>
<button igxIconButton="flat" igxEnd>
<igx-icon>favorite</igx-icon>
</button>
</igx-card-actions>
You can justify the buttons so that they are laid out across the entire axis, not at the opposite ends. To do that, use the layout
attribute and set its value to justify
, like below:
<igx-card-actions layout="justify">
<button igxButton>Button</button>
<button igxIconButton="flat">
<igx-icon>star</igx-icon>
</button>
</igx-card-actions>
Styling
To get started with styling the card, we need to import the index
file, where all the theme functions and component mixins live:
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Following the simplest approach, we create a new theme that extends the card-theme
and accepts some parameters that style the card's items:
$colorful-card: card-theme(
$background: #011627,
$header-text-color: #FEFEFE,
$subtitle-text-color: #ECAA53,
$content-text-color: #FEFEFE
);
As seen, the card-theme
exposes some useful parameters for basic styling of its items.
Including themes
The last step is to include the component theme in our application.
If $legacy-support
is set to true
, include the component theme like that:
@include card($colorful-card);
Note
If the component is using an Emulated
ViewEncapsulation, it is necessary to penetrate
this encapsulation using ::ng-deep
:host {
::ng-deep {
@include card($colorful-card);
}
}
If $legacy-support
is set to false
(default), include the component css variables like that:
@include css-vars($colorful-card);
Note
If the component is using an Emulated
ViewEncapsulation, you still have to use :host
because you need a global selector in order to override the variables.
:host {
@include css-vars($colorful-card);
}
Angular Card Demo
Summary
In this article we covered a lot of ground with the card component. First, we created a very simple card with text content only. Then added some images to make the card a bit more appealing. We used some additional Ignite UI for Angular components inside our card, avatar, buttons and icons, to enrich the experience and add some functionality. And finally, we changed the card's theme by setting some exposed theme colors, creating custom palettes and extending schemas. The card component is capable of displaying more different layouts worth exploring in the Card Demo in the beginning of this article.
API and Style References
For more detailed information regarding the card's API, refer to the following links:
The following built-in CSS styles helped us achieve this card layout:
Additional components and/or directives that were used:
Styles: