Style grid header cells and column groups.
The grid exposes many theme parameters starting header* for customising header appearance:
const myTheme = themeQuartz.withParams({
headerHeight: '30px',
headerTextColor: 'white',
headerBackgroundColor: 'black',
headerCellHoverBackgroundColor: 'rgba(80, 40, 140, 0.66)',
headerCellMovingBackgroundColor: 'rgb(80, 40, 140)',
});For the full list, see the Headers section of the parameters reference.
When the theme parameters are not enough you can use CSS classes, in particular ag-header, ag-header-cell, and ag-header-group-cell:
.ag-header {
font-family: cursive;
}
.ag-header-group-cell {
font-weight: normal;
font-size: 22px;
}
.ag-header-cell {
font-size: 18px;
}import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
Theme,
enableDevValidations,
themeQuartz,
} from "ag-grid-community";
import { AllEnterpriseModule } from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
enableDevValidations();
}
ModuleRegistry.registerModules([AllEnterpriseModule]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[theme]="theme"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
theme: Theme | "legacy" = myTheme;
columnDefs: (ColDef | ColGroupDef)[] = [
{
headerName: "Group 1",
children: [{ field: "athlete", minWidth: 170 }, { field: "age" }],
},
{
headerName: "Group 2",
children: [
{ field: "country" },
{ field: "year" },
{ field: "date" },
{ field: "sport" },
{ field: "gold" },
{ field: "silver" },
{ field: "bronze" },
{ field: "total" },
],
},
];
defaultColDef: ColDef = {
editable: true,
filter: true,
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicData>) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
const myTheme = themeQuartz.withParams({
headerHeight: "30px",
headerTextColor: "white",
headerBackgroundColor: "black",
headerCellHoverBackgroundColor: "rgba(80, 40, 140, 0.66)",
headerCellMovingBackgroundColor: "rgb(80, 40, 140)",
});
.ag-header {
font-family: cursive;
}
.ag-header-group-cell {
font-weight: normal;
font-size: 22px;
}
.ag-header-cell {
font-size: 18px;
}
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
export interface IOlympicData {
athlete: string,
age: number,
country: string,
year: number,
date: string,
sport: string,
gold: number,
silver: number,
bronze: number,
total: number
} Header Column Borders and Resize Handles Copy Link
Header Column Borders appear between every column, whereas Resize Handles only appear on resizeable columns (Group 1 in the example below).
const myTheme = themeQuartz.withParams({
headerColumnBorder: { color: 'purple' },
headerColumnBorderHeight: '80%',
headerColumnResizeHandleColor: 'orange',
headerColumnResizeHandleHeight: '25%',
headerColumnResizeHandleWidth: '5px',
});import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import {
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
Theme,
enableDevValidations,
themeQuartz,
} from "ag-grid-community";
import { AllEnterpriseModule } from "ag-grid-enterprise";
if (process.env.NODE_ENV !== "production") {
enableDevValidations();
}
ModuleRegistry.registerModules([AllEnterpriseModule]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[theme]="theme"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
theme: Theme | "legacy" = myTheme;
columnDefs: (ColDef | ColGroupDef)[] = [
{
headerName: "Group 1",
children: [
{ field: "athlete", minWidth: 170, resizable: true },
{ field: "age", resizable: true },
],
resizable: true,
},
{
headerName: "Group 2",
children: [
{ field: "country" },
{ field: "year" },
{ field: "date" },
{ field: "sport" },
{ field: "gold" },
{ field: "silver" },
{ field: "bronze" },
{ field: "total" },
],
},
];
defaultColDef: ColDef = {
editable: true,
filter: true,
resizable: false,
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicData>) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
const myTheme = themeQuartz.withParams({
headerColumnBorder: { color: "purple" },
headerColumnBorderHeight: "80%",
headerColumnResizeHandleColor: "orange",
headerColumnResizeHandleHeight: "25%",
headerColumnResizeHandleWidth: "5px",
});
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
export interface IOlympicData {
athlete: string,
age: number,
country: string,
year: number,
date: string,
sport: string,
gold: number,
silver: number,
bronze: number,
total: number
} Style Header on Filter Copy Link
Each time a Column Filter is applied to a column, the CSS class ag-header-cell-filtered is added to the header. This can be used for adding style to headers that are filtered.
The example below adds some styling to ag-header-cell-filtered, so when you filter a column you will notice the column header change.
import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
AllCommunityModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
GridState,
ModuleRegistry,
enableDevValidations,
} from "ag-grid-community";
if (process.env.NODE_ENV !== "production") {
enableDevValidations();
}
ModuleRegistry.registerModules([AllCommunityModule]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[initialState]="initialState"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
columnDefs: ColDef[] = [
{ field: "athlete" },
{ field: "age", maxWidth: 120 },
{ field: "country" },
{ field: "year", maxWidth: 120 },
{ field: "sport" },
{ field: "gold" },
{ field: "silver" },
{ field: "bronze" },
{ field: "total" },
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 150,
filter: true,
};
initialState: GridState = {
filter: {
filterModel: {
country: {
filterType: "text",
type: "contains",
filter: "us",
},
},
},
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicData>) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
.ag-header-cell-filtered {
background-color: #1b6d8544;
}
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
export interface IOlympicData {
athlete: string,
age: number,
country: string,
year: number,
date: string,
sport: string,
gold: number,
silver: number,
bronze: number,
total: number
} Styling the First and Last Columns Copy Link
You can style all first and last column headers (Grouped, Non-Grouped and Floating Filters) using CSS by targeting the .ag-column-first and .ag-column-last selectors as follows:
.ag-header-group-cell.ag-column-first {
background-color: #2244cc66; /* bluest */
}
.ag-header-cell.ag-column-first {
background-color: #2244cc44; /* bluer */
}
.ag-floating-filter.ag-column-first {
background-color: #2244cc22; /* blue */
}
.ag-header-group-cell.ag-column-last {
background-color: #33cc3366; /* greenest */
}
.ag-header-cell.ag-column-last {
background-color: #33cc3344; /* greener */
}
.ag-floating-filter.ag-column-last {
background-color: #33cc3322; /* green */
}import { Component } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { AgGridAngular } from "ag-grid-angular";
import "./styles.css";
import {
AllCommunityModule,
ColDef,
ColGroupDef,
GridApi,
GridOptions,
GridReadyEvent,
ModuleRegistry,
enableDevValidations,
} from "ag-grid-community";
if (process.env.NODE_ENV !== "production") {
enableDevValidations();
}
ModuleRegistry.registerModules([AllCommunityModule]);
import { IOlympicData } from "./interfaces";
@Component({
selector: "my-app",
standalone: true,
imports: [AgGridAngular],
template: `<ag-grid-angular
style="width: 100%; height: 100%;"
[columnDefs]="columnDefs"
[defaultColDef]="defaultColDef"
[rowData]="rowData"
(gridReady)="onGridReady($event)"
/> `,
})
export class AppComponent {
columnDefs: (ColDef | ColGroupDef)[] = [
{
headerName: "Athlete Details",
children: [
{ field: "athlete" },
{ field: "age", maxWidth: 120 },
{ field: "country" },
],
},
{ field: "year", maxWidth: 100 },
{
headerName: "Sport Details",
children: [
{ field: "total", columnGroupShow: "closed" },
{ field: "gold", columnGroupShow: "open" },
{ field: "silver", columnGroupShow: "open" },
{ field: "bronze", columnGroupShow: "open" },
],
},
];
defaultColDef: ColDef = {
flex: 1,
minWidth: 150,
filter: true,
floatingFilter: true,
};
rowData!: IOlympicData[];
constructor(private http: HttpClient) {}
onGridReady(params: GridReadyEvent<IOlympicData>) {
this.http
.get<
IOlympicData[]
>("https://www.ag-grid.com/example-assets/olympic-winners.json")
.subscribe((data) => (this.rowData = data));
}
}
.ag-header-group-cell.ag-column-first {
background-color: #2244cc66; /* bluest */
}
.ag-header-cell.ag-column-first {
background-color: #2244cc44; /* bluer */
}
.ag-floating-filter.ag-column-first {
background-color: #2244cc22; /* blue */
}
.ag-header-group-cell.ag-column-last {
background-color: #33cc3366; /* greenest */
}
.ag-header-cell.ag-column-last {
background-color: #33cc3344; /* greener */
}
.ag-floating-filter.ag-column-last {
background-color: #33cc3322; /* green */
}
import '@angular/compiler';
import { provideHttpClient } from '@angular/common/http';
import { enableProdMode } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app.component';
if (new URLSearchParams(window.location.search).get('prod') !== 'false') {
enableProdMode();
}
const app = bootstrapApplication(AppComponent, {
providers: [provideHttpClient()],
});
export interface IOlympicData {
athlete: string,
age: number,
country: string,
year: number,
date: string,
sport: string,
gold: number,
silver: number,
bronze: number,
total: number
}