CSS——弹性 flex 布局

一、Flex 布局核心概念与机制

Flexbox 是 CSS3 引入的一种一维布局模型,旨在提供更高效的方式来布局、对齐和分配容器内项目的空间。

其核心概念包括:

容器与项目:采用 Flex 布局的元素称为 Flex 容器,其内部的子元素称为 Flex 项目。

主轴与交叉轴:Flex 容器有两根轴,主轴由flex-direction定义,交叉轴垂直于主轴。

空间分配:通过 flex-basis、flex-grow 和 flex-shrink 控制项目在主轴上的初始大小、放大和缩小比例。

对齐方式:justify-content 控制主轴对齐,align-items 和 align-content 控制交叉轴对齐。

二、示例

(一)基础布局示例1

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="UTF-8">
    <title>Flex布局示例1 - 基本容器</title>
    <style>
        .container {

            display: flex;

            border: 2px solid #ccc;
            padding: 10px;
        }

        .item {
            background-color: #4CAF50;
            color: white;
            margin: 5px;
            padding: 20px;
            text-align: center;
        }
    </style>
</head>

<body>
    <h3>Flex容器示例</h3>
    <div class="container">
        <div class="item">项目1</div>
        <div class="item">项目2</div>
        <div class="item">项目3</div>

        <div class="item">项目4</div>
        <div class="item">项目5</div>
        <div class="item">项目6</div>
    </div>
</body>

</html>
  •  通过 display: flex 将此元素转换为 Flex 容器,其内部项目会自动水平排列
  • 当一个父盒子被设置flex弹性盒时,该弹性盒的默认规则为:进入该弹性盒的项目,会按照主轴方向排列,排到位置不够时,换行继续排

 (二)布局示例2

默认盒子格式:

.container {
    display: flex;
    border: 2px solid #ccc;
    padding: 10px;
    margin-bottom: 20px;
}
.item {
    background-color: #2196F3;
    color: white;
    margin: 5px;
    padding: 20px;
    text-align: center;
}
1、将从左到右的箭头,设置为主轴(默认值)
.row {
    flex-direction: row; /* 默认值,水平排列(从左到右) */
}
<h3>flex-direction: row 实验1: 将从左到右的箭头,设置为主轴(默认值)</h3>
<div class="container row">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

2、将从右到左的箭头,设置为主轴
.row-reverse {
    flex-direction: row-reverse; /* 水平反向排列(从右到左) */
}
<h3>flex-direction: row-reverse 实验2: 将从右到左的箭头,设置为主轴</h3>
<div class="container row-reverse">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

 

3、将从上到下的箭头,设置为主轴
.column {
    flex-direction: column; /* 垂直排列(从上到下) */
}
<h3>flex-direction: column 实验3: 将从上到下的箭头,设置为主轴</h3>
<div class="container column">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

 

4、将从下到上的箭头,设置为主轴
.column-reverse {
    flex-direction: column-reverse; /* 垂直反向排列(从下到上) */
}
<h3>flex-direction: column-reverse 实验4: 将从下到上的箭头,设置为主轴</h3>
<div class="container column-reverse">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

(三)布局示例3

默认盒子格式:

.container {
    display: flex;
    border: 2px solid #ccc;
    padding: 10px;
    margin-bottom: 20px;
    height: 100px;
}

.item {
    background-color: #FF9800;
    color: white;
    margin: 5px;
    padding: 20px;
    text-align: center;
}
1、项目向主轴起点对齐(默认值)
.justify-start {
    justify-content: flex-start; /* 默认值,项目向主轴起点对齐 */
}
<h3>justify-content: flex-start 项目向主轴起点对齐(默认值)</h3>
<div class="container justify-start">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

2、项目向主轴终点对齐
.justify-end {
    justify-content: flex-end; /* 项目向主轴终点对齐 */
}
<h3>justify-content: flex-end 项目向主轴终点对齐</h3>
<div class="container justify-end">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

 

3、项目在主轴居中对齐
.justify-center {
    justify-content: center; /* 项目在主轴居中对齐 */
}
<h3>justify-content: center 项目在主轴居中对齐</h3>
<div class="container justify-center">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

4、项目均匀分布,首尾项目紧贴容器边缘
.justify-between {
    justify-content: space-between; /* 项目均匀分布,首尾项目紧贴容器边缘 */
}
<h3>justify-content: space-between 项目均匀分布,首尾项目紧贴容器边缘</h3>
<div class="container justify-between">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

5、项目均匀分布,每个项目两侧间距相等
.justify-around {
    justify-content: space-around; /* 项目均匀分布,每个项目两侧间距相等 */
}
<h3>justify-content: space-around   项目均匀分布,每个项目两侧间距相等</h3>
<div class="container justify-around">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

 

6、 项目均匀分布,所有间距相等
.justify-evenly {
    justify-content: space-evenly; /* 项目均匀分布,所有间距相等 */
}

<h3>justify-content: space-evenly   项目均匀分布,所有间距相等</h3>
<div class="container justify-evenly">
    <div class="item">项目1</div>
    <div class="item">项目2</div>
    <div class="item">项目3</div>
</div>

(四) 布局示例4

默认盒子格式:

.container {
    display: flex;
    border: 2px solid #ccc;
    padding: 10px;
    margin-bottom: 20px;
    height: 200px;  /* 设置高度以便观察垂直对齐效果 */
}

.item {
    background-color: #9C27B0;
    color: white;
    margin: 5px;
    padding: 20px;
    text-align: center;
}

.tall {
    height: 120px;
}

.short {
    height: 60px;
}

添加了固定高度 height: 60px,这创建了一个显式的基线 

这会影响基线计算。Flexbox 规范中有一个重要规则:

当项目有固定高度时,其内容会在该高度内对齐,而不是拉伸以适应容器。

————

基线对齐模式下,这意味着:

固定高度的项目会保持其高度,文本内容会在该高度内垂直对齐,

所有项目的文本基线会对齐在同一条线上。

————

解决方案:

如果你希望项目拉伸,应该移除固定高度 

1、项目向交叉轴起点对齐
.align-start {
    align-items: flex-start; /* 项目向交叉轴起点对齐 */
}
<h3>align-items: flex-start 项目向交叉轴起点对齐</h3>
<div class="container align-start">
    <div class="item tall">高项目</div>
    <div class="item short">矮项目</div>
    <div class="item">标准项目</div>
</div>

2、项目向交叉轴终点对齐
.align-end {
    align-items: flex-end; /* 项目向交叉轴终点对齐 */
}
<h3>align-items: flex-end 项目向交叉轴终点对齐</h3>
<div class="container align-end">
    <div class="item tall">高项目</div>
    <div class="item short">矮项目</div>
    <div class="item">标准项目</div>
</div>

3、项目在交叉轴居中对齐
.align-center {
    align-items: center; /* 项目在交叉轴居中对齐 */
}
<h3>align-items: center 项目在交叉轴居中对齐</h3>
<div class="container align-center">
    <div class="item tall">高项目</div>
    <div class="item short">矮项目</div>
    <div class="item">标准项目</div>
</div>

4、项目拉伸以填满容器高度(默认值)
.align-stretch {
    align-items: stretch; /* 项目拉伸以填满容器高度(默认值) */
}
<h3>align-items: stretch 项目拉伸以填满容器高度(默认值)</h3>
<div class="container align-stretch">
    <div class="item" style="padding: 5px;">拉伸项目1</div>
    <div class="item" style="padding: 5px;">拉伸项目2</div>
    <div class="item" style="padding: 5px;">拉伸项目3</div>
</div>

5、项目根据基线对齐
.align-baseline {
    align-items: baseline; 
}
.baseline {
    padding-top: 80px;  
}

项目根据基线对齐
即使项目的高度不同,它们的文本底部也会对齐在同一条水平线上。
【基线对齐在以下场景特别有用】
导航菜单:当菜单项包含不同大小的文本或图标时,确保文本底部对齐
 价格标签:当价格有不同的字体大小(如主价和小字体的原价)时,保持数字底部对齐
表单布局:确保标签和输入框的文本基线对齐 

<h3>align-items: baseline 项目根据基线对齐</h3>
<div class="container align-baseline">
    <div class="item baseline">基线项目1</div>
    <div class="item">标准项目</div>
    <div class="item short">矮项目</div>
</div>

三、练习

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Flex布局-练习的答案</title>
    <style>
        /* 基础样式 */
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }
        
        /* 导航栏样式 */
        .navbar {


            display: flex;
            justify-content: space-between;
            align-items: center;



            background-color: #333;
            color: white;
            padding: 10px 20px;
        }
        
        .logo {
            font-size: 24px;
            font-weight: bold;
        }
        


        /* 中间的导航项目组 */
        .nav-links {
            display: flex;


            list-style: none;
            margin: 0;
            padding: 0;
        }
        
        .nav-links li {
            margin-left: 20px;
        }
        
        .nav-links a {
            color: white;
            text-decoration: none;
        }
        




        /* 搜索框样式 */
        .search-box {
            display: flex;
            align-items: center;
        }
        
        .search-box input {
            padding: 5px;
            border: none;
            border-radius: 3px 0 0 3px;
        }
        
        .search-box button {
            padding: 5px 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 0 3px 3px 0;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <!-- 导航栏 -->
    <nav class="navbar">
        <div class="logo">网站Logo</div>
        
        <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>
        
        <div class="search-box">
            <input type="text" placeholder="搜索...">
            <button><i class="fa fa-search"></i></button>
        </div>
    </nav>
    <!-- 内容区域 -->
    <div class="container">
        <h1>欢迎来到我们的网站</h1>
        <p>这里是一些关于我们的内容。</p>
    </div>
</body>
</html>

### CSS Flexbox 弹性布局详解 #### 创建弹性容器 要启用Flexbox布局,需设置父级元素`display: flex;`。这会使得该元素成为弹性容器,其所有直接子元素自动变为弹性项目。 ```css .flex-container { display: flex; } ``` 此代码片段定义了一个名为`.flex-container`的类,当应用于HTML标签时,会使内部的所有直系子节点遵循Flexbox规则[^1]。 #### 控制主轴排列方向 通过调整`flex-direction`属性可改变项目的排列顺序,默认情况下沿水平线从左至右放置(`row`);也可以改为垂直堆叠(`column`)或其他反向模式。 ```css .container { display: flex; flex-direction: row; /* 或 column */ } ``` 这段样式声明让`.container`内的组件按照指定的方向分布[^4]。 #### 处理多行与换行行为 对于超出单行宽度的内容,利用`flex-wrap`参数决定是否允许折行以及具体的折叠策略: - `nowrap`: 默认值,不允许换行; - `wrap`: 当空间不足时新起一行显示剩余项; - `wrap-reverse`: 类似于`wrap`但是反转后的效果。 ```css .container { display: flex; flex-wrap: wrap; } ``` 上述配置确保了即使内容过多也能合理展示而不至于破坏整体结构[^2]。 #### 对齐方式定制化 为了更好地掌控视觉呈现,在横向(主轴)和纵向(交叉轴)两个维度上分别设置了不同的对齐机制——`justify-content`(影响X轴位置关系)`align-items`(负责Y轴定位),它们支持多种预设选项满足多样化的排版需求。 ```css .item { flex-grow: 1; /* 自动扩展填充可用空间 */ } .container { justify-content: space-between; /* 主轴两端均匀间隔 */ align-items: center; /* 交叉轴居中对齐 */ } ``` 这里展示了如何使各个单元格平均分配间隙并保持中心高度一致的效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值