[CSS] 栅格化布局

栅格化布局帮助你更容易构建复杂的网页设计。它会将HTML元素转换为网格的容器(有行有列)。你可以在网格里面添加你想要的子元素。

grid 初始化元素为栅格化

将一个HTML元素转换为网格的容器,只需要对其设置display: grid即可。display: grid告诉我们,可以使用CSS Grid的相关属性了。

<dl class="container">
  <dd class="item1">item1</dd>
  <dd class="item2">item2</dd>
  <dd class="item3">item3</dd>
  <dd class="item4">item4</dd>
  <dd class="item5">item5</dd>
  <dd class="item6">item6</dd>
</dl>
.container{
  display: grid;
}

⚠ 在CSS栅格布局中,父元素就是栅格容器(这里是class="container"的dl元素),其下的子元素为我们称为项目items

grid-template-columns 设置列数

上面我们已设定容器container为珊格化了,那么我们还得为这块圈起来的元素设置模版列数,表明列的区域。

.container{
  min-width: 200px;
  display: grid;
  grid-template-columns: 100px 100px auto;
}

grid-template-columns的属性值100px 100px auto的意思是将区域划分为三列,第一列和第二列的宽度都为100px,第三列的宽度为自适应。

grid-template-rows 设置行数

上面我们设置了列数,那么对应的,就有行数,我们来设置下模版行数。

.container{
  min-height: 200px;
  display: grid;
  grid-template-rows: 60px auto;
}

grid-template-rows的属性值60px auto的意思是将区域分为两行,第一行的高度固定为60px,而第二行的高度自适应。

单位的设置可以有px, auto, %, fr。这里的frfraction的缩写,表示某物的部分。比如下面的例子:

grid-template-rows: auto 10% 2fr 1fr,表示的意思是将栅格化的区域分为4行:第一行是根据内容自适应,第二行为区域的10%,最后剩余的区域分成三部分,2fr表示占其2/3,1fr表示占其1/3。

grid-column-grap 设置列间距

有必要对列与列之间设置间距,你可以理解为margin-leftmargin-right的应用:

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  grid-column-gap: 10px;
}

grid-column-gap表示列之间相隔10px,对左边界区域左间隔不影响,对右边界区域右间隔不影响。

grid-row-gap 设置行间距

像上面设置列边距一样,有必要设置列与列的间距,对应的 - 你可以理解为margin-topmargin-bottom的应用:

.container{
  display: grid;
  grid-template-rows: 60px auto;
  grid-row-gap: 10px;
}

grid-row-gap表示行之间相隔10px,对上边界区域顶部间隔不影响,对下边界区域底部间隔不影响。

grid-gap 简写

margin一样,我们可以对margin-top, margin-right, margin-bottom, margin-left进行简写。grid-gap可以对grid-row-gap, grid-column-gap进行简写。

但是,grid-gap的值又不像margin一样可以写四个,它只有两个:

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  grid-template-rows: 60px auto;
  grid-gap: 10px 20px;
}

grid-gap: 10px 20px表示行间隔为10px,列间隔为20px

到目前为止,我们讲的是栅格布局容器的拆分,下面我们来讲其子元素的布局。

子元素 grid-column

grid-column表示列跨度,比如:

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  .item5{
    grid-column: 1 / 3
  }
}

grid-column上面的列跨度,表示类名为item5元素横跨第一列到第三列。

子元素 grid-row

对应的,grid-row表示行跨度,比如:

.container{
  display: grid;
  grid-template-rows: 50px 50px auto;
  .item3{
    grid-row: 2 / 4
  }
}

grid-row上面的行跨度,表示类名为item3元素横跨第二行到第四行。

子元素 justify-self

justify-self更改元素宽度和排列的位置,有值如下:

  • stretch: 默认值,拉伸内容的宽度为预设的宽度

  • start: 宽度为内容宽度,内容在左侧展示

  • center: 宽度为内容宽度,内容在居中展示

  • end: 宽度为内容宽度,内容在右侧展示

子元素 align-self

align-self更改元素高度和排列的位置,有值如下:

  • stretch: 默认值,拉伸内容的高度为预设的高度

  • start: 宽度为内容高度,内容在上侧展示

  • center: 宽度为内容高度,内容在居中展示

  • end: 宽度为内容高度,内容在下侧展示

justify-items

我们想对所有子元素内容进行水平方向的排列,那么需要在设定的容器中使用justify-items属性,而不是一个个子元素进行设置justify-self属性。justify-items属性值同justify-self

.container{
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-gap: 10px;
  justify-items: center;
}

align-items

同理的,我们想对所有子元素内容进行垂直方向的排列,那么需要在设定的容器中使用align-items属性,而不是一个个子元素进行设置align-self属性。align-items属性值同align-self

.container{
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr;
  grid-gap: 10px;
  align-items: center;
}

grid-template-areas

通过grid-template-areas为每个栅格单元命名。

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  grid-template-rows: 50px 50px auto;
  grid-template-areas: 
    "header header header"
    ". content content"
    "footer footer footer";
}

注意: ⚠ .表示表格中的空单元格

子元素 grid-area关联预设名称

grid-template-areas已经为元素划分好了单元格并命名了,接下来可以通过grid-area在其子元素中关联上。

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  grid-template-rows: 50px 50px auto;
  grid-template-areas: 
    "header header header"
    ". content content"
    "footer footer footer";
  .item6{
    grid-area: footer;
  }
}

当然,我们可以仅仅使用grid-area实现上面需要grid-template-areagrid-area才能实现的效果。如下

.container{
  display: grid;
  grid-template-columns: 100px 100px auto;
  grid-template-rows: 50px 50px auto;
  .item6{
    grid-area: 3 / 1 / 4 / 4;
  }
}

grid-area简写的语法是:

grid-area: horizontal line to start at / vertical line to start at / horizontal line to end at / vertical line to end at;

使用函数repeat简化

使用grid-template-columnsgrid-template-rows定义栅格的行列结构。上面我们是一个个定义的。我们也可以使用repeat()函数简化操作。

比如分为四列,第一列和第二列是100px,第三列为1fr,最后一列是2fr

.container{
  display: grid;
  grid-template-columns: repeat(2, 100px) 1fr 2fr;
}

函数minmax限定最小最大值

在我们布局空间有限的情况下,我们需要对布局的元素设置其最小值和最大值,通过minmax()函数可以轻松做到。

.container{
  display: grid;
  grid-template-columns: repeat(2, 100px) minmax(60px, 1fr) 2fr;
}

上面的属性在实际的开发中已经够用。如果你还想了解其他的属性等,你可以点击下面的参考链接进行学习。grid的兼容性还是杠杆的,除了Opera MiniBaidu Browser不支持外,其他的都支持~

更多的内容可以前往JIMMY BLOG

参考

http://cssgridgarden.com/

https://www.freecodecamp.org/learn/responsive-web-design/css-grid/

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