📕 flex 元素:align-self

在前面 flex 容器部分中,我们了解了一遍有关 align-items 的属性,这个属性的主要作用是控制所有的 flex 元素在“交叉轴”方向的对齐方式。注意哦,是控制该 flex 容器中所有的 flex 元素的对齐方式。这里强调了“所有”这两个字,也就说明我们是可以对每个 flex 元素设置不同的对齐方式,同样也是基于“交叉轴”方向的。

如上图所示,我们将第一个 item 的位置往下挪了点,准确地说应该是,我们将这个 item 元素设置为底部对齐了。

/* 
  file: flex_0050.css
  基于 demo_26 中描述 align-items: flex-start; 效果的前提下
  对 .item_1 使用 align-self 的效果。
*/
......
/* 对 .item_1 增加 align-self: flex-end; 的样式 */
.item_1 {
  align-self: flex-end;
}

这个 demo 是基于 demo_0026 做的修改,将 .item_1 的对齐方式修改为底部对齐。

属性介绍

align-self 的属性值与 align-items 几乎是一样的,仅仅只是多了一个 auto 属性值而已。

  • auto
  • flex-end
  • flex-start
  • center
  • baseline
  • stretch
  • normal

如已经了解 align-items 属性的话,那么对于 align-self 的理解就简单很多的,这里也就不打算再详细得重复描述每个属性值。若有不清楚的可以查看 align-items 的属性介绍。

auto

autoalign-self 的默认值,主要的作用是让当前 flex 元素的对齐方式参照 flex 容器所设置的 align-items

flex-end

将当前 flex 元素相对于“交叉轴”的底部进行对齐,效果如本章前面的那张截图。

flex-start

将当前 flex 元素相对于“交叉轴”的顶部对齐。

center

将当前 flex 元素相对于“交叉轴”的中间部分对齐,也就是相对于“交叉轴”垂直居中对齐该 flex 元素。

baseline

baseline 还是文本的基线对齐方式,所以,当我们如果每个 item 的文字大小不一样的话,可能就会得到这样的一个效果。

在这个截图中我们可以看到第一行元素的文字大小都是不同的,也就导致了元素的排列高低错落。在错落的排列中,我们可以发现文字的对齐方式还是很统一的:以最大的文本基线为基准来对齐所有的元素。

而在截图的第二行中,由于文字大小都是一致的,所以,看到的对齐方式就很平整了。

/*
  file: flex_0051.css
  align-self: baseline; 时,不同文字大小的效果;
*/
.demo {
  flex-wrap: wrap;
  align-items: flex-start;
  height: 200px;
  /* 在这里给 flex 容器设置了高度 */
  border: 1px solid #000;
}
.item {
  width: 60px;
  /* 将所有的 item 元素对齐方式设置为 baseline */
  align-self: baseline;
}
/* 设置不同的 font-size 来观察元素的对齐变化 */
.item_1 {
  font-size: 30px;
}
.item_2 {
  font-size: 60px;
}
.item_4 {
  font-size: 20px;
}
.item_5 {
  font-size: 10px;
}

(🤔)按照上面的这个 demo,如果我们在 .item_2 {} 中修改 align-self 的对齐方式,比如 flex-start 的话,会是怎么样呢?

/*
  file: flex_0052.css
  基于 demo_51 将 item_2 的 align-self 对齐方式修改
*/
......
.item_2 {
  /* 修改 item_2 元素的 align-self 为 flex-start */
  align-self: flex-start;
  font-size: 60px;
}
......

这时我们可以看到有两个元素是顶着 flex 容器边缘的。首先,item_2 必定是顶着边缘的,因为 align-self 的值是 flex-start,那么 item_1 顶着边缘是为什么呢?最简单的理解方式呢,我们只要把所有的文字大小属性去掉,就会发现每个元素都是顶边的。

那么 item_1 目前是 baseline 对齐方式中,文字最大的一个,所以,必然是顶边了。而 item_3item_4item_5 这三个元素呢,都要相对于 item_1 的基线来对齐。在这个 baseline 对齐的队伍中,唯有 item_2 是不同的。

stretch / normal

strech 属性值的作用是相对于“交叉轴”的位置,将元素自身拉伸至撑满。而 normal 在 flex 弹性布局中,效果几乎等同于 stretch

小结

align-self 可以视为 align-items 的“衍生”版,是为了让我们能够更好地控制每个 flex 元素而存在的,因此在默认值为 auto 的基础上,还存在着与 align-items 相同的属性值。如果当心记不住的话,可以想一下 self 是 flex 元素自身,而 items 是 flex 容器下的所有 item。

(🤔)那么如果我们要做一个上图这样的效果,应该怎么做呢?