美文网首页
果冻公开课第十课:打破传统布局方式的flex(下)

果冻公开课第十课:打破传统布局方式的flex(下)

作者: 果冻公开课 | 来源:发表于2019-08-29 17:18 被阅读0次

    其实传统布局方式和人类书写是类似的

    “从上到下,从左到右,写不下就换行”

    但经过这些年的发展

    我们发现这样的方式虽然很好理解但不够灵活

    于是...

    动画视频:

    打破传统布局方式的flex(下)

    文字解析:

    其实传统布局方式和人类书写是类似的

    从上到下,从左到右,写不下就换行

    但经过这些年的发展

    我们发现这样的方式虽然很好理解但不够灵活

    所以有没有办法让布局既可以从下到上

    又可以从右到左呢

    答案是有人引入了轴的概念

    2维的物体可以有两条相互垂直的轴

    让布局的方向沿着主轴依次排列

    如果要换行则沿着交叉轴的方向换行

    flex-direction修改主轴方向

    可以有4种

    row row-reverse column和column-reverse

    再用flex-wrap修改交叉轴方向

    每种主轴可以对应2种方向

    wrap, wrap-reverse

    这样主轴和交叉轴的排列组合有4*2=8种

    对于经常写文档的朋友来说

    就好像这几个按钮

    左中右对齐 两端对齐 分散对齐

    应用在布局上也希望能实现这些对齐方式

    设置还要更多

    justify-content属性来控制

    flex-start flex-end center space-between space-around

    分别对应了左右中对齐

    两端对齐和分散对齐

    以及间距相等

    假设给每一行设置不同的justify-content属性值

    里面有三个子元素ABC

    看起来将是这样的

    如果这个缩小整个盒子的宽度

    那么它们则会这样在盒子里弹性伸缩

    你还记得flex轴线有一条主轴和一条交叉轴相互垂直吗

    justify-content指明了元素 在主轴上的对齐方式

    有人可能会猜测交叉轴上应该也有属性可以修改元素的对齐方式

    事实上确实如此

    当交叉轴上只有一行元素时

    可以使用align-items来控 制它们的对齐方式

    如果是多行元素

    想要控制多行元素相对于容器的对齐

    则可以用align-content来 控制它们的对齐方式

    当然还能把它们结合起来使用

    既让子元素整体在容器的交叉轴上居中

    又让子元素在它所在行的交叉轴上居中

    容器上的属性已经把布局完成得差不多了

    但还有一些细节需要具体到每一个flex子元素上

    其中最重要的一点是子元素的宽度

    如何让屏幕宽度高度变化时

    子元素最终展示的效果既不会超出屏幕有能正好撑满主轴

    这一要求在传统布局中其实是蛮难实现的

    可能要配合一些JS代码来对屏幕的变化做侦测

    做起来很复杂

    所以我们希望有一种更简单的方式来设置元素的宽度和伸缩度

    flex中的宽度写法是flex-basis

    伸缩是flex-growflex-shrink

    其中flex-grow是伸展

    flex-shrink是收缩

    flex-basis和传统width是有所不同的

    它用于计算元素的初始宽度

    也就是还没考虑伸缩之前的宽度

    flex-basis为auto时 初始宽度为元素内容大小或者设置的宽度

    flex-basis为像素值时 初始宽度为flex-basis的值

    flex-basis为百分比时 初始宽度为占父容器的比例

    flex-basis为0或0%时 初始宽度为0

    当它和width同时存在时

    优先级是大于width的

    但最后计算的尺寸依然会受限于min-width或是max-width

    比如 元素A的初始宽度设为100px

    但是它有个CSS属性min-width: 200px

    那么最后虽然初始宽度有flex-basis决定

    但展示宽度仍然为200px

    有了初始宽度后

    flex-grow和flex-shrink的值会对元素造成什么影响呢

    flex-grow属性中的grow是扩展的意思

    所扩展的就是flex子元素所占据的宽度

    扩展所侵占的空间就是元素外剩余的空白间隙

    假设所有的剩余空间总量是1

    我们就用flex-grow等于0-1来表示扩展的比例

    比如flex容器里有3个子元素

    现在给第2个子元素设置flex-grow属性值

    当它为0时不会有任何扩展看起来是这样

    当它改为0.5时 扩展的宽度是总剩余宽度的0.5也就是一般

    当它变为1时 所有空间都使用完

    flex-shrink属性中的shrink是收缩的意思

    也就是当flex容器空间不足的时候

    单个元素的收缩比例

    它的值也只能是0-1的数字

    0表示不收缩 1表示完全收缩

    这样说起来也许有点抽象不如举个例子

    这个flex容器中有3个子元素

    它们三个的初始宽度加起来大于父容器宽度会出现横向滚动条

    如果给3个元素都设置flex-shrink:1

    这3个子元素将1:1:1收缩

    如果第2个子元素单独设置flex-shrink:0

    则它不会收缩 剩下2个元素等比收缩。如果第2个子元素单独设置flex-shrink:2

    这3个子元素完全收缩尺寸比例分配为1:2:1

    其中第2个子元素收缩的宽度最大

    是其他元素的2倍

    所以还是很好理解的吧

    需要注意的是宽度的三个属性是可以简写成一个的

    也就是flex

    它的值分别对应flex-grow

    flex-shrinkflex-basis

    默认值是0 1 auto

    其中后两个是可选属性

    在理解了flex主要的概念后

    再来看两个例子

    一:水平和垂直方向同时居中

    二:三行三列布局

    我们基于这一段html代码

    让main元素的body元素中居中

    先给父元素body设置display: flex意味着开始使用flex布局

    再对容器设置主轴和交叉轴的居中对齐

    也就是justify-content: center和align-items: center

    这样无论main元素是否定宽高

    它都会完美居中在body这个容器当中

    三行三列布局

    我们基于这一段html代码

    由于flex的布局方向也就是主轴的方向

    默认是从左到右

    这里通过flex-direction属性改变为从上到下

    效果就是这样的

    第二步 实现从左到右的布局

    container既是body的子元素又是main,nav,aside的父容器

    所以把它设为flex容器主轴向就使用默认的从左到右

    然后给main和aside元素分别设置宽度

    中间的nav元素为flex:1

    会根据剩余宽度计算自动填满

    完成最终效果

    怎么样是不是很简单?

    赶紧上手写点代码练习一下吧~

    入QQ群:717415872     了解课程动态、幕后花絮,还有机会参与到课程制作,成为联合制作人哟,记得备注来自果冻课堂!

    更多内容,欢迎加大师姐微信:it_xzy

    相关文章

      网友评论

          本文标题:果冻公开课第十课:打破传统布局方式的flex(下)

          本文链接:https://www.haomeiwen.com/subject/iefwectx.html