Угловой 5 Матовый сетчатый список отзывчивый
я создал список сетки со столбцом 6, и я хочу, чтобы название сетки занимало 100% ширину на устройствах с маленькими экранами. Теперь он создает 6 столбцов на маленьких экранах
Ожидаемое: одно название сетки занимает 100% пространства только на мобильном устройстве
Ответы
Ответ 1
Вы должны установить атрибут cols
mat-grid-list
динамически в зависимости от ширины экрана. Вам нужно будет решить, на какую точку останова ширины будет mat-grid-list
с 1 столбцами mat-grid-list
.
HTML:
<mat-grid-list [cols]="breakpoint" rowHeight="2:0.5" (window:resize)="onResize($event)">
<mat-grid-tile>1</mat-grid-tile>
<mat-grid-tile>2</mat-grid-tile>
<mat-grid-tile>3</mat-grid-tile>
<mat-grid-tile>4</mat-grid-tile>
<mat-grid-tile>5</mat-grid-tile>
<mat-grid-tile>6</mat-grid-tile>
</mat-grid-list>
TS:
ngOnInit() {
this.breakpoint = (window.innerWidth <= 400) ? 1 : 6;
}
onResize(event) {
this.breakpoint = (event.target.innerWidth <= 400) ? 1 : 6;
}
Демонстрация Stackblitz здесь
Надеюсь это поможет!
Ответ 2
Мне понравился ответ Altus, но я хотел бы иметь больше контрольных точек. Поэтому я создал простой метод с некоторыми точками останова, используя службу FlexLayout ObservableMedia, а не onResize:
import { AfterContentInit, Component, ViewChild } from '@angular/core';
import { MediaChange, ObservableMedia } from '@angular/flex-layout';
import { MatGridList } from '@angular/material';
@Component({
selector: 'app-grid',
templateUrl: './grid.component.html',
styleUrls: ['./grid.component.css']
})
export class GridComponent implements AfterContentInit {
@ViewChild('grid') grid: MatGridList;
gridByBreakpoint = {
xl: 8,
lg: 6,
md: 4,
sm: 2,
xs: 1
}
constructor(private observableMedia: ObservableMedia) {}
ngAfterContentInit() {
this.observableMedia.asObservable().subscribe((change: MediaChange) => {
this.grid.cols = this.gridByBreakpoint[change.mqAlias];
});
}
}
<span>Breakpoint: {{grid.cols}}</span>
<mat-grid-list #grid rowHeight="2:1">
<mat-grid-tile>1</mat-grid-tile>
<mat-grid-tile>2</mat-grid-tile>
<mat-grid-tile>3</mat-grid-tile>
<mat-grid-tile>4</mat-grid-tile>
<mat-grid-tile>5</mat-grid-tile>
<mat-grid-tile>6</mat-grid-tile>
<mat-grid-tile>7</mat-grid-tile>
<mat-grid-tile>8</mat-grid-tile>
</mat-grid-list>
Ответ 3
Вы можете использовать следующую директиву, если вам нужно многоразовое решение:
import { Directive, Input, OnInit } from '@angular/core';
import { MatGridList } from '@angular/material';
import { ObservableMedia, MediaChange } from '@angular/flex-layout';
export interface IResponsiveColumnsMap {
xs?: number;
sm?: number;
md?: number;
lg?: number;
xl?: number;
}
// Usage: <mat-grid-list [responsiveCols]="{xs: 2, sm: 2, md: 4, lg: 6, xl: 8}">
@Directive({
selector: '[responsiveCols]'
})
export class ResponsiveColsDirective implements OnInit {
private countBySize: IResponsiveColumnsMap = {xs: 2, sm: 2, md: 4, lg: 6, xl: 8};
public get cols(): IResponsiveColumnsMap {
return this.countBySize;
}
@Input('responsiveCols')
public set cols(map: IResponsiveColumnsMap) {
if (map && ('object' === (typeof map))) {
this.countBySize = map;
}
}
public constructor(
private grid: MatGridList,
private media: ObservableMedia
) {
this.initializeColsCount();
}
public ngOnInit(): void {
this.initializeColsCount();
this.media.asObservable()
.subscribe((changes: MediaChange) =>
this.grid.cols = this.countBySize[changes.mqAlias]
);
}
private initializeColsCount(): void {
Object.keys(this.countBySize).some(
(mqAlias: string): boolean => {
const isActive = this.media.isActive(mqAlias);
if (isActive) {
this.grid.cols = this.countBySize[mqAlias];
}
return isActive;
});
}
}
Ответ 4
Отличная работа всем!
Я сделал некоторые дополнительные улучшения для Алексея Сердюков. Ответ:
- обновлено для flex-layout 7.0. 0+
- при изменении размера окна директива при некоторых обстоятельствах возвращала неправильный счет
Gist @GitHub: https://gist.github.com/mzellho/7fc7d5bd52a29948c47911a993547dad
Ответ 5
Дополнение к ответу @Leo Caserio, если при первой загрузке вы получаете сообщение об ошибке:
Ошибка: mat-grid-list: должен указывать количество столбцов. Пример:...
Вы можете использовать subject
:
Составная часть
@ViewChild('grid',{static:true}) grid: MatGridList;
cols:Subject<any> = new Subject();
constructor(private observableMedia: MediaObserver) { }
ngAfterContentInit() {
this.observableMedia.asObservable().subscribe((change: MediaChange[]) => {
this.cols.next(this.gridByBreakpoint[change[0].mqAlias]);
});
}
шаблон
<mat-grid-list #grid [cols]="cols | async" rowHeight = "1:1">
Примечание: @angular/flex-layout ": {" version ":" 8.0.0-beta.26 "}