当前位置:网站首页 > 技术博客 > 正文

flex布局教程实例篇



原文网址:CSS--flex布局--教程/详解_IT利刃出鞘的博客-CSDN博客

本文详细介绍CSS的flex布局,包括:原理、属性。

简介

flexbox(Flexible Box)是一种一维的布局模型,它给 flexbox 的子元素提供了强大的空间分布和对齐能力。

flexbox 是一种一维的布局,因为一个 flexbox 一次只能处理一个维度上的元素布局(一行或者一列)。相对而言,Grid 布局是一个二维布局,可以同时处理行和列上的布局。

设置 flex 布局之后,子元素的 float、clear、vertical-align 的属性将会失效。

基本概念

flex布局,涉及到里外两层。外面一层叫做Flex容器(flex container),简称”容器”。容器里的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。

flex 容器中默认存在两条轴,水平主轴(main axis) 和垂直于它的交叉轴(cross axis)。(这是默认设置,可以设置使垂直方向变为主轴,水平方向变为交叉轴)。

每个flex项目占据的主轴空间为 (main size), 占据的交叉轴的空间为 (cross size)。

flex 布局需要先指定一个容器,任何一个容器都可以被指定为 flex 布局,这样容器内部的元素就可以使用 flex 来进行布局。

 

生成一个块状或行内的 flex 容器盒子。(如果使用块元素如 div,用 flex;如果使用行内元素,使用 inline-flex。)

有下面六种属性可以设置在容器上,它们分别是:

  1. flex-direction
  2. flex-wrap
  3. flex-flow
  4. justify-content
  5. align-items
  6. align-content

flex-direction:决定主轴的方向(即项目的排列方向)。

 

四个值分别代表:

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

效果分别对应如下:

flex-wrap:定义如果一条轴线排不下,如何换行。有三个属性值,默认情况下是wrap。

 

分别表示:不换行 | 反转换行 | 换行,效果分别如下:

flex-flow:flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。这里就不再具体测试。

justify-content:定义项目在主轴上(即相当于X轴)的对齐方式。一共有五个属性值:

 

分别表示:左对齐 | 右对齐 | 居中 | 两端对齐 | 每个项目两侧的间隔相等。以下是对应的效果:

align-items:定义项目在交叉轴上(即Y轴上)如何对齐。有五个属性值:

 

分表表示:上对齐 | 下对齐 | 居中对齐 | 项目的第一行文字的基线对齐 | 如果项目未设置高度或设为auto,将占满整个容器的高度(默认值)。下面是对应的效果图:

align-content:定义多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。该属性定义多跟轴线在Y轴上的对齐方式,与align-items有点类似。其有以下六个属性值:

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

上边介绍了容器的属性,本处介绍容器内部的项目的属性。外部的容器设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。

如果内部的项目不想受flex约束,可以设置position属性为absolute或者fixed。

flex项目有以下六个属性:

  1. order
  2. flex-basis
  3. flex-grow
  4. flex-shrink
  5. flex
  6. align-self

order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。有了这个属性,可以调整在HTML中出现的顺序。

 

flex-basis定义了项目占据的主轴空间(main size)(分配剩余空间之前)。浏览器根据这个属性,计算主轴是否有多余空间。

默认值:auto,即项目本来的大小(采用元素内容的尺寸)。所以:给Flex元素的父元素声明display: flex,所有子元素会排成一行,且自动分配小大以充分展示元素的内容。

 

当主轴为水平方向的时候,若设置了 flex-basis,项目的宽度设置值会失效。

flex-basis 需要跟 flex-grow 和 flex-shrink 配合使用才能发挥效果。

flex-basis的取值:

  • 0 %:会把该项目视为零尺寸。
  • auto:子项占用的宽度使用width 的宽度;若width也没设置,子项占用空间由内容决定。
  • 具体尺寸。比如:flex-basis: 100px; width: 70px。此时元素占用宽度为100px。

flex-grow属性用来“瓜分”父项的“剩余空间”。默认为0(即使存在剩余空间也不放大)。

flex-grow在 flex 容器下的子元素的宽度和比容器和小的时候起作用。

flex-grow定义了子元素的尺寸增长因子,父容器被子项的flex-basis占用后,剩下的尺寸会按照各个子元素的 flex-grow值进行加大到各个子元素上。

 
  • 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间。
  • 如果A项 flex-grow 为 1,B项为 2,则后者占据的剩余空间比前者多一倍。如下图所示

  • 如果所有项目以 flex-basis 的值排列完后发现空间不够了,且 flex-wrap:nowrap 时,此时 flex-grow 不起作用了,这时候就需要接下来的这个属性。

flex-shrink属性用来“吸收”超出的空间。默认为1。

flex-shrink在子元素宽度比父元素宽度大的时候起作用。

flex-shrink定义了子元素的尺寸缩小因子,子元素总尺寸减去父元素尺寸得到的尺寸会按照各个子元素的 flex-shrink值进行平分缩小到各个子元素上。

取值:

  • 1:如果空间不足,该项目将缩小。
  • 0:如果空间不足,该项目不缩小。
  • 负值:无效。
 
  • 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。
  • 如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

 

该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。

建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

特殊的取值

  • flex 取值为一个非负数字
    • 此时则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下两种写法是等同的:
       
  • flex 取值为 0 时
    • 对应的三个值分别为 0 1 0%。如下两种写法是等同的:
       
  •  flex 取值为一个长度或百分比
    • 视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字)。如下两组都是等同的:
       
       
  • flex 取值为两个非负数字
    • 分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%。如下两种写法是等同的:
       
  • flex 取值为一个非负数字和一个长度或百分比
    • 分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1。如下两种写法是等同的:
       

align-self:允许单个项目有与其他项目不一样的对齐方式,会覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

 

上面六个取值中,除了auto,其他值与align-items属性完全一致。

典型使用场景

  1. 设置侧边栏固定:
    1.  

30 分钟学会 Flex 布局 - 知乎

Flex使用详解 - 简书

        

  • 上一篇: opencv copymakeborder
  • 下一篇: bind9是什么
  • 版权声明


    相关文章:

  • opencv copymakeborder2025-02-28 12:30:00
  • 应用层的十一个协议2025-02-28 12:30:00
  • shell获取上一条命令执行结果2025-02-28 12:30:00
  • 生成树协议百科2025-02-28 12:30:00
  • oracle rownum=1什么意思2025-02-28 12:30:00
  • bind9是什么2025-02-28 12:30:00
  • linux v4l2驱动框架2025-02-28 12:30:00
  • 服务器的硬件配置2025-02-28 12:30:00
  • flask 工作流引擎2025-02-28 12:30:00
  • sql触发器的使用及语法2025-02-28 12:30:00