Flexbox 是一个简洁的制作智能布局的现代语法。Flexbox 模块提供了一个有效的布局方式,即使不知道视窗大小或者未知元素情况之下都可以智能的,灵活的调整和分配元素和空间两者之间的关系。简单的理解,就是可以自动调整,计算元素在容器空间中的大小。
水平和垂直在 Flex 世界中不是什么方向(概念)。常常被称为 主轴(Main-Axis)和侧轴(Cross-Axis)。通俗的说,感觉 Main-Axis 就是水平方向,从左到右,这也是默认方向。Cross-Axis 是垂直方向,从上往下。
父元素显式设置了 display:flex(CSS)
flex-direction 属性控制 Flex 项目沿着主轴(Main Axis)的排列方向
将Flex容器设置适合大小以适合放置更多的列表项目或者说让类表项目换行排列。
flex-flow 是 flex-direction 和 flex-wrap 两个属性的速记属性。
ul {
flex-flow: row wrap;
}
定义了Flex项目在 Main-Axis 上的对齐方式,默认是flex-start
用来控制Flex项目在Cross-Axis对齐方式。默认值是stretch
align-content属性用于多行的Flex容器。用来控制Flex项目在Flex容器里的排列方式,排列效果和align-items值一样,但除了baseline属性值。默认值时 stretch
Flex容器内的子元素
允许Flex项目在一个Flex容器中重新排序。基本上,可以改变Flex项目的顺序,从一个位置移动到另一个地方。这不会影响源代码,这也意味着Flex项目的位置在HTML源代码中不需要改变。order属性的默认值是0。它可以接受一个正值,也可以接受一个负值。值得注意的是,Flex项目会根据order值重新排序。从底到高。
如果两个一下Flex项目有相同的order值时,Flex项目重新排序是基于HTML源文件的位置进行排序。
flex-grow 和 flex-shrink 属性控制Flex项目在容器有多余的空间如何放大(扩展),在没有额外空间又如何缩小。
它们可能接受0或者大于0的任何正数。
默认情况下,flex-grow属性值设置为0。表示Flex项目不会增长,填充Flex容器可用空间。取值为0就是一个开和关的按钮。设置1或2的伸展度不同
默认情况下,flex-shrink的值是1。
可以指定Flex项目的初始大小。也就是flex-grow和flex-shrink属性调整它的大小以适应flex容器之前。
flex-basis 默认的值是auto。flex-basis可以取任何用于width属性的任何值。
注意:如果flex-basis属性的值是0时,也需要使用单位。即flex-basis: 0px不能写成flex-basis: 0
默认情况,Flex项目的初始宽度有flex-basis的默认值决定,即:flex-basis: auto。Flex项目宽度的计算是基于内容的多少来自动计算
flex是 flex-grow、flex-shrink和 flex-basis三个属性的速记(简写)。注意顺序,缩写成GSB
align-self属性更进一步让我们更好地控制弹性项目
改变一个弹性项目沿着侧轴的位置,而不影响相邻的弹性项目
两者之间主要的区别在于间距及如何计算间距。
一个相对Flex项目内的间距是根据它的内容大小来计算的。而在绝对Flex项目中,只根据flex属性来计算,而不是内容。
绝对Flex项目的宽度只基于flex属性,而相对flex项目的宽度基于内容大小
当在一个Flex项目上使用自动外边距(margin:auto)时,justify-content 属性就不起作用了。
如果将 flex-direction 切换为 column,垂直方向变为 Main-Axis,影响 Main-Axis 的每一个属性现在回影响新Main-Axis
超出范围的视图虽然高度是对的,但不可滑动,所以如果内容超过一屏,滑动的话要加 UIScrollView
需要隐藏线条,或者让线条视图的 isIncludedInLayout 为 NO,不进行计算,会出现 frame 除数为负数的崩溃。
//更新后使用,不然默认使用缓存,不重新计算
descriptionLabel.yoga.markDirty()
scrollView.yoga.applyLayout(preservingOrigin: false)
