多列布局和弹性盒模型详解

多列布局

相关属性

  • columns
    • 设置或检索对象的列数和每列的宽度。复合属性
  • column-width
    • 每列的宽度
  • column-count
    • 的列数
  • column-gap
    • 列间隙
  • column-rule
    • 列之间的边框线
  • columu-rule-color
    • 设置或检索对象的列与列之间的边框颜色
  • column-rule-width
  • column-rule-style
    • 设置或检索对象的列与列之间的边框样式
    • 值:dotted...
  • column-fill
    • 设置或检索对象所有列的高度是否统一。
    • 值 auto 列高度自适应内容
    • balance 所有列的高度以其中最高的一列统一。
  • column-span
    • 设置或检索对象元素是否横跨所有列。
    • none 不垮列
    • all 横跨所有列
  • column-break-before (适用于块级元素)
    • 设置项目前面是否断行

    • auto 既不强迫也不禁止在元素之前断行并产生新列 (默认)

    • always 总是在元素之前断行并产生新列

    • avoid 避免在元素之前断行并产生新列

  • column-break-after (适用于块级元素)
    • 设置项目后面是否断行
    • auto 既不强迫也不禁止在元素之后断行并产生新列 (默认)
    • always 总是在元素之后断行并产生新列
    • avoid 避免在元素之后断行并产生新列
  • column-break-inside (适用于块级元素)
    • 设置项目内部是否断行

    • auto 既不强迫也不禁止在元素内部断行并产生新列 (默认)

    • avoid 避免在元素内部断行并产生新列

伸缩盒(弹性盒模型)

概念

相关属性

把元素设置为伸缩容器

	display:flex
	display:inline-flex

设置伸缩流方向(主轴)

  • flex-direction
    • 值row 从左到右排列(左对齐)
    • column 从上往下排列(顶对齐)
    • row-reverse 对齐方式与row相反
    • column-reverse 对齐方式与column相反

设置换行(侧轴)

  • flex-wrap

    • 值 nowrap(默认)。flex容器为单行。该情况下flex子项可能会溢出容器。
    • wrap: flex容器为多行。该情况下flex子项溢出的部分会被放置到新行,子项内部会发生断行
    • wrap-reverse: 反转 wrap 排列。
  • 伸缩流方向和换行的符合属性
    flex-flow 为
    flex-direction 和 flex-wrap 的复合属性

主轴方向对齐

  • jusitify-content
    • flex-start: 弹性盒子元素将向行起始位置对齐。该行的第一个子元素的主起始位置的边界将与该行的主起始位置的边界对齐,同时所有后续的伸缩盒项目与其前一个项目对齐。
    • flex-end: 弹性盒子元素将向行结束位置对齐。该行的第一个子元素的主结束位置的边界将与该行的主结束位置的边界对齐,同时所有后续的伸缩盒项目与其前一个项目对齐。
    • center: 弹性盒子元素将向行中间位置对齐。该行的子元素将相互对齐并在行中居中对齐,同时第一个元素与行的主起始位置的边距等同与最后一个元素与行的主结束位置的边距(如果剩余空间是负数,则保持两端相等长度的溢出)。
    • space-between: 弹性盒子元素会平均地分布在行里。如果最左边的剩余空间是负数,或该行只有一个子元素,则该值等效于'flex-start'。在其它情况下,第一个元素的边界与行的主起始位置的边界对齐,同时最后一个元素的边界与行的主结束位置的边距对齐,而剩余的伸缩盒项目则平均分布,并确保两两之间的空白空间相等。
    • space-around: 弹性盒子元素会平均地分布在行里,两端保留子元素与子元素之间间距大小的一半。如果最左边的剩余空间是负数,或该行只有一个伸缩盒项目,则该值等效于'center'。在其它情况下,伸缩盒项目则平均分布,并确保两两之间的空白空间相等,同时第一个元素前的空间以及最后一个元素后的空间为其他空白空间的一半。

侧轴方向对齐 (强)

  • 当伸缩容器的侧轴还有多余空间时,本属性可以用来调准「伸缩行」在伸缩容器里的对齐方式,这与调准伸缩项目在主轴上对齐方式的 <' justify-content '> 属性类似。请注意本属性在只有一行的伸缩容器上没有效果。

    • flex-start: 各行向弹性盒容器的起始位置堆叠。弹性盒容器中第一行的侧轴起始边界紧靠住该弹性盒容器的侧轴起始边界,之后的每一行都紧靠住前面一行。

    • flex-end: 各行向弹性盒容器的结束位置堆叠。弹性盒容器中最后一行的侧轴起结束界紧靠住该弹性盒容器的侧轴结束边界,之后的每一行都紧靠住前面一行。

    • center: 各行向弹性盒容器的中间位置堆叠。各行两两紧靠住同时在弹性盒容器中居中对齐,保持弹性盒容器的侧轴起始内容边界和第一行之间的距离与该容器的侧轴结束内容边界与第最后一行之间的距离相等。(如果剩下的空间是负数,则各行会向两个方向溢出的相等距离。)

    • space-between: 各行在弹性盒容器中平均分布。如果剩余的空间是负数或弹性盒容器中只有一行,该值等效于'flex-start'。在其它情况下,第一行的侧轴起始边界紧靠住弹性盒容器的侧轴起始内容边界,最后一行的侧轴结束边界紧靠住弹性盒容器的侧轴结束内容边界,剩余的行则按一定方式在弹性盒窗口中排列,以保持两两之间的空间相等。

    • space-around: 各行在弹性盒容器中平均分布,两端保留子元素与子元素之间间距大小的一半。如果剩余的空间是负数或弹性盒容器中只有一行,该值等效于'center'。在其它情况下,各行会按一定方式在弹性盒容器中排列,以保持两两之间的空间相等,同时第一行前面及最后一行后面的空间是其他空间的一半。

    • stretch: 各行将会伸展以占用剩余的空间。如果剩余的空间是负数,该值等效于'flex-start'。在其它情况下,剩余空间被所有行平分,以扩大它们的侧轴尺寸。

      align-content: strecth/flex-start/flext-end/center/space-between/space-around

  • 侧轴方向对齐 (弱)

    • align-items取值:

      • flex-start: 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。
      • flex-end: 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。
      • center: 弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。
      • baseline: 如弹性盒子元素的行内轴与侧轴为同一条,则该值与'flex-start'等效。其它情况下,该值将参与基线对齐。
      • stretch: 如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。
    • align-self取值

      • auto: 如果'align-self'的值为'auto',则其计算值为元素的父元素的'align-items'值,如果其没有父元素,则计算值为'stretch'。
      • flex-start: 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴起始边界。
      • flex-end: 弹性盒子元素的侧轴(纵轴)起始位置的边界紧靠住该行的侧轴结束边界。
      • center: 弹性盒子元素在该行的侧轴(纵轴)上居中放置。(如果该行的尺寸小于弹性盒子元素的尺寸,则会向两个方向溢出相同的长度)。
      • baseline: 如弹性盒子元素的行内轴与侧轴为同一条,则该值与'flex-start'等效。其它情况下,该值将参与基线对齐。
      • stretch: 如果指定侧轴大小的属性值为'auto',则其值会使项目的边距盒的尺寸尽可能接近所在行的尺寸,但同时会遵照'min/max-width/height'属性的限制。

      align-items:flex-start/flex-end/center/baseline/stretch /*设置给 伸缩容器*/
      align-self: auto/flext-start/flex-end/baseline/strect /*设置给伸缩项目*/

  • 盒子伸缩盒放大 比率

    • flex-grow 放大比率

      • 设置或检索弹性盒的扩展比率。

      • 根据弹性盒子元素所设置的扩展因子作为比率来分配剩余的空间。

      • 实例:b,c将按照1:3的比率分配剩余空间

          <ul class="flex">
              <li>a</li>
              <li>b</li>
              <li>c</li>
          </ul>
          
          .flex{display:flex;width:600px;margin:0;padding:0;list-style:none;}
          .flex li:nth-child(1){width:200px;}
          .flex li:nth-child(2){flex-grow:1;width:50px;}
          .flex li:nth-child(3){flex-grow:3;width:50px;}
        
        
          flex-grow的默认值为0,如果没有显示定义该属性,是不会拥有分配剩余空间权利的。
        
          本例中b,c两项都显式的定义了flex-grow,flex容器的剩余空间分成了4份,其中b占1份,c占3分,即1:3
          
          flex容器的剩余空间长度为:600-200-50-50=300px,所以最终a,b,c的长度分别为:
          
          a: 50+(300/4)=200px
          
          b: 50+(300/4*1)=125px
          
          a: 50+(300/4*3)=275px
        
    • flex-shrink 收缩比率
      说明:
      设置或检索弹性盒的收缩比率。
      根据弹性盒子元素所设置的收缩因子作为比率来收缩空间。
      示例:a,b,c将按照1:1:3的比率来收缩空间
      HTML Code:

       		<ul class="flex">
       		    <li>a</li>
       		    <li>b</li>
       		    <li>c</li>
       		</ul>
       		
       		.flex{display:flex;width:400px;margin:0;padding:0;list-style:none;}
       		.flex li{width:200px;}
       		.flex li:nth-child(3){flex-shrink:3;}flex-shrink的默认值为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。
       		
       		本例中c显式的定义了flex-shrink,a,b没有显式定义,但将根据默认值1来计算,可以看到总共将剩余空间分成了5份,其中a占1份,b占1份,c占3分,即1:1:3
       		
       		我们可以看到父容器定义为400px,子项被定义为200px,相加之后即为600px,超出父容器200px。那么这么超出的200px需要被a,b,c消化
       		
       		通过收缩因子,所以加权综合可得200*1+200*1+200*3=1000px;
       		于是我们可以计算a,b,c将被移除的溢出量是多少:
       		a被移除溢出量:(200*1/1000)*200,即约等于40px
       		b被移除溢出量:(200*1/1000)*200,即约等于40px
       		c被移除溢出量:(200*3/1000)*200,即约等于120px
       		最后a,b,c的实际宽度分别为:200-40=160px, 200-40=160px, 200-120=80px
      
    • flex-basis 基准

      • 设置或检索弹性盒伸缩基准值
      • 如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间
      • 取值
        • <length>: 用长度值来定义宽度。不允许负值
        • <percentage>: 用百分比来定义宽度。不允许负值
        • auto: 无特定宽度值,取决于其它属性值
        • content: 基于内容自动计算宽度

posted on 2017-08-09 20:51  溢流谦  阅读(1465)  评论(0编辑  收藏  举报

导航