Flexbox布局之对齐方式

189 阅读7分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

Flexbox布局中的对齐方式

在Flexbox中提供了多个用于对其Flex项目以及Flex项目之间分配空间的属性,这些属性可以分为两组:

空间分配属性和对齐属性。

用于设置flex容器空间分配的有:

justify-content: 沿Flex容器的主轴方向分配Flex容器的剩余部分

align-content: 沿Flex容器的侧轴方向分配Flex容器的剩余部分

place-content:它是justify-content和align-content的简写属性

用于设置flex容器对齐的属性有:

align-self: 沿Flex容器侧轴对齐单个Flex项目

align-items: 将所有Flex项目作为一个组,沿Flex侧轴对齐

在选择这些属性前,你需要知道:

1,对齐方向(Flex容器的主轴方向通常是水平方向,否则也是内联轴方向,侧轴通常是垂直方向,否则也是块轴方向)

2,布局要对齐什么(所有flex项目,单个flex项目或是flex项目之间的内容)

需要注意的就是flex容器的主轴和侧轴方向是可以改变的,flex容器上flex-direction,CSS的书写模式writing-mode属性,CSS阅读模式direction和HTML元素的dir属性都可以改变,另外,在Flexbox布局中是没有justify-self属性的

Flex项目彼此相邻,因为Flexbox是一个单维布局,所以Flex布局要么按行对齐,要么按列对齐(默认按行对齐),并且Flex项目换行之后,也是在自己所在行的主轴方向排列。

沿主轴分配空间

在没有设置任何对齐方式的情况下,flex项目在主轴上排成一行,并且如果所有flex项目的宽度小于flex容器的宽度,就会有一段剩余空间未填满,这是因为justify-content的初始值为flex-start,所有的flex项目都靠近主轴的起点位置。所以我们可以改变justify-content的值来改变对齐方式,即调整剩余空间的位置。

justify-content的取值有:

flex-start: 主轴起点对齐

flex-end:主轴终点对齐

center: 主轴居中对齐

在Flexbox布局中,我们也经常使用justify-content:center; 来实现水平居中的布局效果

space-around: 第一个flex项目与主轴起点的距离和最后一个flex项目与主轴末尾的距离相等,并且是其他fle项目之间距离的一半,当flex项目只有一个时,其效果与center相等

space-between: flex项目平均分配,所有flex项目之间距离相等,并且第一个和最后一个flex项目分别与主轴起点和终点吻合,flex项目只有一个时,其效果与flex-start等同

space-evenly: 第一个flex项目与主轴起点的距离和最后一个flex项目与主轴末尾的距离相等,并且等于其他flex项目之间的距离,当flex项目只有一个时,其效果与center相等

除了上述取值外,还可以用start(等同于flex-start),end(等同于flex-end),CSS的关键词inheritinitialrevertunset也可以用于justify-content的属性

如果flex容器没有额外的剩余空间,或者说剩余空间为负值时,justify-content的属性值会与上面有差异

  • flex-start 会让 Flex 项目在 Flex 容器主轴终点处溢出 ;
  • flex-end 会让 Flex 项目在 Flex 容器主轴起点处溢出;
  • center 会让 Flex 项目在 Flex 容器两端溢出;
  • space-betweenflex-start 相同;
  • space-aroundcenter 相同;
  • space-evenlycenter 相同;
  • startflex-start 相同;
  • endflex-end 相同。

上面这种是justify-content作用于行的效果,也就是flex-direction为row,那通过设置flex-direction的值为column时的效果来看,其实,不管flex-direction取值什么,justify-content属性只作用于Flex主轴上,只不过,当flex-direction取值为column时,需要给flex容器设置height或block-size,这样,才能让flex容器有一定的剩余空间,这是因为CSS在计算块容器(flex容器)高度时,默认以其内容或所有后代元素高度来计算

沿侧轴分配空间

沿侧轴分配空间,又可以看作是 Flexbox 布局中多行(或多列)的对齐方式

在Flex布局中,如果flex容器没有足够多的空间来容纳flex项目时,且flex容器上显式设置了flex-wrap的值为wrap(或wrap-reverse)时,flex项目就会换行

因为align-items属性的初始值为stretch,所有flex项目在侧轴上拉伸,flex项目高度填充了flex容器侧轴空间,并且每行的flex项目高度相等

image-20221209104344801

如果在flex项目上显式设置了高度 ,即使align-items的值为stretch,也不会拉伸flex项目,这时候,相邻两行之间就会有剩余空间

.container {
    display: flex;
    flex-wrap: wrap;
    width: 500px;
    height: 300px;
    border: 1px solid #c42b1c;
  }
  .item {
    width: 88px;
    height: 88px;
    border: 1px solid #259644;
  }

image-20221209104934661

这时如果想分配剩余空间,就可以使用align-content属性,align-content与justify-content相比多出了一个stretch值,他们的作用是相同的,不同的是align-content是设置侧轴方向的剩余空间

如果未设置flex项目的高度,那么改变align-content的值,flex项目的高度会作出改变,即是flex项目内容的最大高度

align-contents属性同样受flex-direction的影响,其基本和justify-content一样。

如果要在布局的时候,需要同时设置align-content和justify-content两个属性的话,也可以使用它们的简写place-content,比如:

.container {
  justify-content: center;
    align-content: center;
}
//等同于
.container {
 place-content:center;
}

place-content可以接受一个值,也可以接受两个值,一个值时,则表示这个属性是相同的值,两个值时,第一个值是align-content的值,第二个是justify-content的值

所以当我们在布局中,要构建一个水平垂直居中的效果就可以使用place-content: center;

需要注意的是,align-content只有当flex-wrap的值不为nowrap(即wrap或wrap-reverse)时才生效

沿侧轴对齐Flex项目

沿侧轴对齐 Flex 项目,指的是 Flex 容器中单行(或单例)以及单个 Flex 项目的对齐方式

在构建Web布局时,总有不需要断行的状态,此时,要控制flex项目在侧轴的对齐方向,就不能使用align-content属性,这时就可以使用align-items或align-self来控制整行flex项目,或单个flex项目在侧轴的对齐方式:

  • align-items 用于 Flex 容器上,控制 Flex 行(所有 Flex 项目所在行)在侧轴上对齐方式;
  • align-self 用于 Flex 项目上,控制单个 Flex 项目在侧轴上对齐方式。

Flexbox中的溢出对齐

在使用CSS构建Web页面时,容器会根据内容自动扩展到右侧或底部,当内容溢出时,容器会变为可滚动的,用户就可以滚动来查看不可见的内容,除非在容器上使用overflow: hidden,禁止容器因内容溢出而出现滚动条的行为。

但在Flexbox中却无法保证这一点,如果内容溢出,你就不能滚动到该区域。在这种情况下,就可以定义“安全对齐”。就是给对齐属性新增了safe和unsafe两个属性

“安全”对齐会在溢出情况下更改对齐模式,以避免数据丢失

  • safe关键字会将因为对齐方式导致溢出时,将设置的对齐模式切换到 start 对齐模式下,目的是避免“数据丢失”,其中部分项目超出对齐容器的边界并且无法滚动到。
  • unsafe,即使会导致此类数据丢失,也会遵守对齐方式。