CSS3之弹性盒子(Flex Box)

Posted IT大亨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSS3之弹性盒子(Flex Box)相关的知识,希望对你有一定的参考价值。

     


        css3 弹性盒子(Flex Box)


        Flex Box是 css3 的一种新的布局方式。

 

        css3 弹性盒( Flexible Box&flexbox),简单来说,就是当你不知道别的屏幕大小的情况下,可以灵活的调整元素与页面空间的关系,自动调整大小,计算元素在容器空间的大小。


        举一个例子,这样就好说了,在之前的时候,我们是这样做的,用div水平垂直居中。在知道对象高宽的情况下,对居中元素进行绝对定位,在通过margin的移动来实现。


         eg:

         <head>

         <style>

         .big{

         width: 800px;

         height: 600px;

         border: 2px solid #000;

         position: relative;

         }

        .box{

         width: 300px;

         height: 200px;

         border: 1px solid #000;

         position: absolute;

         left: 50%;

         top: 50%;

         margin-left: -50px;

         margin-top:-50px;

         }

         </style>

         </head>

         <body>

         <div class="big">

         <div class="box"></div>

         </div>

         </body>


        但是我们如果用了flex之后,实现起来就更方便了,不用绝对定位,也不需要自己去算位置,只要通过对Flexbox定义两个属性,justify-content定义伸缩项目沿着主轴线的对齐方式为center, align-items定义伸缩项目在侧轴(垂直于主轴)的对齐方式为center,如下:


            <head>

    <style>

    .big{

   width: 800px;

   height: 500px;

   background: red;

   border: 1px solid #09c;

   display: flex;

   justify-content:center;

   align-items:center;

    }

    .box{

   width: 300px;  

   height: 150px; 

   background: yellow;

   border: 1px solid #0f0;

    }

    </style>

    </head>

    <body>

    <div class="big">

        <div class="box"></div>

    </div>

    </body>


             弹性盒布局模型


             下图:


CSS3之弹性盒子(Flex Box)



        css3 弹性盒子内容


        Flexbox包括弹性容器(Flex container)和弹性子元素(Flex item)两部分,弹性容器通过 display 属性的 flex 或 inline-flex将它们叫做弹性容器。而弹性容器不仅仅可以放一个弹性子元素,也可以放多个弹性子元素。


       我们也可以修改排列方式,如果设置 direction 属性为 rtl (right-to-left),它的排列方式也会改变,页面布局也会跟着改变:


      eg:

      body {

      direction: rtl; /* rtl=right-to-left,由右向左排*/

      }


       弹性容器(Flex container)


       flex-direction属性


       flex-direction:指定弹性子元素在父容器中的位置。


        语法

        flex-direction: row 

        flex-direction: row-reverse

        flex-direction: column

        flex-direction: column-reverse


        详细的值,如下:

        flex-direction: row   (横向从左到右排列(左对齐),是默认的方式) 

        flex-direction: row-reverse(倒着排,横向排列(右对齐,从后往前排,最后 一项排在最前面,相当于ul右浮)

        flex-direction: column (纵向排列)

        flex-direction: column-reverse (倒着排,纵向排列,从后往前排,最后一项排在最上面)


        justify-content 属性


        justify-content:内容对齐(justify-content)属性应用在弹性容器上,把弹性项沿着弹性容器的主轴线(main axis)对齐。


         justify-content 语法:

         justify-content: flex-start

         justify-content:flex-end

         justify-content:center

         justify-content:space-between

         justify-content:space-around


         详细的值,如下:

         justify-content: flex-start:弹性项目向行头紧挨着填充。这个是默认值。第一个弹性项的main-start外边距边线被放置在该行的main-start边线,而后续弹性项依次平齐摆放。

         justify-content:flex-end:弹性项目向行尾紧挨着填充。第一个弹性项的main-end外边距边线被放置在该行的main-end边线,而后续弹性项依次平齐摆放。

        justify-content:center:弹性项目居中紧挨着填充。(如果剩余的自由空间是负的,则弹性项目将在两个方向上同时溢出)。

        justify-content:space-between:弹性项目平均分布在该行上。如果剩余空间为负或者只有一个弹性项,则该值等同于flex-start。否则,第1个弹性项的外边距和行的main-start边线对齐,而最后1个弹性项的外边距和行的main-end边线对齐,然后剩余的弹性项分布在该行上,相邻项目的间隔相等。

        justify-content:space-around:

弹性项目平均分布在该行上,两边留有一半的间隔空间。如果剩余空间为负或者只有一个弹性项,则该值等同于center。否则,弹性项目沿该行分布,且彼此间隔相等(比如是20px),同时首尾两边和弹性容器之间留有一半的间隔(1/2*20px=10px)


         如图,以下效果:


         

       align-items 属性


       align-items:设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式。


       语法

       align-items: flex-start

       align-items:flex-end 

       align-items:center 

       align-items:baseline

       align-items:stretch


        详细的值,如下:

        align-items: flex-start:弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。

        align-items:flex-end :弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。

        align-items:center:弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。

        align-items:baseline:如弹性盒子元素的行内轴与侧轴为同一条,则该值与'flex-start'等效。其它情况下,该值将参与基线对齐。

         align-items:stretch:如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。


         flex-wrap 属性


         flex-wrap属性用于指定弹性盒子的子元素换行方式。


         语法

         flex-flow: nowrap

         flex-flow:wrap

         flex-flow:wrap-reverse

         flex-flow:initial

         flex-flow:inherit


         详细的值,如下:

         flex-flow: nowrap 默认,弹性容器为单行。该情况下弹性子项可能会溢出容器。

         flex-flow:wrap 弹性容器为多行。该情况下弹性子项溢出的部分会被放置到新行,子项内部会发生断行。

         flex-flow:wrap-reverse 反转 wrap 排列。


        align-content 属性


        align-content属性用于修改 flex-wrap 属性的行为。类似于 align-items, 但它不是设置弹性子元素的对齐,而是设置各个行的对齐。


        语法

        align-content: flex-start 

        align-content:flex-end

        align-content:center

        align-content:space-between

        align-content:space-around

        align-content:stretch


        详细的值,如下:

        align-content:stretch 默认。各行将会伸展以占用剩余的空间。

        align-content: flex-start 各行向弹性盒容器的起始位置堆叠。

        align-content:flex-end 各行向弹性盒容器的结束位置堆叠。

        align-content:center各行向弹性盒容器的中间位置堆叠。

        align-content:space-between各行在弹性盒容器中平均分布。

        align-content:space-around 各行在弹性盒容器中平均分布,两端保留子元素与子元素之间间距大小的一半。


       弹性子元素属性


       排序


      order


       语法

       order: -1;/*可以是负值,<number>*/


       详细的值,如下:

       <integer>:用整数值来定义排列顺序,数值小的排在前面。可以为负值。


       align-self


       align-self属性用于设置弹性元素自身在侧轴(纵轴)方向上的对齐方式。


       语法

       align-self: auto 

       align-self:flex-start

       align-self:flex-end 

       align-self:center

       align-self:baseline

       align-self:stretch


       详细的值,如下:

       align-self: auto 如果'align-self'的值为'auto',则其计算值为元素的父元素的'align-items'值,如果其没有父元素,则计算值为'stretch'。

        align-self:flex-start弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。

        align-self:flex-end 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。

        align-self:center弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。

        align-self:baseline 如弹性盒子元素的行内轴与侧轴为同一条,则该值与'flex-start'等效。其它情况下,该值将参与基线对齐。

        align-self:stretch 如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。


        对齐


        设置"margin"值为"auto"值,自动获取弹性容器中剩余的空间。所以设置垂直方向margin值为"auto",可以使弹性子元素在弹性容器的两上轴方向都完全集中。


        完美的居中


        使用弹性盒子,居中变的很简单,只想要设置 margin: auto; 可以使得弹性子元素在两上轴方向上完全居中。


        flex


        flex属性用于指定弹性子元素如何分配空间。


        语法

        flex:none  | [ 'flex-grow' ] ? [ 'flex-shrink' ] || [ 'flex-basis' ]

        flex: flex-grow <number> //default:0

        flex: flex-shrink <number> //default:1

        flex: flex-basis <length>  ||auto //default:auto


        详细的值,如下:

        flex:none  关键字的计算值为: 0 0 auto

        flex: flex-grow 定义弹性盒子元素的扩展比率。

        flex: flex-shrink 定义弹性盒子元素的收缩比率。

        flex: flex-basis 定义弹性盒子元素的默认基准值。



       讲了这么多弹性盒子的使用,那来看看flexbox布局的兼容性。


      其实在PC端其实很乐观了,基本上主流的浏览器都已经兼容了flex的使用,但是到了苹果的浏览器,就不会显示的那么好了,假如想兼容多个浏览器,可以采用优雅降级的方式来使用。



本文的大多数内容来自w3c,但也有自己原创的内容,更多详情在:https://www.w3cschool.cn/css3/2h6g5xoy.html



以上是关于CSS3之弹性盒子(Flex Box)的主要内容,如果未能解决你的问题,请参考以下文章

css3系列之弹性盒子 flex

CSS3总结五:弹性盒子(flex)弹性盒子布局

CSS3--Flex弹性盒子布局: 声明弹性盒子 & 容器的属性

[ css 弹性盒子模型 box-flex 及相关属性 ] box-flex属性弹性盒子模型讲解及实例演示

CSS3弹性盒子布局(display:flex)

CSS3--Flex弹性盒子布局:使用弹性盒子模型布局微信客户端