0 0 votes
Article Rating

本文图片较多,如有不清楚的地方,可以点击原文链接查看高清大图。另,如有翻译不周之处,请指摘。

原文:

The Complete CSS Flex Box Tutorial

https://medium.com/@js_tut/the-complete-css-flex-box-tutorial-d17971950bdc​medium.com/@js_tut/the-complete-css-flex-box-tutorial-d17971950bdc

译文:

Flex 盒子与CSS 网格 (Grid)很相似,都十分复杂,这是因为它不止包含一种元素类型,而是两种:container 和 items。

CSS 视觉字典(译者注:原作者推荐的一本讲述CSS属性的付费书籍)

Contains visual diagrams for every single CSS property in common use.medium.com​medium.com/@js_tut/css-visual-dictionary-e53329daf93e

如果想更好地理解Flex的工作原理,可以在此页面上尝试flex 布局编辑器

当我刚开始学习Flex的时候,我想搞清楚它能做的所有事情,但却始终找不到一本能展示Flex所有属性事例的全面性教材。因此,我以鸟瞰 的方式,用Flex的方式画了以下图表。

Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style
Flex,FlexBox,CSS,Style

这就是Flex能做的所有事情。但是……还是让我们以评论的方式来逐一重温以上图表吧。在本课程结束时,相信你一定会对Flex所能做的事情了如指掌。

Flex

Flex是在父容器中自动伸展多行和多列内容的规则集。

display: flex

与其他CSS属性不同,在Flex布局中,存在一个主container,items嵌入其中。有些CSS Flex属性只作用于父container。有些则只作用于items。

Flex,FlexBox,CSS,Style

你可以把flex元素看作是带有display:flex属性的父container,而放置在这个container中的元素则叫做items。每个container均有 flex-start 和 flex-end点,如图所示。

主轴和交叉轴

尽管item都是以线性方式排列的,Flex还是要求你注意行和列。因此,Flex有两条坐标轴。水平轴指的是主轴,垂直轴指的是交叉轴。

在主轴上水平延伸的内容具有宽度和间隔,为了控制它们的显示行为,你将会使用到justify相关属性。为了控制item的垂直展示行为,你将会使用align相关属性。

如果你有3列6个item,那么在展示时,Flex将会自动创建第二行来容纳剩余的item。

如果你有多于6个item的展示列表,Flex则会创建更多的行。

Flex,FlexBox,CSS,Style
Flex item均匀分布在主轴上。稍后我们将看一下实现这样的效果所需要设置的属性值是什么
Flex,FlexBox,CSS,Style
你可以决定列的数量

行和列如何在父元素中分布是由:flex-direction 、flex-wrap 以及其他几种 Flex 属性决定的,这些属性都将在本教程的余下内容中有所涉及。

Flex,FlexBox,CSS,Style
这里是一个放置着任意数量item的container。默认情况下,item会由左至右延伸展示。然而,初始点可以进行倒置

Direction(方向)

可以通过倒置的方式来设置 item 流的方向。

Flex,FlexBox,CSS,Style
flex-direction:row-reverse 属性值会改变 item 列表流的方向。默认值是 row,表示 item 会如你所愿从左向右进行排列!

Wrap

Flex,FlexBox,CSS,Style
flex-wrap:wrap 属性值决定了当父container空间耗尽时,将如何包裹其中的 item

Flow

Flex,FlexBox,CSS,Style
flex-flow 属性是对 flex-direction 和 flex-wrap 属性的简便写法,它允许你在一个属性名称中表述上述两种属性值
Flex,FlexBox,CSS,Style
flex-flow: row wrap表示 flex-direction 的值是 row,而 flex-wrap 的值是wrap
Flex,FlexBox,CSS,Style
flex-flow: row wrap-reverse;
Flex,FlexBox,CSS,Style
flex-flow: row wrap; justify-content: space-between;
Flex,FlexBox,CSS,Style
flex-flow: row-reverse wrap;
Flex,FlexBox,CSS,Style
flex-flow: row-reverse wrap-reverse;
Flex,FlexBox,CSS,Style
flex-flow:row wrap; justify-content: space-between;
Flex,FlexBox,CSS,Style
方向可以改变,元素会在交叉轴上展示

当我们把 flex 的方向改为 column,flex-flow 属性会和前例中的表现一致。只是这一次,他们会沿着列中的垂直方向展示。

Flex,FlexBox,CSS,Style

justify-content

Flex,FlexBox,CSS,Style

很多读者要求我详细解释上面的例子。因此,我做了这个动画。动画中的原始片段来自于以上图表(译者注:这幅gif图的展示似乎有些问题,如欲查看更好的效果,请戳:https://medium.com/@js_tut/the-complete-css-flex-box-tutorial-d17971950bdc

动图封面
动起来的 justify-content!

希望此图可以为诸君拨开迷雾。

flex-direction:row; justify-content: flex-start |flex-end |center|space-between |space-around |stretch |space-evenly. 在这个例子中,我们只在每一行使用列3个item。

flex不会限制你放置item的数量。这些图表只表明了当 item 展示列表中的某一项设置了 justify-content 属性值时,该列表的展示行为。

Flex,FlexBox,CSS,Style

 flex-direction 属性值是column时,相同的 justify-content 属性还可以用来对齐item。

Flex,FlexBox,CSS,Style

Packing Flex Lines (根据 Flex 规范)

Flex,FlexBox,CSS,Style

Flex 规范将这叫做“packing flex lines”。基本上,它就是如上图中的例子那样生效的。只是这次,需要注意间隔是在不同项目集间出现的。如果你想在一批项目中创建间隔,这个特性会显得十分有效。

Flex,FlexBox,CSS,Style

Packing Flex Lines (继续)。现在,将 flex-direction 的值设置成了 column.

align-items

Flex,FlexBox,CSS,Style

align-items 属性以父container为基准,控制着水平方向上的 item 的垂直对齐情况。

flex-basis

Flex,FlexBox,CSS,Style

flex-basis 的工作原理类似于 Flex 外的另一个CSS属性:min-width。该属性将根据其内部内容来扩展item的尺寸。如果没有该属性,将会使用默认值。

flex-grow

Flex,FlexBox,CSS,Style

当一个 item 应用 flex-grow 属性时,该属性将会根据同一行中其余 item 的尺寸总和来对该 item 进行放大,调整会依据规定的属性值自动进行。在上图中的例子中,这些元素的 flex-grow 属性值分别被设置成了:1、7、3 和 5(最后一例中).

flex-shrink

Flex,FlexBox,CSS,Style

flex-shrink 和 flex-grow 相反。在上图的例子中,属性值“7”是用来“缩小”选中 item 的,表示该 item 的尺寸是周围 item 的1/7倍——调整也将自动进行。

Flex,FlexBox,CSS,Style

当处理独立的 item 时,你可以使用 flex 这个属性作为 flex-grow、flex-shrink 和 flex-basis 三个属性的简写。

order

使用 order 属性会对 item 的原始顺序进行重排。

Flex,FlexBox,CSS,Style

justify-items

Flex,FlexBox,CSS,Style

最后一点是和那些想把 CSS Grid 和Flex 盒子混用的人说的……CSS grid 的 justify-items和Flex的 justify-content 属性很类似(上面的图表中所描述的属性在Flex布局中不生效,但对于用 Grid 对齐内容来说却足够了)。


Chris

Chris

Just me, need more info?

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x