2020-12-04 CSS 布局:float、flex 和 grid

1. Intro

(1) 两种分类

  • 固定宽度,一般为960/1000/1024 px
  • 不固定宽度,靠文档流原理布局 -> 用于手机
  • 响应式:PC上固定,手机上不固定

(2) 布局思路

  • 从大到小
  • 从小到大


    用CSS布局.png

(3) 前端底线

必须要先有设计稿才能写代码,手机版给手机版设计图,PC版给PC版设计图

(4) 常用草图工具


2. float布局 - 专为IE布局

(1) 步骤

  • 子元素上加float: left/rightwidth
    ps. 使用float后子元素将脱离文档流,所以父元素不会包裹他们 -> 设定父元素CSS
  • 父元素上加.clearfix
    父元素加class=clearfix可以包裹所有float子元素,CSS设定为:
.clearfix::after {
  content:'';
  display: block;
  clear: both;
}

(2) 注意

  • 最后一个float元素可以不写width自适应宽度
  • 使用float布局后不会再响应式布局,flex是专为IE做的布局
  • IE6、7存在bug,margin会变两倍:可以加上margin数值减半;或加上_margin;或改成display: inline-block;
  • float子元素上下margin不会合并

(3) 实践运用

  • 外边框outline: 1px solid green不占像素,可替代border使用
  • 设定了width的块级元素左右margin auto可以使其居中,如:
.content {
  width: 800px;
  margin-left: auto;
  margin-right: auto;
}
  • 导航栏CSS示例
*{margin: 0; padding: 0; border-sizing: border-box;} /*css reset*/
ul, ol {
  lift-style: none; /*去掉列表样式*/
}
img {max-width: 100%;}
.clearfix::after {
  content: '';
  display: block;
  clear: both;
}
.logo {
  background: grey;
  display: inline-block; /*使div自动收窄*/
  margin-top: 8px;
}
.logo > img {
  width: 100px;
  vertical-align: middle; /*使图片溢出div部分消失*/
}
ul > li {
  float: left;
  padding: 4px 0.5em;
  line-height: 32px; 
}
ul {
  display: inline-block; /*自动收窄div*/
}
header {
  background: grey;
  color: white;
}
  • 平均布局
    公式:N x width + (N-1) x margin = total length
    但因为放不下最后一个元素的margin,最后一个元素会被挤到下一行
    -> 解决办法: 为所有子元素增加一个新的clearfix父元素,里面加上负margin margin-right: -margin;,这样会为新的父元素向右增加容纳的空间


3. flex布局

(1) 容器 container 父元素

  • 使container变成flex: display: flex;
  • 控制item的流动方向(主轴) - 弹性流
    默认:从左到右一字排开 flex-direction: row
    从右往左排:flex-direction: row-reverse
    从上到下排列:flex-direction: column
    从下到上排列:flex-direction: column-reverse
  • 控制item换行
    注意:弹性盒不会折断,有多少空间就挤多少空间,会把其中的item宽度设置成width/N
    默认不折行 flex-wrap: nowrap
    折行:flex-wrap: wrap
    反向折行: flex-wrap: wrap-reverse
  • 控制item主轴对齐方式
    默认向开始位置挤:justify-content: flex-start;
    向结尾位置挤:justify-content: flex-end;
    居中:justify-content: center;
    把空间放在间隙中(分散对齐):justify-content: space-between; (在两个item时等价于 第二个item使用margin: auto;
    把空间放在周围:justify-content: space-around;
    空隙大小一致:justify-content: space-evenly;
主轴对齐.png
  • 控制item次轴对齐方式
    item设定了高度:align-items: flex-start | center | flex-end | baseline,未设置高度可用 stretch (默认)
次轴对齐.png
  • 控制多行item对齐 - align-content
多行对齐.png
  • flex-flow: row wrap <=> flex-direction: row; flex-wrap: wrap;

(2) item 子元素

  • 选择器:
    .item:first-child 第一个子元素
    .item:nth-child(n) 第n个子元素
    .item:last-child 最后一个子元素
  • order 排序
    默认order都是0,如果改变了order会将子元素按order值从小到大排列,如order: 100;会在order: 1;后面
  • flex-grow 分配多余空间
    默认为0,不分配多余空间
    如下:如果有多余的空间,将其分成4分其中两份给2号,1份给1号,1份给3号
.item:first-child {
  flex-grow: 1;
}
.item:nth-child(2) {
  flex-grow: 2
}
.item:last-child {
  flex-grow: 1
}

常用导航栏设置flex-grow: 1,多余空间都给导航栏

  • flex-shrink 控制空间不够时item的缩减比例,越大缩减越多
    默认为1:所有item缩减相同幅度
    设为0:该item不能缩减,由其他item贡献缩减
  • flex-basis 控制基准宽度,默认为auto
  • flex缩写:grow shrink basis
    flex: 1 0 100px; <=> flex-grow: 1; flex-shrink: 0; flex-basis: 100px
  • align-self 改变个别item的对齐方式
align-self.png

(3) 实践

  • 平均布局时也需要负margin
  • 手机一般不把宽度高度写死,最好用min-width/max-width或用百分数

(4) flex 布局小游戏


4. Grid 布局

(1) 基本概念

  • 适应新世代浏览器,布局类似表格,常用于不规则布局
  • 一维布局用flex,二维布局用grid

(2) Container & Item

  • 成为grid container:display: grid | inline-grid;
  • 设置行和列宽度
    设置各行列宽度,用空格分隔,如:
.container {
  grid-template-columns: 40px 50px auto 50px 40px; /*行*/
  grid-template-rows: 25% 100px auto; /*列*/
}

重复多次可以用 repeat(N, value), 如grid-template-columns: 40 repeat(3, 50);

grid-template是grid-template-rows和grid-template-columns的缩写形式
比如说,grid-template: 50% 50% / 200px;将创建一个具有两行的网格,每一行占据50%,以及一个200像素宽的列。

  • 给行列取名
.container {
  grid-template-columns: [col1] 40px [col2] 50px; /*行*/
  grid-template-rows: [row1] 25% [row2] auto; /*列*/
}
Grid行列分布.png
  • 设置item占位

a. 控制item占行占列,row/column 从哪行/哪列到哪行/哪列
正数从左到右从上到下,负数则从右到左从下到上

 .a {
  grid-row-start: 0;
  grid-row-end:3;
  grid-column-start: 0;
  grid-column-end: 3;
}

b. 简写为grid-column: n1 / n2;grid-row: n1 / n2;
跨越n1列/行至n2列/行

c. 简写为grid-area
grid-area属性接受4个由'/'分开的值:grid-row-start, grid-column-start, grid-row-end, 最后是grid-column-end
如:grid-area: 1 / 1 / 3 / 6;

grid-area demo.png

d. span 关键字用于跨越多行/列

span demo1.png

span demo2.png

  • free space - fr 份 (行列按比例分隔)
.container {
  grid-template-columns: 1fr 2fr 1fr; /*行*/
  grid-template-rows: 1fr 1fr; /*列*/
}
  • grid-gap 设置每个item的上下左右间隔
  • item的order属性与flex item的order用法一致
  • grd分区:grid-template-areas
    写成矩阵的形式,用双引号表行,空格分隔表列,不同class自动认领所占区域
    -> 小技巧1 表所有item:.container > * {}
    -> 小技巧2 占满整个屏幕:min-height: 100vh;
.container {
  min-height: 100vh;
  display: grid;
  grid-template-rows: 60px auto 60px;
  grid-template-areas:
  "header header header header"
  "aside main . ad" /*"."点表示空置*/
  "footer footer footer footer";
}
.container > header{
  grid-area: header; /*会自动占满"header"区域*/
}
......
grid分区demo.png

(3) grid布局小游戏

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

推荐阅读更多精彩内容