【CSS】flex布局

Flex 布局 (也称为 弹性盒子布局)。

Flexible Box 模型,通常称为 Flexbox,是一种为一维布局设计的 CSS 布局模式。它旨在提供一种更有效的方式来对容器中的元素进行排列、对齐和分配空间,即使它们的大小是未知或动态的。

文章目录

      • [一、什么是 Flex 布局?](#一、什么是 Flex 布局?)
      • 二、基本概念和术语
      • [三、Flex 容器的属性(作用于父元素)](#三、Flex 容器的属性(作用于父元素))
      • [四、Flex 项目的属性(作用于子元素)](#四、Flex 项目的属性(作用于子元素))
      • 五、一个完整的示例
      • 总结

一、什么是 Flex 布局?

核心思想:通过赋予容器控制其子元素(弹性项目)高度/宽度和顺序的能力,来填充可用空间。其核心是让容器能够改变其子项目的宽度、高度和顺序,以最佳方式填充可用空间(主要是为了适应各种显示设备和屏幕尺寸)。

主要特征

  • 一维布局:Flex 布局一次只能处理一个维度(行或列)上的布局。这与处理行和列的 CSS Grid(二维布局)形成对比。
  • 两个轴 :Flex 布局基于主轴交叉轴
    • 主轴 :由 flex-direction 属性定义的方向(默认为水平,从左到右)。
    • 交叉轴:与主轴垂直的方向。

二、基本概念和术语

要使用 Flex 布局,你需要理解两个基本组件:

  1. Flex 容器 :设置了 display: flexdisplay: inline-flex 的父元素。

  2. Flex 项目:Flex 容器内的直接子元素。

    项目 1
    项目 2
    项目 3

三、Flex 容器的属性(作用于父元素)

这些属性控制着容器内所有项目的整体行为。

属性 作用 常用值
display 定义一个 Flex 容器。 flex(块级容器) inline-flex(行内容器)
flex-direction 定义主轴的方向,即项目的排列方向。 row(默认,水平从左到右), row-reverse(水平从右到左), column(垂直从上到下), column-reverse(垂直从下到上)
flex-wrap 定义项目是否换行。 nowrap(默认,不换行), wrap(换行), wrap-reverse(反向换行)
justify-content 定义项目在主轴上的对齐方式。 flex-start(默认,左对齐), flex-end(右对齐), center(居中), space-between(两端对齐,项目间间隔相等), space-around(每个项目两侧的间隔相等), space-evenly(项目与项目、项目与边框的间隔都相等)
align-items 定义项目在交叉轴上的对齐方式(单行)。 stretch(默认,拉伸填满容器高度), flex-start(顶部对齐), flex-end(底部对齐), center(垂直居中), baseline(按项目第一行文字的基线对齐)
align-content 定义了多根轴线的对齐方式(多行)。如果项目只有一根轴线,该属性不起作用。 stretch, flex-start, flex-end, center, space-between, space-around, space-evenly

flex-flow 简写属性 :是 flex-directionflex-wrap 的简写形式。

  • 语法:flex-flow: <flex-direction> || <flex-wrap>;
  • 示例:flex-flow: row wrap;

四、Flex 项目的属性(作用于子元素)

这些属性控制单个项目在容器内的行为。

属性 作用 常用值
order 定义项目的排列顺序。数值越小,排列越靠前,默认为 0。 <integer>(整数,如 -1, 0, 1, 2)
flex-grow 定义项目的放大比例,默认为 0(即如果存在剩余空间,也不放大)。 <number>(数字,如 0, 1, 2)
flex-shrink 定义项目的缩小比例,默认为 1(即如果空间不足,该项目将缩小)。 <number>(数字,如 0, 1, 2)
flex-basis 定义在分配多余空间之前,项目占据的主轴空间。浏览器根据这个属性计算是否有多余空间。 auto(默认,项目本来的大小), 长度值(如 20%, 250px
align-self 允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。 auto(继承父容器的 align-items), stretch, flex-start, flex-end, center, baseline

flex 简写属性 :是 flex-grow, flex-shrinkflex-basis 的简写。

  • 语法:flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
  • 推荐使用简写,因为它可以智能地设置其他值。
  • 常用值:
    • flex: initial:等同于 flex: 0 1 auto。(不放大,可缩小,初始大小)
    • flex: auto:等同于 flex: 1 1 auto。(可放大,可缩小)
    • flex: none:等同于 flex: 0 0 auto。(不放大,不缩小)
    • flex: 1:等同于 flex: 1 1 0%。(常用,平均分配空间)

五、一个完整的示例

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <style>
        .container {
            display: flex; /* 定义 Flex 容器 */
            flex-direction: row; /* 主轴为水平方向 */
            flex-wrap: wrap; /* 允许换行 */
            justify-content: space-around; /* 主轴对齐方式 */
            align-items: center; /* 交叉轴对齐方式(单行) */
            height: 200px;
            background-color: #f0f0f0;
        }
        .item {
            flex: 1; /* 每个项目可伸缩,平均分配空间 */
            min-width: 100px; /* 设置最小宽度,防止过小 */
            height: 60px;
            margin: 10px;
            background-color: tomato;
            text-align: center;
            line-height: 60px;
            color: white;
        }
        .item-special {
            flex: 2; /* 这个项目占据的空间是其他的两倍 */
            background-color: steelblue;
            align-self: flex-end; /* 这个项目自己底部对齐 */
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item item-special">3 (特殊)</div>
        <div class="item">4</div>
    </div>
</body>
</html>

总结

Flex 布局是现代 CSS 的基石,它极大地简化了以往非常棘手的布局问题(如垂直居中、等高布局、圣杯布局等)。掌握 Flex 布局是前端开发者的必备技能。

相关推荐
wearegogog1238 小时前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
Drawing stars8 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
品克缤8 小时前
Element UI MessageBox 增加第三个按钮(DOM Hack 方案)
前端·javascript·vue.js
小二·8 小时前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
小沐°8 小时前
vue-设置不同环境的打包和运行
前端·javascript·vue.js
qq_419854059 小时前
CSS动效
前端·javascript·css
烛阴9 小时前
3D字体TextGeometry
前端·webgl·three.js
桜吹雪9 小时前
markstream-vue实战踩坑笔记
前端
C_心欲无痕10 小时前
nginx - 实现域名跳转的几种方式
运维·前端·nginx
花哥码天下10 小时前
恢复网站console.log的脚本
前端·javascript·vue.js