📕 flex 容器:flex-direction

在 flex 弹性布局的时候,我们可能会对 flex 元素的排列位置有要求,比如从左到右,从下到上这类非常规的布局方向需求,那么 flex-direction 就能够很容易帮助我们实现。前面提到的“主轴”和“交叉轴”,以及提到“起始线”和“终止线”的时候,flex-direction 在这几个的变化中起到决定性的作用。

简单来说,flex-direction 属性将会定义 flex 弹性布局中“主轴”的方向,从而影响着 flex 元素如何在 flex 容器内的布局。其主要的属性值有:

  • row
  • row-reverse
  • column
  • column-reverse

四个值改变着“主轴”的位置,也同时改变着“起始线”的位置,最终影响着 flex 元素的布局结果。

row 与 row-reverse

row 顾名思义,就是“行”。一行两行的行,那也就代表着当使用 flex-direction: row; 的时候,flex 元素的将一行排列方式展示。因为 rowflex-direction 的默认值,所以,在前面我们所看的 demo 的初始效果就是了。

row
/* 
  file: flex_0005.css
  flex-direction: row 时 flex 元素的排列效果
*/
.demo {
  flex-direction: row;
}

同时,这个时候我们需要知道“主轴”和“起始线”的位置。在前面我们已经提到过,“主轴”的方向,“起始线”的位置是与 flex-direction 的值息息相关的。那么这个时候我们所能得到的结果其实就是这样:

所以当我们选择使用 row-reverse 方向的行时,得到的结果就是:

/* 
  file: flex_0006.css
  flex-direction: row-reverse 时 flex 元素的排列效果
*/
.demo {
  flex-direction: row-reverse;
}

很明显可以看到 flex 元素的位置发生了变化,都反过来了,第一个元素显示在 flex 容器的最右侧。那么这个时候的“主轴”和“起始线”会是什么位置呢?还是跟 flex-direction: row; 的结果一样吗?答案很显然,rowrow-reverse 是相反的一个操作,所以,此时的“主轴”和“起始线”就是这样了:

rowrow-reverse 对于“主轴”而言,其实就是行,也就是说,当使用的是 row 时,X 坐标的轴线就是“主轴”,相对的,“交叉轴”一直都是以 Y 坐标的形式存在着。而 reverse 的出现则是影响了“起始线”与“终止线”的位置,如果仅仅只是 row 的话,“起始线”的位置就是当前语言环境下的阅读顺序,反之,使用了 row-reverse 就会得到相反的结果。

这里提到当前语言环境下的阅读顺序,一般我们的阅读浏览顺序是从左往右,从上到下。假如我们人为修改这个顺序方向,那么对于“起始线”和“终止线”是否会有影响呢?

/* 
  file: flex_0007.css
  修改 direction 的值,改变阅读顺序
*/
.demo {
  flex-direction: row;
  direction: rtl;
}

当我们在 flex-direction: row; 的情况下通过 direction 改变了方向之后,得到的结果就跟我们使用 flex-direction: row-reverse; 是一样的。所以,flex 布局中的“起始线”还跟 direction 的值是有关系的,并不仅仅只是看 flex-direction 的值。

column 与 column-reverse

了解了 row 之后,我们再看看 columnrow 指的是行,那么 column 指的肯定就是列了。所以,当我们想要得到这样的一个页面布局效果时,只要改变 flex-direction 的值就可以了。

/* 
  file: flex_0008.css
  flex-direction: column; 时的页面布局效果。
*/
.demo {
  flex-direction: column;
}

页面截图来看,现在 flex 元素是从上至下的排列,一个 flex 元素占据一行。从这里我们也就可以发现,“主轴”发生了变化,而且“起始线”与“终止线”也变了。

同理,当我们使用 flex-direction: column-reverse; 时,得到的 flex 布局结果就是反了个方向的。

/* 
  file: flex_0009.css
  flex-direction: column-reverse; 时的页面布局效果。
*/
.demo {
  flex-direction: column-reverse;
}

一个元素的高度并不想宽度一样会自动撑满屏幕,所以,在默认情况下,当我们使用 row-reverse 属性值时,flex 元素会从浏览器边缘部分开始;而当我们使用 column-reverse 时,并不是从浏览器的最底下开始,除非当前的 flex 容器高度与浏览器可视区相同高度。简而言之,column-reverse 是从 flex 容器的底部开始向上排列,是的,就是从下往上的一个布局。

因此,当使用 column-reverse 时的“主轴”与“起始线”等情况就是这样了:

flex-direction 的值是 column 或者 column-reverse 时,direction 属性就不再会影响 flex 元素的排列了,而只是让改变了 flex 元素中文字的显示方向

/* 
  file: flex_0010.css
  flex-direction: column; 时,添加 direction: rtl; 的页面效果。
*/
.demo {
  flex-direction: column;
  direction: rtl;
}

属性之间……

在 CSS 的世界中,每个属性都有各自的作用,而多个属性结合的时候,得到的结果可能是想冲突的,就好比 flex-direction: row;direction: rlt; 共存时;而有的时候却并不会,就像 flex-direction: column;direction: rtl; 共存时。

但这些只是表面现象而已,只要我们明白了 flex-directiondirection 这两个 direction 所影响的元素是哪些,那么也就能明白如何利用好这两个属性了。在众多的 CSS 属性中,影响页面阅读方向、元素排列方向的并不只是这么两个带有 direction 单词的元素,这里就不再继续展开,在后续的章节中会通过相关的 demo 与大家一起共同了解。

通过这章节我们主要了解的是 flex-direction 属性,对于该属性,我们需要了解当使用不同的属性值时,对于 flex 布局中的“主轴”、“起始线”等特性是会产生变化的。而“主轴”与“起始线”的变化,最终将会影响到 flex 元素的排列对齐方式,也就是后面我们会介绍的几个有关 flex 元素对齐的属性。

  • x 坐标轴是“主轴”,flex-direction 的值是 row 相关的;反之就是 column
  • 第一个 flex 元素哪边靠 flex 容器边缘,哪边就有可能是“起始线”,具体在哪边,还要看“主轴”;