Grid——最强大的布局

兼容性:https://www.caniuse.com/css-grid
Grid 布局是二维布局,可以同时对列和行进行操作
注意:设为 Grid 布局以后,子元素的 floatclearvertical-align 属性将失效。

基本概念

Grid Line 网格线

网格由网格线构成,网格线可以是水平的也可以是垂直的,下面例中的黄线就是一个列网格线。


image.png

Grid Area

网格区域由任意数量的网格单元组成, 下面例中的黄色区域就是一个网格区域。


image.png

grid-container 的属性

画网格

  • grid-template-columns 每列的宽度
  • grid-template-rows 每行的高度

设置列宽和行高

    .grid_container{
      display:grid;
      grid-template-columns:10% auto 10%;
      grid-template-rows:100px 100px auto 20px;
    }

给网格线命名并设置列宽和行高

注意:一个网格线可以有多个名字

    .grid_container{
      display:grid;
      grid-template-columns:[first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];;
      grid-template-rows:[row1-start] 25% [row1-end row2-start] 25% [row2-end];
    }

包含重复的部分,则可以使用 repeat() 简化写法

grid-template-columns: repeat(3, 20px) 30px;
/*上下两种写法等价*/
grid-template-columns: 20px  20px  20px 30px;

自由空间是在排除所有不可伸缩的 grid item 之后计算得到的,fr 单位能使轨道在自由空间中按比例伸展

grid-template-columns: 1fr 50px 1fr 1fr;

分配网格区域

grid-template-areas
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    .grid_container{
      display:grid;
      width:100%;
      height:500px;
      border:1px solid red;
      grid-template-rows:100px auto 100px;
      grid-template-columns: 50px auto 100px;
      grid-template-areas:
        "header header header"
        ". main sidebar"
        "footer footer footer";
    }
    .header{
      grid-area:header;
      background: #ddd;
    }
    .main{
      grid-area:main;
      background: #f60;
    }
    .sidebar{
      grid-area:sidebar;
      background: green;
    }
    .footer{
      grid-area:footer;
      background: yellow;
    }
  </style>
</head>
<body>
  <div class="grid_container">
    <div class="header">header</div>
    <div class="main">
      main 
    </div>
    <div class="sidebar">sidebar</div>
    <div class="footer">footer</div>
  </div>
</body>
</html>
image.png
grid-template 上面三个属性的简写
grid-template:
  "header header header" 50px
  ". main sidebar" auto
  "footer footer footer" 50px
  / 100px auto 100px;

隐式轨道宽度

隐式网格轨道在显式的定位超出指定网格范围的行或列时被创建

.item-a {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}
.item-b {
  grid-column: 5 / 6;
  grid-row: 2 / 3;
}
image.png
grid-auto-columns 隐式列宽
grid-auto-rows 隐式行高
grid-auto-columns: 60px;
image.png

自动布局

没有指明具体位置的 grid item 可以使用此属性自动布局

grid-auto-flow
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .container {
      display: grid;
      grid-template-columns: 60px 60px 60px 60px 60px;
      grid-template-rows: 30px 30px;
      grid-auto-flow: row;
    }
    .item-a {
      grid-column: 1;
      grid-row: 1 / 3;
       background: rgba(128,0,0,0.5);
    }
    .item-e {
      grid-column: 5;
      grid-row: 1 / 3;
      background: rgba(0,128,0,0.5);
    }
    .item-b{
      background: rgba(0,0,128,0.5);
    }
    .item-c{
      background: rgba(128,128,0,0.5);
    }
     .item-d{
      background: rgba(128,128,128,0.5);
    }
  </style>
</head>

<body>
  <section class="container">
    <div class="item-a">item-a</div>
    <div class="item-b">item-b</div>
    <div class="item-c">item-c</div>
    <div class="item-d">item-d</div>
    <div class="item-e">item-e</div>
  </section>
</body>

</html>
image.png

当设置 grid-auto-flow: column

image.png
grid 以上所有属性的简写

语法:grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]];

.container {
  grid: 200px auto / 1fr auto 1fr;
}
/*上下两种写法等价*/
.container {
  grid-template-rows: 200px auto;
  grid-template-columns: 1fr auto 1fr;
  grid-template-areas: none;
}
.container {
  grid: column 1fr / auto;
}
/*上下两种写法等价*/
.container {
  grid-auto-flow: column;
  grid-auto-rows: 1fr;
  grid-auto-columns: auto;
}
.container {
  grid: [row1-start] "header header header" 1fr [row1-end]
        [row2-start] "footer footer footer" 25px [row2-end]
        / auto 50px auto;
}
/*上下两种写法等价*/
.container {
  grid-template-areas: 
    "header header header"
    "footer footer footer";
  grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;    
}

设置间距

grid-column-gap 设置列之间的间距
grid-row-gap 设置行之间的间距
grid-column-gap: 10px;
grid-row-gap: 15px;
grid-gap 上面两个属性的简写
grid-gap: 10px 15px;

行/列对齐方式

justify-items 水平方向对齐方式
align-items 垂直方向对齐方式

网格对齐方式

justify-content 水平方向对齐方式
align-content 水平方向对齐方式

grid-items 的属性

确定 item 位置

grid-column-start 开始的列线
grid-column-end 结束的列线

列序从左往右是正数,从右往左是负数
span 指定要跨越的网格数

grid-column-start: 3; 
grid-column-end: 6; 
grid-column 以上两个属性的简写
grid-column: 3 / span 2;
/*上下两种写法等价*/
grid-column: 3 / 6;
grid-row-start 开始的行线
grid-row-end 结束的行线

行序从上往下是正数,从下往上是负数

grid-row-start: 1;
grid-row-end: 4;
grid-row 以上两个属性的简写
grid-row: 1 / span 3;
/*上下两种写法等价*/
grid-row: 1 / 4;
grid-area

语法(上左下右):grid-area: grid-row-start / grid-column-start / grid-row-end / grid-column-end

grid-area:2 / 3 / -2 /-1

item 自身对齐方式

justify-self 自身水平对齐
align-self 自身垂直对齐
order item展示顺序

默认情况下,所有的网格项的order都是0,但是顺序也可以被任意设置为正数或者负数

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    .container {
      display: grid;
      grid-template-columns: 60px 60px 60px 60px 60px;
      grid-template-rows: 30px 30px;
      grid-auto-flow: row;
    }
    .item-a {
      grid-column: 1;
      grid-row: 1 / 3;
       background: rgba(128,0,0,0.5);
 
    }
    .item-e {
      grid-column: 5;
      grid-row: 1 / 3;
      background: rgba(0,128,0,0.5);
    }
    .item-b{
      background: rgba(0,0,128,0.5);
      order:1;
    }
    .item-c{
      background: rgba(128,128,0,0.5);
    }
     .item-d{
      background: rgba(128,128,128,0.5);
    
    }
  </style>
</head>

<body>
  <section class="container">
    <div class="item-a">item-a</div>
    <div class="item-b">item-b</div>
    <div class="item-c">item-c</div>
    <div class="item-d">item-d</div>
    <div class="item-e">item-e</div>
  </section>
</body>

</html>
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容