CSS弹性盒总结

本文深入解析CSS弹性盒布局的原理与应用,包括justify-content、align-items等关键属性,探讨flex-direction、flex-wrap对子元素排列的影响,以及flex属性在空间分配上的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

弹性盒简介

弹性盒(Flex Box)是 CSS3 的一种新的布局模式,是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间
弹性盒父元素叫容器,子元素叫项目,水平方向叫主轴,垂直方向叫侧轴,弹性盒作用就是让容器有能力去控制项目的位置、大小、顺序、方向等等

弹性盒的使用

创建html文件

父盒子father-box,子盒子son-one,son-two,son-third

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>弹性盒</title>
  <style>
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;  
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;  
    }
  </style>
</head>
<body>
  <div class="father-box">
    <div class="son-one"></div>
    <div class="son-two"></div>
    <div class="son-third"></div>
  </div>
</body>
</html>

在这里插入图片描述

定义一个弹性盒

使用弹性盒的前提是我们必须先定义一个弹性盒,给父元素添加属性display: flex;当父元素定义成弹性盒之后,子元素会默认横向排列(水平排列)

    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
    }

在这里插入图片描述

弹性盒的对齐方式

justify-content

父元素设置justify-content: 子元素沿主轴(X轴-水平)对齐方式

  • 备注:(不能忽视margin,margin算已占用的空间,margin不算剩余空间,即就算是设置了弹性盒,父元素和子元素之前设置的margin也是生效的)
    justify-content有以下属性:
  1. flex-start:子元素向一行的起始位置(最左)靠齐。
    在这里插入图片描述

  2. flex-end:子元素向一行的结束位置(最右)靠齐;
    在这里插入图片描述

  3. center:子元素向一行的中间位置靠齐;
    在这里插入图片描述

  4. space-between:子元素会平均的分布在行里;
    在这里插入图片描述

  5. space-around:子元素会平均的分布在行里,两端保留项目间距的一半的剩余空间;
    在这里插入图片描述

align-items

父元素设置align-items: 子元素沿侧轴(Y轴-垂直)对齐方式

  • 备注:(不能忽视margin,margin算已占用的空间,margin不算剩余空间,即就算是设置了弹性盒,父元素和子元素之前设置的margin也是生效的)
    align-items有以下属性:
  1. flex-start:子元素在侧轴起点边的外边距 紧靠住 该行在侧轴起始边(顶部);

在这里插入图片描述

  1. flex-end:子元素在侧轴终点边的外边距 紧靠住 该行在侧轴终点边(底部);

在这里插入图片描述

  1. center:子元素的外边距盒 在该行的侧轴上居中放置;

在这里插入图片描述

  1. stretch(默认值):子元素拉伸填充整个父盒子容器。子元素拉伸填充整个伸缩容器(不能忽视margin算已占用的空间,margin不算剩余空间);弹性盒布局默认是可以拉伸元素的(子盒子纵向排列的时候,元素没有设置宽度拉伸的是宽(充满容器),子盒子横向排列的时候没有设置高度,默认拉伸高(充满容器的高度))。(stretch必须要是在纵向排列时子盒子没有设置宽度而设置了高度,这样才会拉伸子盒子的宽度占满剩余空间;或者在横向排列时子盒子设置了宽度而没有设置高度,这样才会拉伸子盒子的高度占满剩余空间)(stertch如果在子盒子宽高都设置了的情况下不会拉伸)(如果盒子设置了宽高,stretch作用,不会拉伸,默认停留在原位置)
  • 子元素宽高都设置的情况下
   .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      align-items: stretch;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;  
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;  
    }

在这里插入图片描述

  • 子元素横向排列,只设置了宽度不设置高度的情况下
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      align-items: stretch;
    }
    .son-one {
      width: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      background-color: black;  
    }
    .son-third {
      width: 100px;
      background-color: brown;  
    }

在这里插入图片描述

  • 子元素纵向排列,只设置高度不设置宽度的情况下
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      align-items: stretch;
      flex-direction: column; // 让子元素纵向排列
    }
    .son-one {
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      height: 100px;
      background-color: black;  
    }
    .son-third {
      height: 100px;
      background-color: brown;  
    }

在这里插入图片描述
5. baseline:子元素根据子元素的基线对齐;默认以(高度或宽度)值大的为标准(有文字的盒子,基线以文字的底部为准,没有文字的,基线以盒子的底部为准)(不能忽视margin算已占用的空间,margin不算剩余空间);

  • 子元素无文字的情况
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      align-items: baseline;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 200px;
      background-color: black;  
    }
    .son-third {
      width: 100px;
      height: 300px;
      background-color: brown;  
    }

在这里插入图片描述

  • 子元素内容有文字的情况
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>弹性盒</title>
  <style>
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      align-items: baseline;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 200px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 300px;
      background-color: brown;  
    }
  </style>
</head>
<body>
  <div class="father-box">
    <div class="son-one">1</div>
    <div class="son-two">2</div>
    <div class="son-third">3</div>
  </div>
</body>
</html>

在这里插入图片描述

排列方向 flex-direction

父元素设置flex-direction,可以设置子元素的排列方向为水平还是纵向,是正序还是反序
flex-direction有以下值:

  1. row:子元素从左向右排列
    在这里插入图片描述
  2. row-reverse:从右到左排列(反序);
    在这里插入图片描述
  3. column:从上到下
    在这里插入图片描述
  4. column-reverse:从下到上排列(反序);
    在这里插入图片描述

flex 设置弹性盒子的子元素如何分配空间

子元素设置flex属性,决定了子元素如何分配剩余空间
什么是剩余空间
如果子元素是横向排列,那么剩余空间就是父盒子的宽度-子盒子的宽度-子盒子的水平margin
如果子元素是纵向排列,那么剩余空间就是父盒子的高度-子盒子的高度-子盒子的垂直margin

  • 如果只有一个子元素设置flex,其他元素不设置flex,那么这个子元素将根据排列方向,横向或者纵向拉伸(拉伸宽度或者高度),占满父元素的剩余空间
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
      flex: 1;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;  
    }

在这里插入图片描述

  • 如果有多个子元素设置了flex,那么设置了flex的元素将等比例分配剩余空间,根据排列方向,横向或者纵向拉伸(拉伸宽度或者高度),占满父元素的剩余空间
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
      flex: 1;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
      flex: 2;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
      flex: 3;
    }

在这里插入图片描述

order 设置弹性盒子的子元素排列顺序

子元素设置了order属性,将决定子元素在父元素内的排列顺序
不定义order的伸缩项目会排到最前面
order:1; 排第一
order:2; 排第二
(意思就是比如有三个盒子A/B/C,标准流中A/B/C依次向下编写,但是在父盒子设置了弹性盒后,C不设置order,A设置order:1,B设置order:2,然后显示顺序就是C排最前面,A排第二,B排第三,order值越高,排越后面)

    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
      order: 1;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
      order: 2;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }

在这里插入图片描述

flex-wrap 设置弹性盒子的子元素超出父容器时是否换行

默认情况下,弹性盒内的子元素如果总宽度(水平排列)或者总高度(垂直排列)超过父盒子,那么子元素将被压缩宽度(或高度),使所有的子元素在同一行或者同一列。
我们可以给父元素设置 flex-wrap,让其换行或者换列
flex-wrap有以下属性

  1. nowrap 默认情况下的场景,不换行,不管子盒子的总宽度(高度)超出父盒子宽度(高度)还是不超出都不会换行(列),如果超出了父盒子宽度(高度),子盒子即使设置了宽度(高度)也会被压缩
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>弹性盒</title>
  <style>
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }
  </style>
</head>
<body>
  <div class="father-box">
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-one">1</div>
    <div class="son-two">2</div>
    <div class="son-third">3</div>
  </div>
</body>
</html>

在这里插入图片描述

  1. wrap 换行,一旦伸缩项目超出伸缩容器,那么就会换行(列),此时子元素不会被压缩,仍保留原来的宽度(高度),但是wrap换行会有默认行距(列距)
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      flex-wrap: wrap;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }

在这里插入图片描述

  1. wrap-reverse 换行反向 主轴水平时,上下反向,主轴垂直时,左右反向;即水平时,第一行会变成最后一行;垂直时,第一列会变成最后一列
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      flex-wrap: wrap-reverse;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }

在这里插入图片描述

align-content 修改 flex-wrap 属性的行为

align-content修改 flex-wrap 属性的行为,类似 align-items, 但不是设置子元素对齐,而是设置行对齐。

比如当父元素有高度(宽度)时,子元素换行(列)后会有行距(列距)(父盒子没高度,换行就没行距,父盒子没宽度,换列就没列距,),给父元素设置align-centent可以取消行距(列距)

    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      flex-wrap: wrap;
      align-content: flex-start;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }

在这里插入图片描述

排列方向 flex-direction与换行(列) flex-flow 缩写形式

flex-direction与 flex-flow两个属性可以缩写成一个属性flex-flow
flex-flow:flex-direction flex-wrap; 两个值同时定义或者单独定义都生效
如 flex-flow: wrap和 flex-flow:column wrap;

    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      flex-flow:column wrap;
      align-content: flex-start;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }

在这里插入图片描述

弹性盒多属性之间的相互配合

比如我们可以justify-content和align-items相互配合实现子元素的水平垂直居中

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>弹性盒</title>
  <style>
    .father-box {
      width: 500px;
      height: 500px;
      border: 1px solid red;
      margin: 100px auto 0;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .son-one {
      width: 100px;
      height: 100px;
      background-color: yellow;
    }
    .son-two {
      width: 100px;
      height: 100px;
      background-color: black;
      color: #fff;
    }
    .son-third {
      width: 100px;
      height: 100px;
      background-color: brown;
    }
  </style>
</head>
<body>
  <div class="father-box">
    <div class="son-one">1</div>
    <div class="son-two">2</div>
    <div class="son-third">3</div>
  </div>
</body>
</html>

在这里插入图片描述

### CSS 弹性盒子布局教程 #### 什么是弹性盒子? 弹性盒子,即 Flexbox,是一种用于在一维空间内排列项目的布局模式。这种布局模型允许更高效地分配和调整容器内的项目位置及其大小,从而简化了网页设计中的复杂布局需求[^1]。 #### 创建一个简单的Flexbox实例 要创建一个基础的Flexbox结构,首先需要定义父级元素为`flex`显示类型: ```css .box { display: flex; } ``` 这段代码会把`.box`类下的所有直接子节点转换成灵活可调节尺寸的对象——也就是所谓的“弹性项”。 为了更好地理解如何控制这些弹性项的位置与间距,在这里给出几个常用的样式属性说明以及它们的作用效果: - `justify-content`: 控制沿主轴方向上内容之间的对齐方式; - `align-items`: 负责管理侧轴线上面各个条目间的垂直居中度; - `flex-direction`: 改变主要流动的方向是从左到右还是自上而下; - `flex-wrap`: 当一放不下所有的孩子时决定是否换展示; - 组合使用`flex-flow`可以同时指定上述两个参数(`flex-direction`, `flex-wrap`) 的值以达到更加简洁的效果[^4]。 例如,如果想要让一组按钮始终位于其所在区域最右侧,则可以在包裹该组按钮的div标签里加上如下CSS声明: ```css .container { width: 500px; height: 200px; display: flex; justify-content: flex-end; /* 将内部组件推至右边 */ border: 1px solid black; } ``` 这样就能确保无论屏幕宽度变化与否,这一系列按钮都会保持靠右排列的状态[^3]。 #### 解决不同浏览器间存在的差异问题 考虑到并非所有版本的Web浏览器都完全支持最新的标准特性,因此建议开发者们准备一套合理的降级策略来应对这种情况的发生。具体做法是在原有基础上增加额外的一套针对旧版环境优化过的样式表规则,并利用条件判断语句或是特定的选择器语法来进区分处理[^2]。 比如可以通过检测当前用户的设备信息并加载相应的资源文件,或者借助于现代前端框架所提供的工具函数自动完成这项工作。 #### 使用Grid替代传统方法构建响应式页面 虽然Flexbox非常适合用来解决某些类型的UI挑战,但在面对更为复杂的二维布局任务时可能会显得力不从心。这时就可以考虑采用另一种叫做CSS Grid Layout的技术手段作为补充方案之一[^5]。 它不仅继承和发展了许多来自前者的优势特点,而且还引入了一些全新的概念如网格线命名机制、重复单元格生成等功能模块,使得整个开发过程变得更加直观易懂的同时也极大地提高了工作效率。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值