📕 实例:导航条

看到这个导航条,可能有人会疑惑,导航条不就是一行中每个元素肩并肩排好队伍就可以了,有什么好讲的呢。的确,按照常规的方式,导航条无非大概就是下面这张图的样子。

那如果我们稍微有点变化,希望后面两个 item 元素是居右显示的,而前面 8 个 item 是居左显示的,就像这样:

那么这个时候我们应该怎么办呢?

或许有人会说,可以使用选择符,让第 9 个 item 与第 8 个 item 之间增加间距,使用 margin 隔开来不就好了么。虽然这是一个办法,但并不灵活,因为你不知道这两个 item 之间的间距有多少,

/*
  file: flex_0071.css
  常规导航条的样式
*/
.demo {
  border-bottom: 1px solid #000;
}
.item {
  flex: 0 50px;
  text-align: center;
}

这是常规,假设每个 item 的宽度初始固定是 50px,且不会放大的一个布局效果。那么按照前面的假设,要实现第 9 个 item 开始是居右显示的话,使用 margin 来的确是一个方式,但不能使用具体的值,那么如果使用百分比会如何呢?

先不说具体要用多少的百分比值,如果像这样使用 20% 的值,会怎么样呢?

.item_9 {
  margin-left: 20%;
}

显然,现在看着是不够的,右边还有空缺。但,如果我们把浏览器的窗口缩小的话……

看着是“完美”了,满足了需求。不过这只是一个假象而已,仅仅只是因为在 20% 这个值的基础上,刚好得到了满足。

要不使用绝对定位的方式来处理?用 position: absolute; 的话,的确可以将某个元素定位到最后,但仅仅只是某个元素而已,如果是多个元素的话,那么怎么分配定位后的 left 或者 right 呢?

其实呢,我们还是可以继续在 margin 这个属性上去考虑。可以想一想,曾经我们想让一个块级元素水平居中显示的话,是怎么做的呢?是不是这样:

div {
  width: 100px;
  margin: 0 auto;
}

是利用了 margin-leftmargin-right 的值 auto,让一个块级元素由浏览器去计算左右间距的距离,具体的值让浏览器来计算来分配。所以,在这里其实我们也是可以这么操作,让第 9 个 item 的左间距为 auto,由浏览器来分配剩余的空间。

.item_9 {
  margin-left: auto;
}

那么这个时候,当我们对浏览器进行缩放,会发现第 8 和第 9 个 item 之间的距离会不断地在改变,而当浏览器足够小,他们之间的无法产生距离的时候,就贴合在一起了。

使用 margin-left 是让 8 和 9 之间有间距,那么同时我们给 .item_9 加上 margin-right: auto; 是不是就让 9 和 0 这两个 item 之间也有间距了呢?具体间隔值是不是还是由浏览器来分配,就像 margin: 0 auto; 一样,让一个元素居中。

嗯,如果我们这个时候给 .item_9 加上 margin-right: auto; 不就是 margin: 0 auto; 的感觉了么,那是不是说这第 9 个 item 会居中呢?

如果会居中,那么是相对于浏览器呢,还是说在 .item_8.item_0 之间去均分空间?

.item_9 {
  margin-left: auto;
  margin-right: auto;
}

当这样的时候,我们得到的结果就是:

所以,当 flex 元素中对于 margin 使用 auto 这个属性值的时候,就让其余相邻的 flex 元素产生间距,且间距值将会有 flex 容器的大小而决定。