CSS--flex布局--教程/详解

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

简介

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

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 来进行布局。

.container {
    display: flex | inline-flex;
}

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

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

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

1. flex-direction

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

flex-direction: row | row-reverse | column | column-reverse;

四个值分别代表:

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

效果分别对应如下:

2. flex-wrap

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

flex-wrap: nowrap | wrap-reverse | wrap;

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

3. flex-flow

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

4. justify-content

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

justify-content: flex-start | flex-end | center | space-between | space-around;

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

5. align-items

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

align-items: flex-start | flex-end | center | baseline | stretch;

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

6. align-content

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

1. order

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

order: <integer>;

2. flex-basis

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

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

flex-basis: <length> | auto; /* default auto */

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

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

flex-basis的取值:

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

3. flex-grow

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

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

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

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

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

4. flex-shrink

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

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

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

取值:

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

5. flex

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

flex: [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]

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

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

特殊的取值

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

  • flex 取值为两个非负数字
    • 分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%。如下两种写法是等同的:
      .item {flex: 2 3;}
      .item {
          flex-grow: 2;
          flex-shrink: 3;
          flex-basis: 0%;
      }

  • flex 取值为一个非负数字和一个长度或百分比
    • 分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1。如下两种写法是等同的:
      .item {flex: 11 32px;}
      .item {
          flex-grow: 11;
          flex-shrink: 1;
          flex-basis: 32px;
      }

6. align-self

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

align-self: auto | flex-start | flex-end | center | baseline | stretch;

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

典型使用场景

  1. 设置侧边栏固定:
    1. html {
          scroll-padding-top: 150px;
      }
      
      .sidebar,.sidebar_lefe {
          top: 1em;
      }
      

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值