table 布局

table 布局用法

  1. display:table:父元素设置该属性;
  2. display:table-row:子元素设置该属性,相当于 tr 元素;
    • tr 设置的高度只起到 min-height 的作用,默认会平分 table 的高度;
    • 设置 widthmargin 都不起作用;
  3. display:table-cell:子元素设置该属性,相当于 td 元素;
    • td 会默认继承 tr 的高度,且平分 table 的宽度;
    • 给任意 td 设置了高度,其他 td 的高度也同样变高,适合多列等高布局;
  4. table-layout:用于显示 单元格 的算法规则;
    • auto:自动表格布局,列的宽度由单元格中最大内容的宽度决定,算法较慢(在确定最终布局之前要访问表格中所有内容);
    • fixed:列宽由表格宽度和列宽度设定;

table 布局的优缺点

  1. 缺点

    • table 比其他 html 标签占更多的字节,造成下载时间延迟,占用服务器更多的流量资源(代码冗余);
    • table 会阻挡浏览其渲染引擎的渲染顺序,会延迟页面的生成速度,让用户等待时间更久;
    • 灵活性差,一旦设计确定,后期很难通过 CSS 让它展现新的面貌;
    • 不利于搜索引擎抓取信息,直接影响到网站的排名;
  2. 优点

    • 兼容性好;
    • 容易上手;

示例代码

<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 布局

特点

  1. 元素 浮动

  2. 脱离文档流,但不脱离文本流;

影响

  1. 对自身的影响: 形成 (BFC)、位置尽量靠上、位置尽量靠左(右),无法满足会靠下;

  2. 对兄弟的影响: 上面贴非 float 元素、旁边贴 float 元素、不影响其它块级元素位置、影响其它块级元素内部文本;

  3. 对父级的影响: 从布局上 消失、高度塌陷(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 布局

行内块级元素的特性

  1. 和块级元素一样,能设置元素的宽高,垂直方向的间距;

  2. 宽度如果不指定,则为内部元素的框定;

  3. 外部排列方式和行内元素一样,是水平排列的;

常见问题

  1. 空白的问题:在设置 inline-block 的元素的父元素设置 font-size: 0

  2. 高度不一样的元素,垂直方向不对齐:在设置 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>
1
2
3
4

Flex 布局

  1. FlexFlexible Box 的缩写,意为 弹性布局 ,用来为盒状模型提供最大的灵活性,是一维布局;

  2. 注意:设为 Flex 布局以后,子元素的 floatclearvertical-align 属性将失效;

基本概念

  1. 图解

  2. 采用 Flex 布局的元素,称为 Flex 容器(flex container),它的所有子元素自动成为容器成员(flex item);

  3. 容器默认存在两根轴:

    • 水平的主轴(main axis)和垂直的交叉轴(cross axis);
    • 主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;
    • 交叉轴的开始位置叫做 cross start,结束位置叫做 cross end;
  4. 项目默认沿主轴排列,单个项目占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size;

容器的属性

  1. flex-direction 属性:决定主轴的方向(即项目的排列方向)

  2. flex-wrap 属性:如果一条轴线排不下,如何换行;

  3. flex-flow 属性:flex-direction 属性和 flex-wrap 属性的简写形式,默认值为 row nowrap;

  4. justify-content 属性:定义了项目在主轴上的对齐方式;

  5. align-items 属性:定义项目在交叉轴上如何对齐;

  6. align-content 属性:定义了多行的对齐方式,如果项目只有一行,该属性不起作用,flex-warp 为 warp 时生效(可以理解成增强了 flex-warp 属性);

项目(容器成员)的属性

  1. order 属性:定义项目的排列顺序,数值越小,排列越靠前,默认为 0;

  2. flex-grow 属性:定义项目的放大比例,默认为 0,即如果存在剩余空间,也不放大;

  3. flex-shrink 属性:定义了项目的缩小比例,默认为 1,即如果空间不足,该项目将缩小;

  4. flex-basis 属性:定义了在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据这个属性,计算主轴是否有多余空间,默认值为auto,即项目的本来大小;

  5. flex 属性:是 flex-grow、flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto,后两个属性可选;

  6. align-self 属性:允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性,默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch;

Grid 布局

  1. Grid 布局即网格布局,是一种新的 CSS 布局模型,比较擅长将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系;

  2. 号称是最强大的的 CSS 布局方案,是目前唯一一种 CSS 二维布局;

基本概念

  1. display 属性:当一个 HTML 元素将 display 属性设置为 gridinline-grid 后,它就变成了一个网格容器,这个元素的所有直系子元素将成为网格元素;

    CSS
    CSS
    .grid-container {
      display: grid;
    }
    
    .grid-container {
      display: inline-grid;
    }
    
  2. 网格轨道grid-template-columnsgrid-template-rows 属性来定义网格中的行和列,容器内部的水平区域称为行,垂直区域称为列;

    CSS
    CSS
    CSS
    .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;
    }
    
  3. fr 单位:网格引入了 fr 单位来创建灵活的网格轨道,一个 fr 单位代表网格容器中可用空间的一等份;

    .grid-container {
      display: grid;
      /* 创建三个相等宽度的轨道,这些轨道会随着可用空间增长和收缩 */
      grid-template-columns: 1fr 1fr 1fr;
    }
    
  4. 网格单元:一个网格单元是在一个网格元素中最小的单位,从概念上来讲其实它和表格的一个单元格很像;

  5. 网格区域:网格元素可以向行或着列的方向扩展一个或多个单元,并且会创建一个矩形的网格区域;

  6. 网格列:网格元素的垂直线方向称为列 (Column)

  7. 网格行:网格元素的水平线方向称为行 (Row)

  8. 网格间距:网格间距 (Column Gap) 指的是两个网格单元之间的网格横向间距或网格纵向间距;

    CSS
    CSS
    CSS
    .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;
    }
    
  9. 网格线:列与列,行与行之间的交接处就是网格线,下面这个三列两行的网格中,就拥有四条纵向的网格线 (灰色圆圈标记),以及三条横向的网格线 (黑色圆圈标记)

    CSS
    CSS
    .item1 {
      /* 该元素 合并了前两列 */
      grid-column-start: 1;
      grid-column-end: 3;
    }
    
    .item1 {
      /* 该元素 合并了前两行 */
      grid-row-start: 1;
      grid-row-end: 3;
    }
    

容器属性

  1. justify-content 属性

    1. 语法:
      justify-content: flex-start|flex-end|center|space-between|space-around|initial|inherit;
      
    2. 属性值:
      描述
      flex-start 默认值,从行首起始位置开始排列
      flex-end 从行尾位置开始排列
      center 居中排列
      space-between 均匀排列每个元素,首个元素放置于起点,末尾元素放置于终点
      space-evenly 均匀排列每个元素,每个元素之间的间隔相等
      space-around 均匀排列每个元素,每个元素周围分配相同的空间
      initial 设置该属性为它的默认值
      inherit 从父元素继承该属性
  2. align-content 属性

    1. 语法:
      align-items: stretch|center|flex-start|flex-end|baseline|initial|inherit;
      
    2. 属性值:
      描述
      stretch - 默认值,元素被拉伸以适应容器
      - 如果指定侧轴大小的属性值为 ‘auto’,则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照
      ‘min/max-width/height’ 属性的限制
      center - 元素位于容器的中心
      - 弹性盒子元素在该行的侧轴 (纵轴) 上居中放置 (如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出
      相同的长度)
      flex-start - 元素位于容器的开头
      - 弹性盒子元素的侧轴 (纵轴) 起始位置的边界紧靠住该行的侧轴起始边界
      flex-end - 元素位于容器的结尾
      - 弹性盒子元素的侧轴 (纵轴) 起始位置的边界紧靠住该行的侧轴结束边界
      baseline - 元素位于容器的基线上
      - 如弹性盒子元素的行内轴与侧轴为同一条,则该值与 ‘flex-start’ 等效,其它情况下,该值将参与基线对齐
      initial 设置该属性为它的默认值
      inherit 从父元素继承该属性
  3. 行间距、列间距

    1. grid-row-gap 属性、grid-column-gap 属性分别设置行间距和列间距;
    2. grid-gap 属性是两者的简写形式;
  4. grid-template-areas 属性grid-area 属性可以对网格元素进行命名,可以通过容器的 grid-template-areas 属性来引用;

    CSS
    CSS
    .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 . . .';
    }
    
  5. grid-auto-flow 属性:指定自动布局算法怎样运作

    描述
    row 默认值,通过填充每一行来放置网格元素,在必要时增加新列
    column 通过填充每一列来放置网格元素,在必要时增加新列
    dense 如果后面出现了稍小的元素,则会试图去填充网格中前面留下的空白,这样做会填上稍大元素留下的空白,但同时
    也可能导致原来出现的次序被打乱
    row dense 按行来填充网格中前面留下的空白
    column dense 按列来填充网格中前面留下的空白
  6. grid-auto-columns、grid-auto-rows 属性:设置网格中行、列的默认大小

项目属性

  1. 跨多个列、行

    CSS
    CSS
    .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;
    }
    
  2. 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;
    }
    
  3. justify-self、align-self 属性:设置单元格内容的水平、垂直位置,与 justify-contentalign-content 类似;

columns 布局

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. table 布局
    1. 1.1. table 布局用法
    2. 1.2. table 布局的优缺点
    3. 1.3. 示例代码
  2. 2. float 布局
    1. 2.1. 特点
    2. 2.2. 影响
    3. 2.3. 示例代码
  3. 3. inline-block 布局
    1. 3.1. 行内块级元素的特性
    2. 3.2. 常见问题
    3. 3.3. 示例代码
  4. 4. Flex 布局
    1. 4.1. 基本概念
    2. 4.2. 容器的属性
    3. 4.3. 项目(容器成员)的属性
  5. 5. Grid 布局
    1. 5.1. 基本概念
    2. 5.2. 容器属性
    3. 5.3. 项目属性
  6. 6. columns 布局