Grid布局

18 阅读3分钟

在开发页面过程中需要实现两个有意思的布局样式,在此记录并分享一下。

样式一:

图片

实现思路:

通过分析,上图布局可以明确分为 3行 2列,各图片占位如下图:

图片

  • 通过使用grid-template-areas属性定义网格模板区域实现
  • 通过grid-row-startgrid-row-end设置网格行的起始和终止位置

具体代码如下

<div class="image-group">
    <img class="image-item item1" src="1.png" alt=""/>
    <img class="image-item item2" src="2.png" alt=""/>
    <img class="image-item item3" src="3.png" alt=""/>
</div>
.image-group {
    display: grid;
    gap20px;
    grid-template-areas:
        "item1 item2"
        "item3 item2";
    /*按比例设置每行每列*/
    grid-template-columns1fr 1.5fr;
    grid-template-rows1fr 6.25fr 9fr;
}
.image-group.image-item {
    width100%;
    height100%;
    display: block;
}
.item1 {
    grid-area: item1; /* 左上角图片 */
    grid-row-start1;
    grid-row-end3;
}
.item2 {
    grid-area: item2; /* 右侧图片 */
    grid-row-start2;
    grid-row-end4;
}
.item3 {
    grid-area: item3; /* 左下角图片 */
    grid-row-start3;
    grid-row-end4;
}

样式二:

图片

实现思路

  • 跟上面的布局差不多,可以浅显的理解为用grid-row代替了grid-row-startgrid-row-end,用grid-column代替了grid-template-areas
<div class="images-container">
  <img class="image-item item1" src="1.png" alt=""/>
  <img class="image-item item2" src="2.png" alt=""/>
  <img class="image-item item3" src="3.png" alt=""/>
  <img class="image-item item4" src="4.png" alt=""/>
</div>
.images-container {
  display: grid;
  /* 定义3列 */
  grid-template-columns1.379fr 1fr 1.91fr;
  /* 定义2行 */
  grid-template-rows1fr 1fr;
  gap20px;
}
.item1 {
  grid-column1/2;
  grid-row1/3;
  aspect-ratio: 400 / 600;
}
.item2 {
  grid-column2/3;
  grid-row1/2;
  aspect-ratio: 290 / 290;
}
.item3 {
  grid-column3/4;
  grid-row1/2;
  aspect-ratio: 554 / 290;
}
.item4 {
  grid-column2/4;
  grid-row2/3;
  aspect-ratio: 864 / 290;
}

总结:

  • grid-auto-columns:定义当网格项目需要超出你用 grid-template-columns定义的列时,自动创建的额外列的宽度
  • grid-auto-rows:定义当网格项目需要超出你用 grid-template-rows定义的行时,自动创建的额外行的高度
  • grid-auto-flow:控制没有明确放置位置的网格项目(items)如何自动放置,常用值如下:
    • row【默认值】:优先填充行,内容会从左到右依次填充一行,填满后再换下一行
    • column:优先填充列
    • dense:这是一个“优化”选项,可以和row 或 column 一起使用(例如:grid-auto-flow: row dense;)。它的作用是,当网格中有一些空白小格子时,它会尝试把后面较小的积木“塞”进这些空白格子,以减少网格中的空隙
  • grid-template-columns:用于定义网格有多少列
  • grid-template-rows:用于定义网格有多少行
  • grid-areagrid-row-startgrid-column-startgrid-row-endgrid-column-end组合属性的简写
  • grid-columngrid-column-startgrid-column-end组合属性的简写
  • grid-rowgrid-row-startgrid-row-end组合属性的简写
  • grid-templategrid-template-areagrid-template-columnsgrid-template-rows组合属性的简写
  • order:设置了flex 或grid 容器中项目的布局顺序,数值越小位置越靠前 
    • 使用场景:在本次开发中用到此属性的场景是,在PC端一个容器中 文字在前图片在后,而在移动端图片在前,文字在后,可以使用此属性控制