弹性盒模型flex布局

flex布局--盒子模型(Flexible Box)

先说flex的兼容性

  • IE10部分支持2012,需要-ms-前缀

  • Android4.1/4.2-4.3部分支持2009 ,需要-webkit-前缀

  • Safari7/7.1/8部分支持2012, 需要-webkit-前缀

  • IOS Safari7.0-7.1/8.1-8.3部分支持2012,需要-webkit-前缀

考虑到兼容性,写法会有点麻烦

/* 子元素-平均分栏 */
.flex1 {
      
  -webkit-box-flex: 1;      /* OLD - iOS 6-, Safari 3.1-6 */
  -moz-box-flex: 1;         /* OLD - Firefox 19- */
  width: 20%;               /* For old syntax, otherwise collapses. */
  -webkit-flex: 1;          /* Chrome */
  -ms-flex: 1;              /* IE 10 */
  flex: 1;                  /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
/* 父元素-横向排列(主轴) */
.flex-h {
      
  display: box;              /* OLD - Android 4.4- */
  display: -webkit-box;      /* OLD - iOS 6-, Safari 3.1-6 */
  display: -moz-box;         /* OLD - Firefox 19- (buggy but mostly works) */
  display: -ms-flexbox;      /* TWEENER - IE 10 */
  display: -webkit-flex;     /* NEW - Chrome */
  display: flex;             /* NEW, Spec - Opera 12.1, Firefox 20+ */
  /* 09版 */
  -webkit-box-orient: horizontal;
  /* 12版 */
  -webkit-flex-direction: row;
  -moz-flex-direction: row;
  -ms-flex-direction: row;
  -o-flex-direction: row;
  flex-direction: row;
}
/* 父元素-横向换行 */
.flex-hw {
  /* 09版 */
  /*-webkit-box-lines: multiple;*/
  /* 12版 */
  -webkit-flex-wrap: wrap;
  -moz-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  -o-flex-wrap: wrap;
  flex-wrap: wrap;
}
/* 父元素-水平居中(主轴是横向才生效) */
.flex-hc {
  /* 09版 */
  -webkit-box-pack: center;
  /* 12版 */
  -webkit-justify-content: center;
  -moz-justify-content: center;
  -ms-justify-content: center;
  -o-justify-content: center;
  justify-content: center;
  /* 其它取值如下:
    align-items     主轴原点方向对齐
    flex-end        主轴延伸方向对齐
    space-between   等间距排列,首尾不留白
    space-around    等间距排列,首尾留白
   */
}
/* 父元素-纵向排列(主轴) */
.flex-v {
      
  display: box;              /* OLD - Android 4.4- */
  display: -webkit-box;      /* OLD - iOS 6-, Safari 3.1-6 */
  display: -moz-box;         /* OLD - Firefox 19- (buggy but mostly works) */
  display: -ms-flexbox;      /* TWEENER - IE 10 */
  display: -webkit-flex;     /* NEW - Chrome */
  display: flex;             /* NEW, Spec - Opera 12.1, Firefox 20+ */
  /* 09版 */
  -webkit-box-orient: vertical;
  /* 12版 */
  -webkit-flex-direction: column;
  -moz-flex-direction: column;
  -ms-flex-direction: column;
  -o-flex-direction: column;
  flex-direction: column;
}
/* 父元素-纵向换行 */
.flex-vw {
  /* 09版 */
  /*-webkit-box-lines: multiple;*/
  /* 12版 */
  -webkit-flex-wrap: wrap;
  -moz-flex-wrap: wrap;
  -ms-flex-wrap: wrap;
  -o-flex-wrap: wrap;
  flex-wrap: wrap;
}
/* 父元素-竖直居中(主轴是横向才生效) */
.flex-vc {
  /* 09版 */
  -webkit-box-align: center;
  /* 12版 */
  -webkit-align-items: center;
  -moz-align-items: center;
  -ms-align-items: center;
  -o-align-items: center;
  align-items: center;
}
/* 子元素-显示在从左向右(从上向下)第1个位置,用于改变源文档顺序显示 */
.flex-1 {
      
  -webkit-box-ordinal-group: 1;   /* OLD - iOS 6-, Safari 3.1-6 */
  -moz-box-ordinal-group: 1;      /* OLD - Firefox 19- */
  -ms-flex-order: 1;              /* TWEENER - IE 10 */
  -webkit-order: 1;               /* NEW - Chrome */
  order: 1;                       /* NEW, Spec - Opera 12.1, Firefox 20+ */
}
/* 子元素-显示在从左向右(从上向下)第2个位置,用于改变源文档顺序显示 */
.flex-2 {
      
  -webkit-box-ordinal-group: 2;   /* OLD - iOS 6-, Safari 3.1-6 */
  -moz-box-ordinal-group: 2;      /* OLD - Firefox 19- */
  -ms-flex-order: 2;              /* TWEENER - IE 10 */
  -webkit-order: 2;               /* NEW - Chrome */
  order: 2;                       /* NEW, Spec - Opera 12.1, Firefox 20+ */
}

 

为了更好的兼容性

.box{
     

    display: -webkit-flex;  /* 新版本语法: Chrome 21+ */
    display: flex;          /* 新版本语法: Opera 12.1, Firefox 22+ */
    display: -webkit-box;   /* 老版本语法: Safari, iOS, Android browser, older WebKit browsers. */
    display: -moz-box;      /* 老版本语法: Firefox (buggy) */
    display: -ms-flexbox;   /* 混合版本语法: IE 10 */   

 }

.flex1 {
                 
    -webkit-flex: 1;        /* Chrome */  
    -ms-flex: 1             /* IE 10 */  
    flex: 1;                /* NEW, Spec - Opera 12.1, Firefox 20+ */
    -webkit-box-flex: 1     /* OLD - iOS 6-, Safari 3.1-6 */  
    -moz-box-flex: 1;       /* OLD - Firefox 19- */       
}

 

 

1、任何容器都可以使用盒子模型

行内元素也是可以的

.div{
      
  display:flex;  
}
.div1{
      
  display:inline-flex;  
}

 

2、如果是WebKit内核浏览器要加上-WebKit-前缀

.div{
      
  display:flex;
  display:-webkit-flex;    
}

 

3、设置了Flex布局之后子元素的float,clear,vertical-align将会失效

.div1{
      
  float:left;//无效  
}

 

4、属性的设置从‘对谁设置’分为两种

--一种是设置在父容器上

--另一种是设置在子容器上

1)、设置在父容器上的属性有

flex-direction--决定主轴的方向

.div{
    /*主轴方向 默认是row(水平 左到右)*/
    flex-direction:row;
    /*水平(右到左)*/
    flex-direction:row-reverse;
    /*垂直 column 高度不会超出*/
    flex-direction: column;
    /*垂直 column-reverse 从下往上*/
    flex-direction: column-reverse;            
}                            

 

flex-wrap--决定是否换行或是换行方式

.div{
    /*不换行 自动调整间距*/
    flex-wrap: nowrap;
    /*换行 从左到右 从上到下*/
    flex-wrap: wrap;
    /*换行 从左到右 从下到上*/
    flex-wrap: wrap-reverse;  
}

 

flex-flow--是flex-direction和flex-wrap的一起缩写,两个值

.div{
    /*默认 row nowrap*/
    flex-flow: row wrap;
    /*可以两个值混合写*/
    flex-flow: row-reverse nowrap;
}

 

justify-content--子元素的排列方式

.div{
    /*flex-start--从左开始 没有间距*/
    justify-content: flex-start;
    /*flex-end--从右到左 没有间距*/
    justify-content: flex-end;
    /*从中间开始排 没有间距*/
    justify-content: center;
    /*等间距排列 两边没有距离*/
    justify-content: space-between;
    /*等间距排列 两边有距离*/
    justify-content: space-around;  
}

 

  • flex-start(默认值):左对齐
  • flex-end:右对齐
  • center: 居中
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

align-items--元素对齐方式

.div{
    /*子元素的对齐方式 底部对齐*/
    align-items: flex-end;
    /*子元素对齐方式 头部对齐(默认)*/
    align-items: flex-start;        
    /*子元素对齐方式 中间*/
    align-items: center;    
    /*子元素对齐方式 拉伸填充(如果没有设置高度)*/    
    align-items: stretch;
    /*子元素对齐方式 第一行文字对齐*/
    align-items: baseline;  
}
  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

align-content--多条轴的对齐方式

.div{
    /*多轴的对齐方式 从左到右 从上到下*/
    align-content: flex-start;
    /*多轴的对齐方式 从左到右 从下到上*/
    align-content: flex-end;
    /*多轴的对齐方式 从左到右 从上到下 中间*/
    align-content: center;
    /*多轴的对齐方式 从左到右 占满*/
    align-content: stretch;
    /*多轴的对齐方式 间隔相等 两侧没有*/
    align-content: space-between;
    /*多轴的对齐方式 间隔相等 两侧一半*/
    align-content: space-around;  
}

 

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

2)、设置在子元素的属性

order--排序方式(默认)

.item{
      
  order:0;  
}

 

flex-grow--子元素的放大比例

默认是0(有剩余空间也不放大)

1(等分放大充满容器)

.item{
      
  flex-grow:1;  
}

 

flex-shrink--子元素的缩小比例

默认是1(空间不足将缩小)

 

flex-basis--设置子元素的总宽度,设置之后就写死了子元素所占的总宽度

--可以直接写XXpx

.item{
    /*子元素占的宽度*/
    flex-basis: auto;  
}

flex--是flex-grow,flex-shrink,flex-basis的简写

默认值是(0,1 auto)

.item{
    /*flex-grow,flex-shrink,flex-basis简写*/
    flex:0 1 auto;  
}

 

align-self--对单个元素设置对齐方式 可以覆盖align-items

默认是auto--继承父级的对齐方式 没有父级就是stretch

.item{
    /*单个元素不一样的对齐方式*/
    align-self: flex-end;  
}

 

5、关于flex的的布局应用

骰子样式--基本都用到了justify-content,align-items,align-self,flex-direction

HTML代码

<div class="box" id="box1">
    <span class="item">span>
div>    
<div class="box" id="box2">
    <span class="item">span>
    <span class="item">span>
div>

CSS样式

    .item{
      /*骰子点数样式*/
            .item{
              display: block;
              width: 24px;
              height: 24px;
              border-radius: 50%;
              margin: 4px;
              background-color: #333;
              box-shadow: inset 0 3px #111, inset 0 -3px #555;
            }
            /*骰子样式*/
            [class$='box']{
      
              margin: 16px;
              padding: 4px;
              background-color: #e7e7e7;
              width: 104px;
              height: 104px;
              /*图片的设置*/
              object-fit: contain;
              
              box-shadow:
                inset 0 5px white, 
                inset 0 -5px #bbb,
                inset 5px 0 #d7d7d7, 
                inset -5px 0 #d7d7d7;
              
              border-radius: 10%;
            }
            #box1{
      
                display: flex;
                /*第一排左*/
                justify-content: flex-start;
                /*第一排中*/
                justify-content: center;
                /*第一排后*/
                justify-content: flex-end;
                /*第二排左*/
                align-items: center;
                /*第二排中*/
                justify-content: center;
                align-items: center;
                /*第二排后*/
                align-items: center;
                   justify-content: flex-end;
                   /*第三排左*/
                   justify-content: flex-start;
                align-items: flex-end;
                   /*第三排中*/
                   justify-content: center;
                   align-items: flex-end;
                   /*第三排后*/
                   justify-content: flex-end;
                   align-items: flex-end;
            }
            #box2{
      
                display: flex;
                /*排九个*/
                justify-content: space-between;
                flex-wrap: wrap;
                /*横排1 3*/
                flex-direction: row;
                justify-content: space-between;
                /*竖排1 3*/
                flex-direction: column;
                justify-content: space-between;
                /*竖排中中*/
                flex-direction: column;
                justify-content: space-between;
                align-items: center;
                /*竖排右右*/
                flex-direction: column;
                justify-content: space-between;
                align-items: flex-end;
                /*斜角*/
                justify-content: space-between;        
            }
            #box2 .item:nth-child(2){
                /*斜角*/
                align-self: flex-end;
            }
    
    }

 

网格布局 用flex:1或是flex:0 0 50%;

基本网格布局,百分比网格

一:

HTML代码

<div class="Grid">
  <div class="Grid-cell">...div>
  <div class="Grid-cell">...div>
  <div class="Grid-cell">...div>
div>

CSS代码

.Grid {
      
  display: flex;
}

.Grid-cell {
      
  flex: 1;
}

二:

HTML代码

<div class="Grid">
  <div class="Grid-cell u-1of4">...div>
  <div class="Grid-cell">...div>
  <div class="Grid-cell u-1of3">...div>
div>

CSS样式

.Grid {
      
  display: flex;
}

.Grid-cell {
      
  flex: 1;
}

.Grid-cell.u-full {
      
  flex: 0 0 100%;
}

.Grid-cell.u-1of2 {
      
  flex: 0 0 50%;
}

.Grid-cell.u-1of3 {
      
  flex: 0 0 33.3333%;
}

.Grid-cell.u-1of4 {
      
  flex: 0 0 25%;
}

输入框布局

HTML代码

<div class="InputAddOn">
  <span class="InputAddOn-item">...span>
  <input class="InputAddOn-field">
  <button class="InputAddOn-item">...button>
div>

CSS样式

.InputAddOn {
      
  display: flex;
}

.InputAddOn-field {
      
  flex: 1;
}

 

图文混排

HTML代码

<div class="Media">
  <img class="Media-figure" src="" alt="">
  <p class="Media-body">...p>
div>

CSS样式

.Media {
      
  display: flex;
  align-items: flex-start;
}

.Media-figure {
      
  margin-right: 1em;
}

.Media-body {
      
  flex: 1;
}

 

转载于:https://www.cnblogs.com/congfeicong/p/6062827.html

你可能感兴趣的:(移动开发)