前端学习笔记:现代网页布局

4638 字
24 分钟

CSS 布局是网页技术的核心,用于控制元素在页面中的排列方式。以下是一些常用的布局方式:

流式布局 (Flow Layout)#

流失布局是一种简单的布局方式,元素按照文档流的顺序依次排列。每个元素都占用一行,宽度自动调整以适应容器的宽度。 在不对页面进行设置时,流式布局是默认的布局方式,也成为标准流。

标准流的所有内容都有一个 display 属性。

属性值是否占用一行能否设置宽度和高度默认宽度
display: block不能100%
display: inline不能内容宽度
display: inline-block内容宽度

表单元素默认是 inline-block 元素,因为表单元素需要与文本内容进行对齐,而 inline-block 元素可以设置宽度和高度。 行内块元素中间会有空格,这是因为行内元素之间默认有空格。可以通过设置父元素 font-size0 来解决这个问题。

浮动布局 (Float Layout)#

浮动布局最早是用于实现“文字环绕图片”的效果。浮动元素会脱离标准流,向左或向右浮动,直到遇到其他浮动元素或容器边缘。 浮动的方向由 float 属性指定,其属性值有向左浮动 left ,向右浮动 right 和不浮动 none

浮动布局的元素会脱离标准流,因此需要注意以下问题:

  1. 浮动元素会脱离标准流,导致父元素高度塌陷。
  2. 浮动元素之间默认没有间距,需要通过设置 margin 或 padding 来解决。
  3. 浮动元素会影响标准流中的元素布局,需要注意清除浮动。

清除浮动就是让浮动尽量控制在父元素内部,不影响标准流中的元素布局。
清除浮动的主要方法:

额外标签法:在浮动元素的末尾添加一个空标签,设置其 clear: both 属性。 单伪元素法:使用伪元素 ::after 清除浮动,设置其 content: ''display: block 属性。 例如:

.clearfix::after {
content: '';
display: block;
clear: both;
}

双伪元素法:使用伪元素 ::before::after 清除浮动,设置其 content: ''display: block 属性。 例如:

.clearfix::before,
.clearfix::after {
content: '';
display: block;
}
.clearfix::after {
clear: both;
}

overflow 属性法:设置父元素 overflow: hiddenoverflow: auto ,触发 BFC (块级格式化上下文),使父元素包含浮动元素。 例如:

.clearfix {
overflow: hidden;
}

弹性盒子 (Flex Box)#

弹性盒子的核心是父元素控制子元素的布局,主轴控制水平方向,侧轴控制垂直方向,父元素称为弹性容器,子元素称为弹性项目。

容器属性

属性说明
display: flex将元素设置为弹性容器
flex-direction定义主轴方向,可选值有 row(默认值),row-reversecolumncolumn-reverse
flex-wrap定义是否换行,可选值有 nowrap(默认值),wrapwrap-reverse
justify-content定义主轴上的对齐方式,可选值有 flex-start(默认值),flex-endcenterspace-betweenspace-around
align-items定义侧轴上的对齐方式,可选值有 flex-startflex-endcenterbaselinestretch(默认值)
align-content定义多根轴线的对齐方式,可选值有 flex-startflex-endcenterspace-betweenspace-aroundstretch(默认值)

主轴对齐方式#

属性值说明代码示例
flex-start项目向主轴起点对齐justify-content: flex-start;
flex-end项目向主轴终点对齐justify-content: flex-end;
center项目向主轴中心对齐justify-content: center;
space-between项目向主轴两端对齐,项目之间间距相等justify-content: space-between;
space-around项目向主轴两端对齐,项目之间间距相等,项目与容器边缘间距为一半justify-content: space-around;
space-evenly项目向主轴两端对齐,项目之间间距相等,项目与容器边缘间距也相等justify-content: space-evenly;

如下图所示: 主轴对齐方式

侧轴对齐方式#

属性值说明代码示例
flex-start项目向侧轴起点对齐align-items: flex-start;
flex-end项目向侧轴终点对齐align-items: flex-end;
center项目向侧轴中心对齐align-items: center;
baseline项目向侧轴基线对齐align-items: baseline;
stretch项目拉伸到侧轴高度(默认值)align-items: stretch;

如下图所示: 侧轴对齐方式

主轴方向#

属性值说明
row主轴为水平方向,项目向主轴起点对齐
row-reverse主轴为水平方向,项目向主轴终点对齐
column主轴为垂直方向,项目向侧轴起点对齐
column-reverse主轴为垂直方向,项目向侧轴终点对齐

侧轴方向#

align-content 属性定义多根轴线的对齐方式,仅在项目换行时生效。

属性值说明
flex-start上对齐
flex-end下对齐
center居中对齐
space-between两端对齐
space-around项目之间间距相等,项目与容器边缘间距为一半
space-evenly项目之间间距相等,项目与容器边缘间距也相等

主轴换行方式#

属性值说明
nowrap不换行(默认值),全部项目在同一行,超出部分可能被压缩
wrap换行,第一行在上方,后续行在下方
wrap-reverse换行,第一行在下方,后续行在上方

项目间隙#

属性说明示例
gap定义项目之间的间隙,默认值为 0gap: 10px;表示行和列的间隙都为 10px, gap: 10px 20px;表示行间隙为 10px,列间隙为 20px
row-gap定义项目之间的行间隙,默认值为 0row-gap: 10px;
column-gap定义项目之间的列间隙,默认值为 0column-gap: 10px;

垂直对齐#

垂直对齐vertical-align默认为基线对齐,对图片来说基线对齐会导致图片底部与文字基线对齐,导致图片底部有一定的空白。 常用的垂直对齐方式有 center, top, bottom, middle

项目属性#

属性说明示例
flex-grow定义项目的放大比例,默认值为 0flex-grow: 1;
flex-shrink定义项目的缩小比例,默认值为 1flex-shrink: 0;
flex-basis定义项目的初始宽度,默认值为 autoflex-basis: 200px;
flexflex-growflex-shrinkflex-basis 的简写属性,默认值为 0 1 autoflex: 1 0 200px;
order定义项目的排列顺序,默认值为 0order: 1;
align-self定义项目在单个侧轴上的对齐方式,默认值为 autoalign-self: center;

在弹性盒子布局中,如果子元素有大小,则按照其大小进行布局,否则拉伸到父元素的宽度。如果子元素宽度超过父元素宽度, 则会根据 flex-shrink 属性进行缩小。

定位布局 (Position Layout)#

定位布局是指通过设置元素的 position 属性来实现布局的方式。常见的使用场景包括:

  • 固定导航栏:将导航栏固定在页面顶部,无论用户滚动页面与否,导航栏都保持在顶部。
  • 吸顶效果:当页面滚动到某个位置时,元素会固定在顶部,保持可见。
  • 弹出菜单:点击或鼠标悬停某个按钮或链接,会弹出一个菜单,菜单内容可以是导航链接、操作按钮等。
  • 悬浮效果:元素悬浮在其他元素上,通常用于显示额外的信息或操作。

相对定位#

相对定位是指元素相对于其原始位置进行定位。主要用于调整元素的位置,而不影响其他元素的布局。 通过设置元素的 position 属性为 relative,可以使用 topbottomleftright 属性来调整元素的位置。 示例:

.relative-box {
/* 相对定位 */
position: relative;
/* 上偏移量为 50px */
top: 50px;
/* 左偏移量为 100px */
left: 100px;
}

:::note 特点

  • 元素相对于其原始位置进行定位,仍保留原来的位置,不影响其他元素的布局。
  • 可以使用 topbottomleftright 属性来调整元素的位置,topbottom属性同时设置时,仅生效top属性,leftright属性同时设置时,仅生效left属性。 :::

绝对定位#

绝对定位是指元素脱离正常流,并基于定位基准进行偏移。主要用于悬浮效果和弹出菜单等场景。通过设置元素的 position 属性为 absolute,可以使用 topbottomleftright 属性来调整元素的位置。 示例:

.absolute-box {
/* 绝对定位 */
position: absolute;
/* 上偏移量为 50px */
top: 50px;
/* 左偏移量为 100px */
left: 100px;
}

:::note 特点

  • 元素脱离正常流,不占用文档流的空间,不保留原来的位置,其他元素会占用该元素原来的位置。
  • 可以使用 topbottomleftright 属性来调整元素的位置,topbottom属性同时设置时,仅生效top属性,leftright属性同时设置时,仅生效left属性。
  • 定位基准默认为最近的非静态定位祖先元素,如果所有祖先元素都是静态定位,则定位基准为文档.body元素。 :::

:::note 定位布局技巧 常使用父元素为相对定位,子元素为绝对定位,来实现定位布局。原因是:

  • 如果子元素设置为绝对定位,而父元素没有设置为相对定位,则子元素的定位基准为文档.body元素,因此我们通常将父元素设置为相对定位,子元素设置为绝对定位,来实现定位布局。
  • 父元素需要保留原来的位置,不能影响其他元素的布局,因此我们通常将父元素设置为相对定位。 :::

固定定位#

固定定位是指元素脱离正常流,并基于视口进行偏移。主要用于固定导航栏、吸顶效果等场景。通过设置元素的 position 属性为 fixed,可以使用 topbottomleftright 属性来调整元素的位置。 示例:

.fixed-box {
/* 固定定位 */
position: fixed;
/* 上偏移量为 50px */
top: 50px;
/* 左偏移量为 100px */
left: 100px;
}

:::note 特点

  • 元素脱离正常流,不占用文档流的空间,不保留原来的位置,其他元素会占用该元素原来的位置。
  • 可以使用 topbottomleftright 属性来调整元素的位置,topbottom属性同时设置时,仅生效top属性,leftright属性同时设置时,仅生效left属性。
  • 固定定位元素会固定在视口上,无论用户滚动页面与否,元素都保持在固定位置。 :::

粘性定位#

粘性定位是指元素在滚动到某个位置时,固定在该位置,直到滚动到某个位置后,元素才会脱离固定位置。主要用于吸顶效果等场景。通过设置元素的 position 属性为 sticky,可以使用 topbottomleftright 属性来调整元素的位置。 示例:

.sticky-box {
/* 粘性定位 */
position: sticky;
/* 上偏移量为 50px */
top: 50px;
}

:::note 特点

  • 元素在滚动到某个位置时,固定在该位置,直到滚动到某个位置后,元素才会脱离固定位置。
  • 可以使用 topbottomleftright 属性来调整元素的位置,topbottom属性同时设置时,仅生效top属性,leftright属性同时设置时,仅生效left属性。
  • 必须指定至少一个方向的偏移量,才会生效粘性定位。
  • 父元素的 overflow 属性必须为 autoscroll,否则粘性定位不会生效。 :::

层叠顺序#

层叠顺序是指元素在页面上的显示顺序,主要用于解决元素重叠问题。通过设置元素的 z-index 属性来调整元素的层叠顺序。 示例:

.layer-box {
/* 层叠顺序 */
z-index: 1;
}

:::note 特点

  • 元素的层叠顺序可以通过 z-index 属性来调整,z-index 较大的元素会显示在 z-index 较小的元素之上。
  • 层叠顺序只在元素的 position 属性为 absoluterelativefixedsticky 时才会生效。
  • 默认层叠顺序为 auto,层叠顺序为 0。相同层叠顺序的元素,后出现的元素会显示在前面。 :::

网格布局#

网格布局是一种二维布局系统,通过将页面划分为网格来组织元素。主要用于复杂的页面布局。通过设置元素的 display 属性为 grid,可以使用 grid-template-columnsgrid-template-rowsgrid-columngrid-row 等属性来调整元素的位置。 示例:

.grid-box {
/* 网格布局 */
display: grid;
/* 网格列数 */
grid-template-columns: 1fr 1fr 1fr;
/* 网格行数 */
grid-template-rows: 1fr 1fr 1fr;
}

对齐方式#

网格布局可以通过 justify-itemsalign-itemsjustify-contentalign-content 等属性来调整元素的对齐方式。 示例:

.grid-box {
/* 网格布局 */
display: grid;
/* 网格列数 */
grid-template-columns: 1fr 1fr 1fr;
/* 网格行数 */
grid-template-rows: 1fr 1fr 1fr;
/* 网格容器水平方向对齐方式 */
justify-content: center;
/* 网格容器垂直方向对齐方式 */
align-content: center;
/* 水平方向对齐方式 */
justify-items: center;
/* 垂直方向对齐方式 */
align-items: center;
}
TIP

justify-items,align-items 用于调整网格内容的对齐方式, justify-contentalign-content 用于调整网格容器内的对齐方式。

网格间距#

网格布局可以通过 gapcolumn-gaprow-gap 等属性来调整网格间距。 示例:

.grid-box {
/* 网格布局 */
display: grid;
/* 网格列数 */
grid-template-columns: 1fr 1fr 1fr;
/* 网格行数 */
grid-template-rows: 1fr 1fr 1fr;
/* 网格间距 */
gap: 20px;
}

响应式布局#

响应式布局是指根据不同的屏幕尺寸,自动调整页面布局,以适应不同的设备。主要用于移动设备等场景。 使用auto-fillauto-fit可以实现响应式布局。

  • auto-fill:会自动填充网格容器内的元素,当网格容器内的元素数量不足时,会自动添加空元素。
  • auto-fit:会自动填充网格容器内的元素,当网格容器内的元素数量不足时,会自动拉伸元素,以填充网格容器。

跨行/l跨列#

网格布局可以通过 grid-columngrid-row 等属性来调整元素的跨列/跨行情况。 示例:

.grid-box {
/* 网格布局 */
display: grid;
/* 网格列数 */
grid-template-columns: 1fr 1fr 1fr;
/* 网格行数 */
grid-template-rows: 1fr 1fr 1fr;
}
.grid-box .grid-item {
/* 跨列 */
grid-column: 1 / span 2;
/* 或者 */
grid-column: 1 / 3;
/* 跨行 */
grid-row: 1 / span 2;
/* 或者 */
grid-row: 1 / 3;
}

网格填充方式#

网格布局可以通过 grid-auto-flow 属性来调整网格填充方式。

  • grid-auto-flow: row:会按行填充网格容器内的元素,当网格容器内的元素数量不足时,会自动添加空元素。
  • grid-auto-flow: column:会按列填充网格容器内的元素,当网格容器内的元素数量不足时,会自动添加空元素。

多列布局#

多列布局用于将页面内容分成多列显示,主要用于新闻列表、产品展示等场景。通过设置元素的 column-count 属性来指定列数,column-gap 属性来指定列间距。 示例:

.multi-column-box {
display: column;
/* 多列布局 */
column-count: 2;
/* 列间距 */
column-gap: 20px;
/* 分隔线样式 */
column-rule: 1px solid #ccc;
/* 是否跨列分割 */
break-inside: avoid-column;
}

其他技巧#

边框与阴影#

通过边框border和阴影box-shadow可以为元素添加边框和阴影效果,达到相似的视觉效果
但是,边框会增大盒子大小,影响其他元素的排列;阴影不占位置,不会影响布局。

绝对定位的垂直居中#

先用top: 50%将元素垂直居中,再用transform: translateY(-50%)将元素向上移动自身高度的一半,即可实现垂直居中。 示例:

.absolute-box {
/* 绝对定位 */
position: absolute;
/* 上偏移量为 50% */
top: 50%;
/* 向上移动自身高度的一半 */
transform: translateY(-50%);
}

flex中子元素是否压缩#

在不换行的情况下,如果使用width属性为子元素设置宽度,所有子盒子会占据父元素的宽度,出现压缩情况。 而使用 flex: 0 0 200px 可以为子元素设置固定宽度,可能会导致子元素超出父元素宽度。

添加滚动条#

.scroll-box {
/* 开启垂直滚动条 */
overflow-y: auto;
/* 开启水平滚动条 */
overflow-x: auto;
/* 隐藏滚动条轨道 */
scrollbar-width: none;
}
/* 隐藏 webkit 浏览器的滚动条轨道 */
.scroll-box::-webkit-scrollbar {
display: none;
}

单行文本隐藏溢出#

.single-line-ellipsis {
/* 隐藏超出文本并显示省略号(单行) */
overflow: hidden; /* 隐藏溢出内容 */
text-overflow: ellipsis;/* 使用省略号表示被截断的文本 */
white-space: nowrap; /* 强制单行显示,阻止换行 */
}

适应容器#

object-fit 可以使元素的内容适应容器的尺寸,主要用于图片等元素。 示例:

.object-fit-box {
/* 适应容器 */
object-fit: cover;
}
说明
cover保持元素的纵横比,将元素的宽度或高度调整为与容器的宽度或高度相同,可能会裁剪元素的部分内容。
contain保持元素的纵横比,将元素的宽度或高度调整为与容器的宽度或高度相同,不会裁剪元素的内容。
fill默认值。不保持纵横比,将元素的宽度或高度调整为与容器的宽度或高度相同。

repeat()函数#

对于网格布局的 grid-template-columnsgrid-template-rows 属性,repeat() 函数可以用于重复设置网格列数或行数。 示例:

.grid-box {
/* 网格布局 */
display: grid;
/* 网格列数 */
grid-template-columns: repeat(3, 1fr);
/* 网格行数 */
grid-template-rows: repeat(3, 1fr);
}

鼠标样式#

通过 cursor 属性可以为元素设置鼠标悬停时的样式。 示例:

.cursor-box {
/* 鼠标悬停样式 */
cursor: pointer;
}
鼠标样式说明
default默认样式,鼠标悬停时显示为箭头
pointer鼠标悬停时显示为手型指针
not-allowed鼠标悬停时显示为禁止符号
text鼠标悬停时显示为文本输入符号
wait鼠标悬停时显示为等待符号
help鼠标悬停时显示为帮助符号
grab鼠标悬停时显示为抓取符号
grabbing鼠标悬停时显示为抓取中符号
zoom-in鼠标悬停时显示为放大符号
zoom-out鼠标悬停时显示为缩小符号
前端学习笔记:现代网页布局
https://blog.rinne05.top/blog/technology/front-end/web-layout/
作者
Rinne
发布于
10/22/2025
许可协议
CC BY-NC-SA 4.0

主题设置

主题模式
主题色
透明度
模糊
© 2025 Rinne,采用 CC BY-NC-SA 4.0 许可
ICP备案号: 豫ICP备2025156598号
输入以搜索...
通过 Fuse.js 搜索