table 布局
table 布局用法
display:table
:父元素设置该属性;display:table-row
:子元素设置该属性,相当于 tr 元素;
- tr 设置的高度只起到 min-height 的作用,默认会平分 table 的高度;
- 设置 width、margin 都不起作用;
display:table-cell
:子元素设置该属性,相当于 td 元素;
- td 会默认继承 tr 的高度,且平分 table 的宽度;
- 给任意 td 设置了高度,其他 td 的高度也同样变高,适合多列等高布局;
table-layout
:用于显示 单元格、行、列 的算法规则;
- auto:自动表格布局,列的宽度由单元格中最大内容的宽度决定,算法较慢(在确定最终布局之前要访问表格中所有内容);
- fixed:列宽由表格宽度和列宽度设定;
table 布局的优缺点
缺点
- table 比其他 html 标签占更多的字节,造成下载时间延迟,占用服务器更多的流量资源(代码冗余);
- table 会阻挡浏览其渲染引擎的渲染顺序,会延迟页面的生成速度,让用户等待时间更久;
- 灵活性差,一旦设计确定,后期很难通过 CSS 让它展现新的面貌;
- 不利于搜索引擎抓取信息,直接影响到网站的排名;
优点
- 兼容性好;
- 容易上手;
示例代码
<style>
#tparent {
display: table;
width : 100%
}
#tleft {
width : 100px;
height : 200px; /* 未生效 */
background-color: greenyellow;
display : table-cell;
}
#tright {
height : 300px; /* 生效 */
background-color: blue;
display : table-cell
}
</style>
<div id="tparent">
<div id="tleft"></div>
<div id="tright"></div>
</div>
float 布局
特点
元素 浮动;
脱离文档流,但不脱离文本流;
影响
对自身的影响: 形成 块(BFC)、位置尽量靠上、位置尽量靠左(右),无法满足会靠下;
对兄弟的影响: 上面贴非 float 元素、旁边贴 float 元素、不影响其它块级元素位置、影响其它块级元素内部文本;
对父级的影响: 从布局上 消失、高度塌陷(overflow:hidden | clearfix)
示例代码
<style>
.float-box{
width: 100%;
height: 300px;
background: red;
}
.float-left{
height: 200px;
width: 50px;
float: left;
background: yellow;
}
.float-left2{
height: 200px;
width: 50px;
float: left;
background: grey;
}
.float-right{
height: 200px;
width: 50px;
float: right
background: pink;
}
</style>
<div class="float-box">
<div class="float-left"></div>
<div class="float-left2"></div>
<div class="float-right"></div>
</div>
inline-block 布局
行内块级元素的特性
和块级元素一样,能设置元素的宽高,垂直方向的间距;
宽度如果不指定,则为内部元素的框定;
外部排列方式和行内元素一样,是水平排列的;
常见问题
空白的问题:在设置 inline-block 的元素的父元素设置 font-size: 0;
高度不一样的元素,垂直方向不对齐:在设置 inline-block 的元素上设置 vertical-align: top;
示例代码
<style>
.ly {
width: 100%;
font-size: 0 !important;
text-align: right;
}
.ly__item {
display: inline-block;
vertical-align: top;
font-size: medium;
background: yellow;
width: 100px;
text-align: center;
}
</style>
<div class="ly">
<div class="ly__item">1</div>
<div class="ly__item">2</div>
<div class="ly__item">3</div>
<div class="ly__item">4</div>
</div>
Flex 布局
Flex 是 Flexible Box 的缩写,意为 弹性布局 ,用来为盒状模型提供最大的灵活性,是一维布局;
注意:设为 Flex 布局以后,子元素的 float、clear 和 vertical-align 属性将失效;
基本概念
-
图解
-
采用 Flex 布局的元素,称为 Flex 容器(flex container),它的所有子元素自动成为容器成员(flex item);
-
容器默认存在两根轴:
- 水平的主轴(main axis)和垂直的交叉轴(cross axis);
- 主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;
- 交叉轴的开始位置叫做 cross start,结束位置叫做 cross end;
-
项目默认沿主轴排列,单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size;
容器的属性
-
flex-direction 属性:决定主轴的方向(即项目的排列方向)
-
flex-wrap 属性:如果一条轴线排不下,如何换行;
-
flex-flow 属性:flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap;
-
justify-content 属性:定义了项目在主轴上的对齐方式;
-
align-items 属性:定义项目在交叉轴上如何对齐;
-
align-content 属性:定义了多行的对齐方式,如果项目只有一行,该属性不起作用,flex-warp 为 warp 时生效(可以理解成增强了 flex-warp 属性);
项目(容器成员)的属性
-
order 属性:定义项目的排列顺序,数值越小,排列越靠前,默认为 0;
-
flex-grow 属性:定义项目的放大比例,默认为 0,即如果存在剩余空间,也不放大;
-
flex-shrink 属性:定义了项目的缩小比例,默认为 1,即如果空间不足,该项目将缩小;
-
flex-basis 属性:定义了在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据这个属性,计算主轴是否有多余空间,默认值为auto,即项目的本来大小;
-
flex 属性:是 flex-grow、flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto,后两个属性可选;
-
align-self 属性:允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性,默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch;
Grid 布局
Grid 布局即网格布局,是一种新的 CSS 布局模型,比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系;
号称是最强大的的 CSS 布局方案,是目前唯一一种 CSS 二维布局;
基本概念
-
display 属性
:当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将成为网格元素;CSSCSS.grid-container { display: grid; }
.grid-container { display: inline-grid; }
-
网格轨道
:grid-template-columns 和 grid-template-rows 属性来定义网格中的行和列,容器内部的水平区域称为行,垂直区域称为列;
CSSCSSCSS.grid-container { display: grid; /* 在网格容器中创建三个列 */ grid-template-columns: auto auto auto; }
.grid-container { display: grid; /* 网格容器中设置行的高度 */ grid-template-rows: 100px 300px; }
.grid-container { display: grid; /* 等价 grid-template-rows: 100px 300px; grid-template-columns: auto auto auto; */ grid-template: 100px 300px / auto auto auto; }
-
fr 单位
:网格引入了 fr 单位来创建灵活的网格轨道,一个 fr 单位代表网格容器中可用空间的一等份;.grid-container { display: grid; /* 创建三个相等宽度的轨道,这些轨道会随着可用空间增长和收缩 */ grid-template-columns: 1fr 1fr 1fr; }
-
网格单元
:一个网格单元是在一个网格元素中最小的单位,从概念上来讲其实它和表格的一个单元格很像;
-
网格区域
:网格元素可以向行或着列的方向扩展一个或多个单元,并且会创建一个矩形的网格区域;
-
网格列
:网格元素的垂直线方向称为列 (Column);
-
网格行
:网格元素的水平线方向称为行 (Row);
-
网格间距
:网格间距 (Column Gap) 指的是两个网格单元之间的网格横向间距或网格纵向间距;
CSSCSSCSS.grid-container { display: grid; /* 设置列之间的网格间距 */ grid-column-gap: 50px; }
.grid-container { display: grid; /* 设置行之间的网格间距 */ grid-row-gap: 100px; }
.grid-container { display: grid; /* grid-row-gap 和 the grid-column-gap 属性的简写 */ grid-gap: 50px 100px; }
-
网格线
:列与列,行与行之间的交接处就是网格线,下面这个三列两行的网格中,就拥有四条纵向的网格线 (灰色圆圈标记),以及三条横向的网格线 (黑色圆圈标记);
CSSCSS.item1 { /* 该元素 合并了前两列 */ grid-column-start: 1; grid-column-end: 3; }
.item1 { /* 该元素 合并了前两行 */ grid-row-start: 1; grid-row-end: 3; }
容器属性
-
justify-content 属性
:- 语法:
justify-content: flex-start|flex-end|center|space-between|space-around|initial|inherit;
- 属性值:
值 描述 flex-start 默认值,从行首起始位置开始排列 flex-end 从行尾位置开始排列 center 居中排列 space-between 均匀排列每个元素,首个元素放置于起点,末尾元素放置于终点 space-evenly 均匀排列每个元素,每个元素之间的间隔相等 space-around 均匀排列每个元素,每个元素周围分配相同的空间 initial 设置该属性为它的默认值 inherit 从父元素继承该属性
- 语法:
-
align-content 属性
- 语法:
align-items: stretch|center|flex-start|flex-end|baseline|initial|inherit;
- 属性值:
值 描述 stretch - 默认值,元素被拉伸以适应容器
- 如果指定侧轴大小的属性值为 ‘auto’,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照
‘min/max-width/height’ 属性的限制center - 元素位于容器的中心
- 弹性盒子元素在该行的侧轴 (纵轴) 上居中放置 (如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出
相同的长度)flex-start - 元素位于容器的开头
- 弹性盒子元素的侧轴 (纵轴) 起始位置的边界紧靠住该行的侧轴起始边界flex-end - 元素位于容器的结尾
- 弹性盒子元素的侧轴 (纵轴) 起始位置的边界紧靠住该行的侧轴结束边界baseline - 元素位于容器的基线上
- 如弹性盒子元素的行内轴与侧轴为同一条,则该值与 ‘flex-start’ 等效,其它情况下,该值将参与基线对齐initial 设置该属性为它的默认值 inherit 从父元素继承该属性
- 语法:
-
行间距、列间距
- grid-row-gap 属性、grid-column-gap 属性分别设置行间距和列间距;
- grid-gap 属性是两者的简写形式;
-
grid-template-areas 属性
:grid-area 属性可以对网格元素进行命名,可以通过容器的 grid-template-areas 属性来引用;CSSCSS.item1 { /* 网格元素命名 */ grid-area: myArea; } .grid-container { /* item1 命名为 "myArea", 并跨越 2 列 */ grid-template-areas: 'myArea myArea . . .'; }
.item1 { grid-area: myArea; } .grid-container { /* item1 跨两行两列,.代表没有名字的项目 */ grid-template-areas: 'myArea myArea . . .' 'myArea myArea . . .'; }
-
grid-auto-flow 属性
:指定自动布局算法怎样运作值 描述 row 默认值,通过填充每一行来放置网格元素,在必要时增加新列 column 通过填充每一列来放置网格元素,在必要时增加新列 dense 如果后面出现了稍小的元素,则会试图去填充网格中前面留下的空白,这样做会填上稍大元素留下的空白,但同时
也可能导致原来出现的次序被打乱row dense 按行来填充网格中前面留下的空白 column dense 按列来填充网格中前面留下的空白 -
grid-auto-columns、grid-auto-rows 属性
:设置网格中行、列的默认大小
项目属性
-
跨多个列、行
CSSCSS.item1 { /* 第 1 列开始,在第 5 列前 */ grid-column: 1 / 5; /* 第 1 行开始,在第 4 行前 */ grid-row: 1 / 4; /* 等价 */ grid-column-start: 1; grid-column-end: 5; grid-row-start: 1; grid-row-end: 4; }
.item1 { /* 跨越 2 列 */ grid-column: 1 / span 2; /* 跨越 2 行 */ grid-row: 1 / span 2; /* 等价 */ grid-column-start: 1; grid-column-end: 3; grid-row-start: 1; grid-row-end: 3; }
-
grid-area 属性
:grid-row-start, grid-column-start, grid-row-end 以及 grid-column-end 属性的简写.item8 { grid-area: 1 / 2 / 5 / 6; /* 等价 */ grid-row: 1 / 5; grid-column: 2 / 6; /* 等价 */ grid-area: 1 / 2 / span 4 / span 4; }
-
justify-self、align-self 属性
:设置单元格内容的水平、垂直位置,与 justify-content、align-content 类似;
columns 布局
CSS 高级✍️ 精通 CSS 选择符
上一篇