Today I'll show you how I used ngStyle along with CSS grid to create a resizeable grid.
ngStyle For The Win
ngStyle is a built-in attribute directive that lets you set styles by binding to an expression such as a function.
Here in my card-container.component.html
I am binding to my getStyles
method.
<div class="cards-grid" [ngStyle]="getStyles()"> <app-card *ngFor="let band of bands; index as i" [bandData]="bands[i]" ></app-card> </div>
This getStyles in my card-container.component.ts
method returns an object with my defined styles. The magic is in the grid-template-columns
value. I am using string interpolation to pass in a property called columns
.
public getStyles() { return { display: 'grid', 'grid-template-columns': `repeat(${this.columns}, 1fr)`, 'justify-items': 'center', }; }
If we look at the entire card-container.component.html
component, you will see that I'm using an input and this is where the value for the columns
property comes from.
<div class="card-container"> <div class="cards-header"> <mat-form-field> <mat-label>Columns</mat-label> <input matInput type="number" min="1" max="5" [(ngModel)]="columns" /> </mat-form-field> </div> <div class="cards-grid" [ngStyle]="getStyles()"> <app-card *ngFor="let band of bands; index as i" [bandData]="bands[i]" ></app-card> </div> </div>
If we look at the entire card-container.component.ts
file you will see that I initialize the columns property to 4.
import { Component, OnInit } from '@angular/core';
import * as bandData from './powermetal.json';
@Component({
selector: 'app-card-container',
templateUrl: './card-container.component.html',
styleUrls: ['./card-container.component.scss'],
})
export class CardContainerComponent implements OnInit {
public columns: number = 4;
public bands: any = (bandData as any).default;
constructor() {}
ngOnInit(): void {}
public getStyles() {
return {
display: 'grid',
'grid-template-columns': repeat(</span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">columns</span><span class="p">}</span><span class="s2">, 1fr)
,
'justify-items': 'center',
};
}
}
Thoughts?
I'd love you hear your thoughts on this. I don't think you would want to use an input like I'm doing here. The number of columns could go in to a settings page, or wherever else it fits in to the application.
Repository
If you want to see the code, you can check it out here.
Top comments (0)