CSS布局之网格布局-display: grid; display: inline-grid;

CSS布局之网格布局-display: grid; display: inline-grid;

前言

CSS布局有很多种类型,float浮动布局,flex弹性盒子布局,百分比布局,圣杯布局,双飞翼布局,表格布局。网格布局和table布局有相似之处,但又比之灵活。

网格布局

通过给元素设置 display: grid; display: inline-grid; 属性,元素便成为grid网格布局容器,直接子元素则成为 item。网格布局就是对容器container和直接子元素item设置相关的CSS属性,来达到布局的目的。

直接看实例

现在通过例子的形式,把网格布局相关的CSS属性作用和用法通过SCSS写下来,以方便查找使用。

Grid.jsx

import React, {
    
     Component } from 'react'
import './grid.scss'

export default class Grid extends Component {
    
    
  render() {
    
    
    return (
      <>
        <h1>Grid Layout</h1>
        <ul className="grid-list">
          <li className="item item-1">1</li>
          <li className="item item-2">2</li>
          <li className="item item-3">3</li>
          <li className="item item-4">4</li>
          <li className="item item-5">5</li>
          <li className="item item-6">6</li>
          <li className="item item-7">7</li>
          <li className="item item-8">8</li>
          <li className="item item-9">9</li>
        </ul>
      </>
    )
  }
}

grid.scss

.grid-list{
    
    
  // 2种显示方式,grid 块级, inline-grid 行内
  display: grid;
  // display: inline-grid;

  // 定义 行列数
  // 绝对单位定义行列
  // grid-template-rows: 100px 100px 100px;
  // grid-template-columns: 100px 100px 100px;  // 3行3列,绝对单位

  // 百分比定义行列
  // grid-template-rows: 33.33% 33.33% 33.33%; // 百分比
  // grid-template-columns: 33.33% 33.33% 33.33%;

  // 重复函数 repeat(count, value); 1参重复次数,2参重复的值
  // grid-template-columns: repeat(3, 33.33%);  // 重复函数
  // grid-template-rows: repeat(3, 33.33%);

  // 重复模式 repeat(count, patten);
  // grid-template-columns: repeat(2, 100px 20px 60px); // 重复模式,第1和第4是100px
  
  // auto-fill,自动填充,cell大小固定,容器大小不确定,填满容器
  // grid-template-columns: repeat(auto-fill, 100px); 

  // 比例关系 fr, 即 fraction片段
  // grid-template-columns: 1fr 2fr; // fr

  // fr结合绝对单位,fr分剩余空间
  // grid-template-columns: 150px 1fr 2fr;

  // minmax函数,最小最大范围,列宽最小100px,最大1fr
  // grid-template-columns: minmax(100px, 1fr); // minmax函数

  // auto,由浏览器决定长度
  // grid-template-columns: 100px auto 100px;
  
  // 使用中括号指定网格线名称
  // 3行 x 3列,因此有4根垂直网格线和4根水平网格线, 允许同一根线多个名字
  // grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4]; 
  // grid-template-rows: [r1 row1] 100px [r2] 100px [r3] auto [r4]; 

  // // 两栏式布局
  // grid-template-columns: 70% 30%;

  // 12网格布局
  // grid-template-columns: repeat(12, 1fr);

  // grid-row-gap, grid-column-gap, grid-gap
  // 行间距,列间距,合并简写 grid-gap: <grid-row-gap> <grid-column-gap>
  // grid-row-gap: 10px;
  // grid-column-gap: 10px;

  // grid-gap 合并简写
  // grid-gap: 10px 10px;
  // grid-gap: 10px; // 省略第2个值,则2个值一致
  // // 最新标准,gap三个属性名前缀 grid- 已删除,写成 row-gap,column-gap, gap
  gap: 20px;

  // grid-template-areas 定义区域 area
  // 划分9个单元格,定名为a到i的九个区域,对应九个单元格
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  // grid-template-areas: 'a b c'
  //                      'd e f'
  //                      'g h i';
  
  // // 多个单元格合并成一个区域,9个单元格分成a、b、c三个区域
  // grid-template-areas: 'a a a'
  //                      'b b b'
  //                      'c c c';

  // // 布局实例
  grid-template-areas: "header header header"
                       "main main sidebar"
                       "footer footer footer";
  // // 区域不需要利用,用点 . 表示
  // // 中间一列为点,表示没有用到该单元格,或者单元格不属于任何区域
  // grid-template-areas: 'a . c'
  //                       'd . f'
  //                       'g . i';

  // 区域命名会影响网格线,区域起始网格线 '区域名-start'
  // 终止网格线 '区域名-end','header-start'

  // // 网格放置顺序,默认row,先行后列
  // grid-auto-flow: row; // 填满第一行,再填第二行
  // grid-auto-flow: column; // 先列后行
  // dense密集紧密,尽量填满空格
  grid-auto-flow: row dense; // 行紧密排列
  // grid-auto-flow: column dense; // 列紧密排列

  // // 单元格内容位置,默认为 stretch拉伸占满单元格,这时子元素不需要设置宽高会填满grid
  // // start,center,end需要子元素设置宽高,不然按内容宽高渲染
  // justify-items: start; // 单元格内容水平位置
  // align-items: center; // 单元格内容垂直位置

  // place-items 合并简写
  // place-items: <align-items> <justify-items>;
  place-items: center center;

  // 整个grid内容分布排列位置
  // justify-content, align-content
  // start, end, center, stretch
  // space-around, space-between, space-evenly
  justify-content: center; // 水平分布
  align-content: end; // 垂直分布
  // place-content 合并简写, 先align,后 justify
  // place-content: <align-content> <justify-content>
  place-content: center start;

  // 把item的位置指定在定义的网格外部,浏览器会自动生成多余的网格
  // grid-auto-rows就是用来设置自动生成网格的列高和行宽
  grid-auto-rows: 60px;
  grid-auto-columns: 100px;

  // 合并写法
  // grid-template: <grid-template-rows> / <grid-template-columns> / <grid-template-areas>;
  // grid-template: repeat(3, 100px) / repeat(3, 100px);

  // grid: grid-template-rows、grid-template-columns、grid-template-areas、
  //       grid-auto-rows、grid-auto-columns、grid-auto-flow
  // 这六个属性的合并简写
  // grid: 100px 100px 100px / 100px 100px 100px;
  
  // item项目属性
  li{
    
    
    display: flex;
    width: 50%;
    height: 50%;
    justify-content: center;
    align-items: center;
    list-style: none;
    background: #ff8686;
    color: #fff;
    &.item-1{
    
    
      // 指定item位置,4个边框定位在哪根网格线
      // // 指定网格线序号
      // grid-column-start: 1;
      // grid-column-end: 3;
      // grid-row-start: 1;
      // grid-row-end: 2;
 
      // 指定网格线名字,
      // grid-template-rows, grid-template-columns, grid-template-areas 名字都可以
      // grid-column-start: footer-start;
      // grid-column-end: footer-end;
      // grid-row-start: footer-start;
      // grid-row-end: footer-end;

      // span,跨度,上下、左右跨跃多少个网格
      grid-column-start: span 2;
      grid-column-end: span 2;

      // grid-column, grid-row是合并简写
      // grid-column: <start-line> / <end-line>
      // grid-row: <start-line> / <end-line>
      grid-column: 1 / 3; // 等于指定网格线序号
      grid-row: 1 / 2;

      // grid-column, grid-row属性也可以用 span
      grid-column: 1 / span 2; // 等同于 grid-column: 1 / 3;
      grid-row: 1 / span 2; // 等同于 grid-row: 1 / 3;

      // 斜杆 / 和后面的部分可以省略,默认跨越一个网格
      grid-column: 1;
      grid-row: 1;

      // grid-area 指定item放在哪个区域, area在父容器声明
      grid-area: header;

      // grid-area 也可以是合并简写, 指定item的位置
      // grid-area: <grid-row-start> / <grid-column-start> / <grid-row-end> / <grid-column-end>;
      // grid-area: 1 / 1 / 3 / 3;

      // 和justify-items属性的用法完全相同,但只作用于单个item
      // 水平位置: start,center,end,stretch拉伸
      justify-self: start;
      
      // 垂直位置
      align-self: end;
      
      // place-self 合并简写: 先垂直align-self,后水平justify-self
      // place-self: <align-self> <justify-self>;
      place-self: center start;
      // 如果省略第二个值,则2个值相等
      place-self: center;
    }
    &.item-2{
    
    
      background: #333;
    }
    &.item-3{
    
    
      background: #833;
    }
    &.item-4{
    
    
      background: #9aa;
    }
    &.item-5{
    
    
      background: #aa8;
    }
    &.item-6{
    
    
      background: #804;
    }
    &.item-7{
    
    
      background: #6ee;
    }
    &.item-8{
    
    
      background: #a8a;
      // 指定item的位置在定义的网格外部,浏览器会自动生成多余的网格
      grid-row-start: 4;
      grid-column-start: 2;
    }
    &.item-9{
    
    
      background: #d84e9a;
      grid-row-start: 5;
      grid-column-start: 3;
    }
  }
}

猜你喜欢

转载自blog.csdn.net/zhouweihua138/article/details/129919801