CSS几种常用的布局模式

327 阅读7分钟

一、flex布局

1.1 flex布局原理

Flexbox(Flexible Box Layout Module)布局,又称弹性布局,是一种旨在解决传统CSS布局模式(如浮动、定位等)在复杂布局场景下局限性的现代化布局模式。Flex布局由W3C提出,目的是为了更好地适应不同屏幕尺寸和设备类型,实现更加简单、强大、响应式的布局设计。

1.2 flex布局父盒子常见属性

flex-direction: 设置主轴方向

justify-content: 设置主轴上的子元素排列方式

flex-wrap:设置子元素是否换行

align-content:设置侧轴上的子元素排列方式(多行)

align-items:设置侧轴上的子元素排列方式(单行)

flex-flow:复合属性,相当于同时设置flex-direction和 flex-wrap

1.2.1 flex-direction设置主轴方向

flex-direction设置主轴方向,主轴默认为 x轴方向

  • row:从左到右
  • row-reverse:从右到左
  • column:从上到下
  • column-reverse:从下到上

1.2.2 justify-content设置主轴上子元素排列方式

justify-content设置子元素排列方式,默认值为flex-start

  • flex-start:从头开始,如果主轴是x轴,从左到右
  • flex-end:从尾部开始排列,
  • center:主轴居中(如果主轴是x轴,水平居中)
  • space-around:第一个Flex项目将紧贴容器的起始边(左或上,取决于主轴的方向),最后一个Flex项目将紧贴容器的结束边(右或下)。相邻的Flex项目之间的空白间距将会被拉伸,从而保证它们之间的距离是相同的
  • space-between:每个项目的左右两边都有一定的间距,并且这个间距是相对于容器的整个宽度来平均分配的

1.2.3 flex-warp设置子元素是否换行

flex-wrap

  • nowrap:不换行,默认值
  • wrap:换行

1.2.4 align-items设置侧轴上的子元素排列方式(单行)

align-items,默认值 flex-start

  • flex-start:从上到下
  • flex-end:从下到上
  • center:侧轴居中(垂直居中)
  • stretch:拉伸

1.2.5 align-content设置侧轴上的子元素排列方式(多行)

align-content,默认值 flex-start

  • flex-start:在侧轴头部开始排列
  • flex-end:侧轴尾部开始排列
  • center:在侧轴中间显示
  • space-around:第一个Flex项目将紧贴容器的起始边(左或上,取决于主轴的方向),最后一个Flex项目将紧贴容器的结束边(右或下)。相邻的Flex项目之间的空白间距将会被拉伸,从而保证它们之间的距离是相同的
  • space-between:每个项目的左右两边都有一定的间距,并且这个间距是相对于容器的整个宽度来平均分配的
  • stretch:设置子项元素高度平分父元素高度

1.2.5 flex-flow复合属性

flex-flow:复合属性,

  • [flex-direction]:row | column
  • [flex-wrap]:wrap | nowrap
div {
	flex-flow: row wrap;
}

1.3 flex布局子盒子常见属性

1.3.1 flex属性

flex属性包含flex-growflex-shrinkflex-basis三个子属性

  • flex-grow:元素会根据需要平均分配容器的额外空间,如果有多个具有相同 flex-grow 值的元素,则它们会按比例分配空间
  • flex-shrink:元素在容器空间不足时,将会按照比例收缩自己的尺寸。
  • flex-basis:元素的初始主轴大小基于其内容计算,但在计算前会被视为0,这意味着元素首先不会占据任何固有的主轴空间,而是依赖于flex-growflex-shrink来确定其大小。

简写方式:

flex: 1 1 0% 可以简写为 flex: 1;

flex: 2 1 0% 可以简写为 flex: 2;

示例

  • 如果一行有三个盒子,左侧盒子和右侧盒子宽高都固定了,中间的盒子可以采用flex属性来分配剩余的空间
  • 剩余空间指的是父盒子宽度-子盒子宽度,如果子盒子不设置宽度,剩余空间为父盒子的宽度
div {
    display: flex;
    width: 800px;
    height: 300px;
    background-color: pink;
    justify-content: space-between;
    flex-wrap: wrap;
    align-items: center
}

span:nth-child(1) {
    height: 100px;
    margin: 5px;
    width: 200px;
    background-color: skyblue;
}

span:nth-child(2) {
    height: 100px;
    flex: 1;
    margin: 5px;
    background-color: skyblue;
}

span:nth-child(3) {
    height: 100px;
    width: 200px;
    margin: 5px;
    background-color: skyblue;
}

1.3.2 align-self控制子项自己在侧轴上的排列方式

align-self:设置子项自己在侧轴上的排列方式,用来覆盖align-items属性,默认值为auto,父容器没有align-items属性,元素遵循stretch行为

  • auto(默认值): 表示元素继承其父容器的 align-items 属性值。如果父容器没有显式声明 align-items,则元素将遵循 stretch 行为。
  • stretch: 如果元素未设置固定高度或宽度,则元素的尺寸会沿着交叉轴方向拉伸,使其占据整个容器的剩余空间,同时遵守min/max尺寸限制。
  • flex-start: 元素的交叉轴起点与容器的交叉轴起点对齐,也就是顶部或左侧(取决于交叉轴的方向)。
  • flex-end: 元素的交叉轴终点与容器的交叉轴终点对齐,也就是底部或右侧(取决于交叉轴的方向)。
  • center: 元素在交叉轴方向上居中对齐。
  • baseline: 元素根据其基线对齐。对于文本元素,基线通常是字母x的高度线。并非所有元素都有明确的基线,对于那些没有明显基线的元素,这个值可能表现得像 flex-startcenter

二、grid布局模型

2.1 常用属性

2.1.1 grid-template-columns

.grid{
	display: grid;
    // grid-template-columns 后面几个元素 代表分成几列
    // fr 为grid专属单位, 是grid 块剩余空间
	grid-template-columns: 1fr 1fr 1fr; 
}

2.1.2 gap列间距

.grid{
	display: grid;
	grid-template-columns: 1fr 1fr 1fr; 
    
    column-gap: 24px;// 列间距
    row-gap: 24px;   // 行间距
    // gap: 24px;       // 统一设置间距
}

2.1.3 grid-templae-areas 排列布局

image-20240228172949929.png

index.scss

// 分成三行三列,按比例进行划分,
// 通过 grid-area 属性 使用划分出的区域
grid-template-areas: 
	"header header header"
	"sidebar content content"
	"footer footer footer"

header{
    grid-area: header;
}

aside{
    grid-area: sidebar;
}

main{
    grid-area: content;
}

footer{
    grid-area: footer;
}

index.html

<div class="layout">
    <header>头部</header>
    <aside>侧边栏</aside>
    <main>内容</main>
    <footer>底部</footer>
</div>

2.1.4 单个元素对其方式

图片转存失败,建议将图片保存下来直接上传转存失败,建议直接上传图片文件

.gird{
	// 单个元素按块轴居中对其
	align-items: center;
    
    // 单个元素按行轴居中对其
	justify-items: center;
}

2.1.5 整体对其方式

grid-template-columns设置为 1fr 1fr 1fr ... 后无效

图片转存失败,建议将图片保存下来直接上传转存失败,建议直接上传图片文件图片转存失败,建议将图片保存下来直接上传转存失败,建议直接上传图片文件

.gird{
	// 整体按块轴居中对其
	align-content: center;
    // 整体按行轴居中对其
	justify-content: center;
	justify-content: space-between;
}

三、table-cell布局模型

让标签元素以表格单元格的形式呈现,使元素类似于td标签。IE8+及现代版本的浏览器都支持此属性,IE6/7不支持(可用其他方法实现类似效果)。同样,display:table-cell属性也会被float,position:absolute等属性破坏效果,所以尽量避免同时使用。

3.1 功能

设置了display:table-cell的元素有一下特点:

  • 对宽度高度敏感
  • 对margin值无反应
  • 响应padding属性
  • 内容溢出时会自动撑开父元素

使用display:table-cell可以实现一下几种效果:

  1. 大小不固定元素的垂直居中
  2. 两列自适应布局
  3. 左右等高

3.2 示例

image-20221108183133926.png

<style>
    .content {
        display: table-cell;
        padding: 10px;
        border: 2px solid #999;
        height: 250px;
        vertical-align: middle;
    }

    .content div {
        display: inline-block;
        vertical-align: middle;
    }

    .content p {
        display: inline-block;
        vertical-align: middle;
    }
</style>
<div class="content">
    <div style="height: 100px;width: 80px;background: #cccccc;"></div>
    <div style="height: 120px;width: 80px;background: #639146;"></div>
    <div style="height: 140px;width: 80px;background: #2B82EE;"></div>
    <div style="height: 160px;width: 80px;background: #F57900;"></div>
    <div style="height: 180px;width: 80px;background: #BC1D49;"></div>
    <p style="width: 100px">顶顶顶顶顶</p>
    <p style="width: 100px">顶顶顶顶顶顶顶顶顶</p>
</div>