- Grid宫格
- 规则
- 代码演示
- API
Grid宫格
在水平和垂直方向,将布局切分成若干等大的区块。
规则
- 区块中的内容应该是同类元素,eg:都是图片,或者都是图标+文字。
代码演示
基本用法
最简单的用法。
import { Component } from '@angular/core';
@Component({
selector: 'demo-grid-basic',
template: `
<div class="sub-title">Always square grid item </div>
<Grid [activeStyle]="false" [data]="data" (onClick)="click($event)"></Grid>
<br>
<Grid [activeStyle]="false" [data]="dataList" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">Grid item adjust accroiding to img size </div>
<Grid class="not-square-grid" [data]="data" [square]="false" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">ColumnNum=3 </div>
<Grid [data]="data" [columnNum]="3" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">No border </div>
<Grid [data]="data" [hasLine]="false" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">Carousel</div>
<Grid [data]="data" [isCarousel]="true" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">Custom content</div>
<Grid [data]="data" [columnNum]="3" [itemStyle]="{ height: '150px', background: 'rgba(0,0,0,.05)' }" (onClick)="click($event)"></Grid>
<br>
<div class="sub-title">ng-content</div>
<Grid>
<Flex *ngFor="let item of gridData; let i = index" [justify]="'center'" [align]="'stretch'">
<FlexItem *ngFor="let subItem of item; let j = index">
<div *ngIf="subItem !== null" class="am-grid-item-content" (click)="click(subItem, i * columnNum + j)">
<div class="am-grid-item-inner-content column-num-{{ columnNum }}">
<img src="{{ subItem.icon }}" class="am-grid-icon" />
<div class="am-grid-text">{{ subItem.text }}</div>
</div>
</div>
<div *ngIf="subItem === null" class="am-grid-null-item"></div>
</FlexItem>
</Flex>
</Grid>
`,
styles: [
`
.sub-title {
color: #888;
font-size: 14px;
padding: 15px 0 9px 15px;
}
/deep/.not-square-grid .am-grid-icon {
width: 40px;
height: 60px;
}
`
]
})
export class DemoGridBasicComponent {
gridData = [];
data = Array.from(new Array(9)).map((_val, i) => ({
icon: '/assets/img/logo.svg',
text: `name${i}`
}));
data1 = Array.from(new Array(9)).map(() => ({
icon: 'https://gw.alipayobjects.com/zos/rmsportal/WXoqXTHrSnRcUwEaQgXJ.png'
}));
dataList = Array.from(new Array(9)).map((_val, i) => ({
icon: `<img src="/assets/img/logo.svg" style="width:36px"/>`,
text: `name${i}`
}));
click(event) {
console.log(event);
}
constructor() {
this.init();
}
init() {
const dataLength = (this.data && this.data.length) || 0;
let rowCount = Math.ceil(dataLength / 3);
this.gridData = this.getRows(rowCount, dataLength);
}
getRows(rowCount: number, dataLength: number) {
const columnNum = 3;
const rowArr = new Array();
for (let i = 0; i < rowCount; i++) {
rowArr[i] = new Array();
for (let j = 0; j < columnNum; j++) {
const dataIndex = i * columnNum + j;
if (dataIndex < dataLength) {
rowArr[i][j] = this.data[dataIndex];
} else {
rowArr[i][j] = null;
}
}
}
return rowArr;
}
}
API
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
data | 传入的菜单数据 | Array<{icon, text}> | [] |
onClick | 点击每个菜单的回调函数 | (el: Object, index: number): void | - |
columnNum | 列数 | number | 4 |
hasLine | 是否有边框 | boolean | true |
isCarousel | 是否跑马灯, | boolean | false |
carouselMaxRow | 如果是跑马灯, 一页跑马灯需要展示的行数 | number | 2 |
square | 每个格子是否固定为正方形 | boolean | true |
itemStyle | 每个格子自定义样式 | object | {} |
activeStyle | 是否显示点击状态 | boolean | true |
注: Grid 支持ng-content.