css布局(flex+grid)| 豆包MarsCode AI刷题

44 阅读7分钟

传统布局方式

首先介绍三种传统常见的布局方式

文档流布局

页面中元素默认是如何被方式的布局方式,主要包括两种主要的排列方式

块级布局

块级元素会占据父元素的整个宽度,默认情况下,每一个块级元素会从新的一行开始。
常见的块级元素有:

  • <div>
  • <p>
  • <h1>, <h2>, <h3>, etc.
  • <ul>, <li>
  • <section>, <article>

行内布局

行内元素不会开始新的一行,只占据自身的宽度和高度,如果有多个行内元素,会并排显示,知道容器宽度不够时进行换行。
常见的行内元素有:

  • <span>
  • <a>
  • <strong>
  • <em>
  • <img>

行内块元素

结合了块级元素和行内元素的特性,可以像行内元素一样排列在同一行,但是可以设置宽度和高度。

  • <button>
  • <input>

浮动布局

float属性用于设置元素的浮动位置,可以把元素浮动到父元素左侧或右侧,让周围的内容(文本)环绕它。浮动元素脱离常规文档流,不占正常空间,其他内容围绕它。

清除浮动问题

由于会脱离文档流,会导致父容器高度塌陷的问题,采用清除浮动技术

常见的清除浮动方法
  1. ::after 伪元素
css
.container::after {
  content: "";
  display: block;
  clear: both;
}
  1. 使用 clear 属性

在需要清除浮动的元素上使用 clear: both,通常是父元素的最后一个子元素。

html
<div class="container">
  <div class="box left">Box 1</div>
  <div class="box right">Box 2</div>
  <div class="clear"></div>
</div>
css
.clear {
  clear: both;
}

定位布局

  • static(默认值):元素的默认定位,按文档流排列,无法使用 toprightbottomleft 等属性进行调整。

  • relative:相对定位,元素相对于其正常位置进行移动。

  • absolute:绝对定位,元素相对于最近的已定位(positionrelativeabsolutefixed)的祖先元素进行定位。如果没有已定位的祖先元素,则相对于文档的 <html> 元素进行定位。

  • fixed:固定定位,元素相对于浏览器窗口进行定位,即使页面滚动,元素也保持在固定位置。

  • sticky:粘性定位,元素在正常文档流中表现为 relative,当滚动到某个特定位置时,变为 fixed,停留在页面的某个位置。

常见使用场景

口诀:子绝父相
sticky和fixed分别用于固定导航栏的使用,显示背景等特别的使用场景。

flex布局

Flex布局的核心是 容器(container)项目(items)

  • 容器(Flex Container) :通过 display: flex;display: inline-flex; 定义一个Flex容器,容器内部的所有子元素都会成为Flex项目(flex items)。
  • 项目(Flex Items) :Flex容器中的直接子元素。

常见属性

display: flex;display: inline-flex;
  • display: flex;:使元素成为Flex容器,容器内的元素将按照Flexbox布局规则进行排列。
  • display: inline-flex;:与 display: flex; 类似,不同的是,它使容器变为内联元素,容器的行为像 inline-block,即容器不会独占一行。
主轴(Main Axis)和交叉轴(Cross Axis)
  • 主轴(Main Axis) :是Flex容器中元素排列的主要方向。默认情况下,主轴是水平方向(从左到右),可以通过 flex-direction 属性进行改变。
  • 交叉轴(Cross Axis) :与主轴垂直的方向,默认是垂直方向(从上到下)。
flex-direction

flex-direction 用于设置Flex容器的主轴方向,影响项目的排列方式。可选的值有:

  • row(默认值):主轴为水平方向,元素按水平方向排列。
  • row-reverse:主轴为水平方向,元素按水平方向反向排列。
  • column:主轴为垂直方向,元素按垂直方向排列。
  • column-reverse:主轴为垂直方向,元素按垂直方向反向排列。
justify-content

justify-content 用于设置主轴上(水平轴或垂直轴)项目的对齐方式,常用来设置元素在主轴上的分布。

  • flex-start(默认值):元素向容器的起始位置对齐。
  • flex-end:元素向容器的结束位置对齐。
  • center:元素在容器中居中对齐。
  • space-between:元素之间的间隔相等,且第一个元素和最后一个元素分别对齐到容器的起始和结束位置。
  • space-around:元素之间的间隔相等,且每个元素的两侧间距相等。
  • space-evenly:元素之间的间隔相等,包括容器的起始和结束位置。
align-items

align-items 用于设置交叉轴(垂直轴)上,所有项目的对齐方式。

  • stretch(默认值):项目会伸展以填满容器(如果没有设置具体的高度)。
  • flex-start:项目在交叉轴的起始位置对齐。
  • flex-end:项目在交叉轴的结束位置对齐。
  • center:项目在交叉轴上居中对齐。
  • baseline:项目的基线对齐。
align-self

align-self 用于设置单个项目在交叉轴(垂直方向)上的对齐方式,覆盖 align-items 的设置。

  • auto(默认值):继承父容器的 align-items 设置。
  • flex-start:项目在交叉轴的起始位置对齐。
  • flex-end:项目在交叉轴的结束位置对齐。
  • center:项目在交叉轴上居中对齐。
  • stretch:项目在交叉轴上拉伸以填满容器。
flex-wrap

flex-wrap 用于设置如果一行不能容纳所有项目,是否换行。

  • nowrap(默认值):不换行,所有项目会排在一行内。
  • wrap:如果有足够的空间,项目会换行排列。
  • wrap-reverse:项目会换行并按反向顺序排列。
flex-grow, flex-shrink, flex-basis

这些属性用来控制单个Flex项目在容器中如何伸展、收缩和设置基础宽度。

  • flex-grow:定义项目在主轴方向上的扩展比例,默认为 0(不扩展)。例如,flex-grow: 1; 表示该项目会扩展,填充剩余空间。
  • flex-shrink:定义项目在主轴方向上的收缩比例,默认为 1(会收缩)。例如,flex-shrink: 0; 表示该项目不会收缩。
  • flex-basis:定义项目的初始大小(即在主轴方向上占据的空间),默认值为 auto,即项目的内容大小。
flex(简写)

flexflex-grow, flex-shrinkflex-basis 的简写。常用来快速设置这些属性。

grid布局

常见属性

display: grid;

该属性将一个元素设为网格容器,开始启用Grid布局。

grid-template-columnsgrid-template-rows

grid-template-columnsgrid-template-rows 用来定义网格容器的列和行。你可以使用像素(px)、百分比(%)、fr(分数单位)等单位来设置。

  • grid-template-columns 定义了网格的列(横向)。
  • grid-template-rows 定义了网格的行(纵向)。
grid-gap(或 gap

grid-gap(现可简写为 gap)用于设置行和列之间的间距。可以设置 row-gap(行间距)和 column-gap(列间距)来分别调整行和列的间距。

grid-template-areas

grid-template-areas 允许你通过命名区域来定义网格布局,提供了一种更加直观的方式来描述网格的结构。

grid-columngrid-row

grid-columngrid-row 用于控制网格项(子元素)在网格中的位置。

  • grid-column 控制元素在水平方向上的位置。
  • grid-row 控制元素在垂直方向上的位置。
autofr 单位
  • fr(fraction):表示剩余空间的份额。例如,1fr 表示占据一个单位的剩余空间,2fr 占据2个单位的剩余空间。可以让所有列或行根据内容的比例分配空间。
  • auto:表示根据元素的内容自动分配空间。

指定分配

网格项会自动放置到网格中,但如果想要精确控制可以使用一下两个方法。

使用 grid-columngrid-row
css
复制代码
.item1 {
  grid-column: 1 / 3; /* 跨越第1列到第3列 */
  grid-row: 1 / 2;    /* 跨越第1行到第2行 */
}
使用 grid-area
css
复制代码
.container {
  display: grid;
  grid-template-areas:
    "header header header"
}

.header {
  grid-area: header;
}

适合响应式布局

css
复制代码
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr); /* 默认3列布局 */
}

@media (max-width: 768px) {
  .container {
    grid-template-columns: 1fr 1fr; /* 屏幕宽度小于768px时,调整为2列布局 */
  }
}

@media (max-width: 480px) {
  .container {
    grid-template-columns: 1fr; /* 屏幕宽度小于480px时,调整为单列布局 */
  }
}