好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

flex: grow、shrink、basis

flex 弹性盒子

dis play:flex 和接下来我们介绍的这个 flex 是有区别的,前者是 修改 dis play 实现弹性和模型的,而 flex 仅仅是弹性盒模型下 flex-grow、flex-shrink 和 flex-basis三个的缩写 属性 ,用来定义和模型内部的子元素在浏览器重的展示形式。 下面我们主要讲这三个 属性 。

1. 官方定义

属性 用于设置或检索弹性盒模型对象的子元素如何分配空间。
flex 属性 是 flex-grow 、 flex-shrink 和 flex-basis 属性 的简写 属性 。

2. 解释

fl父元素设置成 dis paly:flex 之后子元素的空间分配通过 flex 设置,其特点为弹性,即内部分配空间如果按照比例分配则其不会随着父元尺寸变化而变化。

3. 语法

子元素

  { 
     flex  :  flex-grow flex-shrink flex-basis|auto|initial|inherit|none ; 
 } 
 

属性 说明

参数 名称 参数类型 解释 flex-grow number 其它子元素的比例关系 默 认为 0 ,存在剩余空间不扩大 flex-shrink number 默 认为1空间不足时候缩小 flex-basis | ‘auto’ 设定 一个 长度或者 自动 填充

4. 兼容性

flex:

IE Edge Firefox Chrome Safari Opera ios android – – 63-74 84-85 – – – –

flex-grow| flex-shrink|flex-basis:

IE Edge Firefox Chrome Safari Opera ios android 10+ 12+ 28+ 4+ 6.1+ 12.1+ 7+ 4.4

5.实例

给 一个 块级元素 添加 flex 属性 ,让其子元素平均分配空间。

    < div   class   =  " demo "   >  
       < div   class   =  " item "   >  1   </ div  >  
       < div   class   =  " item "   >  2   </ div  >  
       < div   class   =  " item "   >  3   </ div  >  
   </ div  >  
 

   .demo   { 
      dis play  : flex ; 
     width  : px ; 
     height  : x ; 
     line-height  : px ; 
     border  :  px solid  #ccc  ; 
     border-right  :  none ; 
 } 
 div> .item   { 
     width  : px ; 
     border-right  : px solid  #ccc  ; 
     text-align  :  center ; 
     flex  :  ; 
 } 
 

效果 图

块级元素平均分配空间

  <!DOCTYPE html> 
   < html   lang   =  " en "   >  
   < head  >  
       <  Meta    charset   =  " UTF-8 "   >  
       <  Meta    name   =  " viewport "    content   =  " width=device-width, initial-scale=1.0 "   >  
       <  Meta    http-equiv   =  " X-UA-Compatible "    content   =  " ie=edge "   >  
       < title  >  Document   </ title  >  
       < style  >   
      .demo   { 
	      dis play  : flex ; 
	     width  : px ; 
	     height  : x ; 
	     line-height  : px ; 
	     border  :  px solid  #ccc  ; 
	     border-right  :  none ; 
	 } 
	 div> .item   { 
	     width  : px ; 
	     border-right  : px solid  #ccc  ; 
	     text-align  :  center ; 
	     flex  :  ; 
	 } 
        </ style  >  
       < body  >  
       < div   class   =  " demo "   >  
	       < div   class   =  " item "   >  1   </ div  >  
	       < div   class   =  " item "   >  2   </ div  >  
	       < div   class   =  " item "   >  3   </ div  >  
	   </ div  >  	
       </ body  >  
   </ html  >  
 

解释:容器 demo 设置了 flex 总宽度为200px,项目 item 设置宽度 100px;如果正常情况下会超出容器,我们通过设置 flex:1 让项目自适应容器,并等分了空间。

给 一个 块级元素 添加 inline-flex 属性 ,让其变成行内元素,子元素平均分配

   .demo   { 
      dis play  : inline-flex ; 
     width  : px ; 
     height  : x ; 
     line-height  : px ; 
     border  :  px solid  #ccc  ; 
     border-right  :  none ; 
 } 
 div> .item   { 
     width  : px ; 
     border-right  : px solid  #ccc  ; 
     text-align  :  center ; 
     flex  :  ; 
 } 
 

效果 图

内联元素平分空间 效果 图

  <!DOCTYPE html> 
   < html   lang   =  " en "   >  
   < head  >  
       <  Meta    charset   =  " UTF-8 "   >  
       <  Meta    name   =  " viewport "    content   =  " width=device-width, initial-scale=1.0 "   >  
       < title  >  Document   </ title  >  
       < style  >   
	  .demo   { 
      dis play  : inline-flex ; 
     width  : px ; 
     height  : x ; 
     line-height  : px ; 
     border  :  px solid  #ccc  ; 
     border-right  :  none ; 
 } 
 div> .item   { 
     width  : px ; 
     border-right  : px solid  #ccc  ; 
     text-align  :  center ; 
     flex  :  ; 
 } 
	    </ style  >  
   </ head  >  
   < body  >  
        < div   class   =  " demo "   >  
           < div   class   =  " item "   >  1   </ div  >  
           < div   class   =  " item "   >  2   </ div  >  
           < div   class   =  " item "   >  3   </ div  >  
       </ div  >  
    
   </ body  >  
   </ html  >  
 

demo和 文字 在一行,demo变成内联元素了。

一个 左侧100px,右侧自适应的, 左右布局

        < div   class   =  " demo-2 "   >  
           < div   class   =  " item-left "   >  1   </ div  >  
           < div   class   =  " item-right "   >  2   </ div  >  
       </ div  >  
 

   .demo-2   { 
      dis play  : flex ; 
 } 
  .item-left   { 
     flex-basis  :  px ; 
 } 
  .item-right   { 
     flex-grow  :  ; 
 } 
 

效果 图

左侧100px,右侧自适应的, 左右布局 效果 图

  <!DOCTYPE html> 
   < html   lang   =  " en "   >  
   < head  >  
       <  Meta    charset   =  " UTF-8 "   >  
       <  Meta    name   =  " viewport "    content   =  " width=device-width, initial-scale=1.0 "   >  
       < title  >  Document   </ title  >  
       < style  >   
      .demo-2   { 
      dis play  : flex ; 
 } 
  .item-left   { 
     flex-basis  :  px ; 
 } 
  .item-right   { 
     flex-grow  :  ; 
 } 
        </ style  >  
   </ head  >  
   < body  >  
       < div   class   =  " demo-2 "   >  
           < div   class   =  " item-left "   >  1   </ div  >  
           < div   class   =  " item-right "   >  2   </ div  >  
       </ div  >  
   </ body  >  
   </ html  >  
 

4. 一个 左侧为100px,右侧最大为600px的 左右布局

   .demo-2   { 
      dis play  : flex ; 
 } 
  .item-left   {        
     flex-basis  :  px ; 
     background  :  red ; 
     flex-shrink  :  ; 
 } 
  .item-right   {         
     flex-basis  :  px ; 
     background  :  yellow ; 
 } 
 

左右布局

  <!DOCTYPE html> 
   < html   lang   =  " en "   >  
   < head  >  
       <  Meta    charset   =  " UTF-8 "   >  
       <  Meta    name   =  " viewport "    content   =  " width=device-width, initial-scale=1.0 "   >  
       < title  >  Document   </ title  >  
       < style  >   
		  .demo-2   { 
      dis play  : flex ; 
 } 
  .item-left   {        
     flex-basis  :  px ; 
     background  :  red ; 
     flex-shrink  :  ; 
 } 
  .item-right   {         
     flex-basis  :  px ; 
     background  :  yellow ; 
 } 
	    </ style  >  
   </ head  >  
   < body  >  
       < div   class   =  " demo-2 "   >  
           < div   class   =  " item-left "   >  
1
           </ div  >  
           < div   class   =  " item-right "   >  
2
           </ div  >  
       </ div  >  
   </ body  >  
   </ html  >  
 

解释:右侧最大宽度为600,如果小于 600 右侧将随屏幕尺寸缩小。

6. 经验 分享

现在的很多前端开发都会接到一些设计稿,要求在各种终端都可以适应,那么用好 flex 是 一个 关键。 flex:1 是其中最常见的设置,它等价于:

   .demo   { 
     flex-grow  :  ; 
     flex-shrink  :  ; 
     flex-basis  : auto
 } 
 

其意思就是剩余空间就扩大,而剩余空间不足就缩小,就像弹簧一样。那么这部分就可以自适应各种屏幕大小了。

7. Tips

flex-basis 和 flex-grow 同时使用时候 flex-basis 不起作用。

flex 的 属性 默 认是 0 1 auto,它们的顺序是 flex-grow flex-shrink 和 flex-basis 即三不:有剩余空间不扩大、当空间不足时缩小、不限制尺寸。

flex 属性 有两个快捷值 即 auto( 1 1 auto)和 none(0 0 auto)。

尽量不要使用缩小,因为它的兼容性不是很好。

flex-direction 排列方向 ? ?flex order 顺序

查看更多关于flex: grow、shrink、basis的详细内容...

  阅读:43次

上一篇

下一篇

第1节:CSS3简介    第2节:border 边框    第3节:borderImage 边框图片    第4节:border-radius 圆角    第5节:box-shadow 阴影    第6节:box-sizing 盒类型    第7节:gradients 渐变    第8节:text-justify 对齐    第9节:text-overflow 文字超出    第10节:text-shadow 文本阴影    第11节:word-break 文本打断    第12节:word-wrap 文本换行    第13节:letter-spacing 字间距    第14节:perspective 透视    第15节:transform 2D 空间转换    第16节:transform 3D 空间转换    第17节:transition 过渡    第18节:animation 动画    第19节:columns 字符分割    第20节:flex 弹性盒子布局    第21节:flex order 顺序    第22节:flex: grow、shrink、basis    第23节:flex-direction 排列方向    第24节:justify-content (轴内)对齐方式    第25节:flex-wrap 换行    第26节:align-items 竖直方向对齐方式    第27节:align-content    第28节:Grid 布局简介    第29节:Grid 行和列    第30节:media 媒体查询    第31节:only 元素选择    第32节:before && after 位置    第33节:nth 类型元素选择器    第34节:calc 计算属性