← CSS3 box-sizing 重构盒子模型 CSS3 滤镜效果 →

CSS3 Flex布局

原创 2025-09-20 CSS3 已有人查阅

CSS3 Flex布局指南:构建灵活的现在网页布局

理解Flex布局模型

Flexible Box(通常称为flexbox)是CSS3引入的一种全新布局模式,它让我们能够创建灵活的用户界面设计,无需使用百分比或固定长度值即可实现多行多列布局。Flex布局模型通过样式表自动处理空间分配和内容对齐,提供了一种简单而强大的机制。

Flex布局基础概念

Flexbox由flex容器和flex项目组成。通过将元素的display属性设置为flex(生成块级flex容器)或inline-flex(生成类似inline-block的内联flex容器),可以创建flex容器。所有flex容器的子元素自动成为flex项目,并使用flex布局模型进行布局。

创建基本Flex容器


项目一
项目二
项目三
<style>
.flex-container {
    display: flex;
    width: 80%;
    min-height: 300px;
    border: 1px solid #808080;
    margin: 0 auto;
}

.flex-item {
    background: #dbdfe5;
    flex: 1;
    padding: 20px;
    margin: 10px;
}
</style>
<div class="flex-container">
    <div class="flex-item">项目一</div>
    <div class="flex-item">项目二</div>
    <div class="flex-item">项目三</div>
</div>

在这个例子中,我们没有为内部div指定任何宽度,但每个列的宽度恰好等于父容器宽度的三分之一。这种自动分配空间的能力是flex布局的核心优势。

控制Flex容器内的流动方向

在标准CSS盒模型中,元素通常按照它们在HTML标记中出现的顺序显示。Flex布局允许您控制flex容器内的流动方向,使元素可以在左、右、下甚至上任何方向布局。

使用flex-direction属性

.flex-row {
    display: flex;
    flex-direction: row; /* 默认值:从左到右 */
}

.flex-row-reverse {
    display: flex;
    flex-direction: row-reverse; /* 从右到左 */
}

.flex-column {
    display: flex;
    flex-direction: column; /* 从上到下 */
}

.flex-column-reverse {
    display: flex;
    flex-direction: column-reverse; /* 从下到上 */
}

在实际项目中,我经常使用flex-direction: column来创建移动设备上的垂直布局,然后使用媒体查询在桌面设备上切换为行布局。

控制Flex项目的尺寸

Flex布局最重要的方面是flex项目能够改变其宽度或高度以填充可用空间。这是通过flex属性实现的,它是flex-growflex-shrinkflex-basis属性的简写。

灵活的项目分布

.flex-container {
    display: flex;
    width: 80%;
    min-height: 200px;
    border: 1px solid #666;
    margin: 20px auto;
}

.flex-item {
    padding: 20px;
}

.item1, .item3 {
    flex: 1; /* 各占1份 */
    background: #e84d51;
}

.item2 {
    flex: 2; /* 占2份 */
    background: #7ed636;
}

在这个例子中,第一个和第三个flex项目各占用1/4的自由空间(1/(1+1+2)),而第二个flex项目占用1/2的自由空间(2/(1+1+2))。这种按比例分配空间的方式使得创建复杂布局变得非常简单。

对齐Flex项目

Flexbox提供了四个属性来控制flex项目在容器内的对齐方式:justify-contentalign-contentalign-itemsalign-self。前三个应用于flex容器,之后一个应用于各个flex项目。

主轴对齐(justify-content)

.justify-start {
    justify-content: flex-start; /* 默认值:从主轴起点开始 */
}

.justify-end {
    justify-content: flex-end; /* 从主轴终点开始 */
}

.justify-center {
    justify-content: center; /* 居中 */
}

.justify-between {
    justify-content: space-between; /* 两端对齐,项目间间隔相等 */
}

.justify-around {
    justify-content: space-around; /* 每个项目两侧间隔相等 */
}

交叉轴对齐(align-items)

.align-stretch {
    align-items: stretch; /* 默认值:拉伸以填充容器 */
}

.align-start {
    align-items: flex-start; /* 从交叉轴起点开始 */
}

.align-end {
    align-items: flex-end; /* 从交叉轴终点开始 */
}

.align-center {
    align-items: center; /* 交叉轴居中 */
}

.align-baseline {
    align-items: baseline; /* 基线对齐 */
}

在我的开发经验中,align-items: center是最常用的值,特别是在需要垂直居中内容时。

重新排序Flex项目

除了改变flex容器内的流动方向,您还可以使用order属性更改各个flex项目的显示顺序。此属性接受正负整数值。默认情况下,所有flex项目按照它们在HTML标记中出现的顺序显示,因为order的默认值为0。

.flex-item:nth-child(1) {
    order: 3; /* 第三个显示 */
    background: #e84d51;
}

.flex-item:nth-child(2) {
    order: 1; /* 第一个显示 */
    background: #7ed636;
}

.flex-item:nth-child(3) {
    order: 2; /* 第二个显示 */
    background: #2f97ff;
}

order属性在需要根据屏幕大小重新排序内容时非常有用,特别是在响应式设计中。

使用Flexbox实现居中

传统的垂直居中方法通常需要JavaScript或复杂的CSS技巧。但使用flexbox,您可以轻松实现水平和垂直居中,无需任何额外调整。

.centered-container {
    display: flex;
    width: 100%;
    height: 400px;
    border: 1px solid #666;
}

.centered-item {
    margin: auto; /* 神奇的自适应居中 */
    padding: 30px;
    background: #f0e68c;
    text-align: center;
}

这种方法比传统的定位和变换方法更简洁、更可靠,特别是在不知道元素尺寸的情况下。

启用Flex项目换行

默认情况下,flex容器仅显示单行或单列的flex项目。但是,您可以在flex容器上使用flex-wrap属性来控制其flex项目是否在多行上换行。

.flex-wrap {
    flex-wrap: wrap; /* 允许换行 */
}

.flex-nowrap {
    flex-wrap: nowrap; /* 默认值:不允许换行 */
}

.flex-wrap-reverse {
    flex-wrap: wrap-reverse; /* 反向换行 */
}

您还可以使用简写CSS属性flex-flow同时设置flex-directionflex-wrap

.flex-container {
    display: flex;
    flex-flow: row wrap; /* 行方向且允许换行 */
}

实战示例:创建响应式导航栏

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flex布局实战 - 响应式导航栏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        }
        
        .navbar {
            display: flex;
            justify-content: space-between;
            align-items: center;
            background-color: #2c3e50;
            padding: 15px 5%;
            flex-wrap: wrap;
        }
        
        .logo {
            color: white;
            font-size: 24px;
            font-weight: bold;
        }
        
        .nav-links {
            display: flex;
            list-style: none;
        }
        
        .nav-links li {
            margin-left: 25px;
        }
        
        .nav-links a {
            color: white;
            text-decoration: none;
            transition: color 0.3s;
        }
        
        .nav-links a:hover {
            color: #3498db;
        }
        
        .toggle-btn {
            display: none;
            background: none;
            border: none;
            color: white;
            font-size: 24px;
            cursor: pointer;
        }
        
        @media (max-width: 768px) {
            .toggle-btn {
                display: block;
            }
            
            .nav-links {
                display: none;
                flex-direction: column;
                width: 100%;
                margin-top: 15px;
            }
            
            .nav-links.active {
                display: flex;
            }
            
            .nav-links li {
                margin: 10px 0;
                text-align: center;
            }
        }
    </style>
</head>
<body>
    <nav class="navbar">
        <div class="logo">代码号学习</div>
        <button class="toggle-btn">☰</button>
        <ul class="nav-links">
            <li><a href="#">首页</a></li>
            <li><a href="#">教程</a></li>
            <li><a href="#">编程</a></li>
            <li><a href="#">源码</a></li>
            <li><a href="#">关于</a></li>
        </ul>
    </nav>

    <script>
        document.querySelector('.toggle-btn').addEventListener('click', function() {
            document.querySelector('.nav-links').classList.toggle('active');
        });
    </script>
</body>
</html>

本节课程知识要点

  1. Flex容器与项目:理解flex容器和flex项目的关系是掌握flex布局的基础

  2. 主轴与交叉轴:flex布局基于主轴和交叉轴的概念,理解这两个方向对对齐非常重要

  3. 灵活的空间分配:flex-grow、flex-shrink和flex-basis属性控制项目如何分配剩余空间

  4. 对齐控制:justify-content、align-items和align-self属性提供了精确的对齐控制

  5. 响应式设计:flex布局天然支持响应式设计,结合媒体查询可以创建适应不同屏幕的布局

项目应用建议

在我的项目开发经验中,flex布局最适合用于以下场景:

  • 导航栏和菜单

  • 卡片布局和网格系统

  • 表单项布局

  • 垂直和水平居中

  • 复杂布局中的特定部分

虽然flex布局非常强大,但它主要设计用于一维布局(行或列)。对于复杂的二维布局,可能需要结合CSS Grid布局使用。对于浏览器兼容性,现在浏览器对flex布局的支持已经很好,但在某些旧版本浏览器中可能需要使用供应商前缀。可以使用Autoprefixer等工具自动处理前缀问题。

← CSS3 box-sizing 重构盒子模型 CSS3 滤镜效果 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号