CSS前端布局

1.三栏布局: 圣杯布局 和 双飞翼布局


1. 圣杯布局 和 双飞翼布局解决的问题是一样的:就是两边定宽,中间自适应的三栏布局,中间栏要放在文档流前面以优先渲染.
2. 圣杯布局 和双飞翼布局 解决问题的方案在前一半是相同的:也就是三栏全部float浮动,但左右两栏加上负margin让其跟中间栏div并排,已形成三栏布局.
3. 具体的不同以代码开始对比: 

(1) 圣杯布局的html代码: 

middle部分 首先要放在 container 的最前部分,然后是 left,right.

 <body>
            <!-- 头部 -->
     <div class="header">
              <h1>Header</h1>
     </div>

            <!-- 主体 -->
     <div class="container">
             <div class="middle">
                  <h4>middle</h4>
             </div>
             <div class="left">
                  <h4>left</h4>
             </div>
             <div class="right">
                  <h4>right</h4>
             </div>
     </div>

           <!-- 底部 -->
     <div class="footer">
              <h4>footer</h4>
     </div>    
 </body>


 

  (2)双飞翼布局的代码:       

        双飞翼布局始于淘宝UED.如果把三栏布局比作一只大鸟,可以把 main看作是鸟的身体, sub和extra 则是鸟的翅膀.
        这个布局的实现思路: 先把最重要的身体部分放好,然后再将翅膀移动到适当的地方.
        其实和 圣杯布局 差不多.
          
         

 <body>
              <!-- 头部 -->
          <div class="header">
               <h1>Header</h1>
          </div>

              <!-- 主体 -->
          <div class="main">
               <div class="main-inner">
                    <h4>main</h4>
               </div>
          </div>
              <!-- 左侧 -->
          <div class="sub">
               <h4>sub</h4>
          </div>
               <!-- 右侧 -->
          <div class="extra">
               <h4>extra</h4>
          </div>

               <!-- 底部 -->
          <div class="footer">
               <h4>footer</h4>
          </div>
</body>

    (3) 圣杯布局的css代码:

  <style>
      *{
          margin: 0;
          padding: 0;
       }
       body{
          min-width: 700px;
       }
          /*==== 头部和底部共同的样式 =====*/
      .header,.footer{
          border: 1px solid red;
          background: #399;
          text-align: center;
          height: 50px;
          line-height: 50px;
          color: #fff;
       }

          /*==== 主体部分的样式 =====*/
      .container{
          border: 1px dashed #333;
          background: pink;
          padding: 0 220px 0 220px;
          overflow: hidden;
       }
            /*==== 中间、左侧和右侧共同的样式 =====*/
     .left,.middle,.right{
          position: relative;
          float: left;
          min-height: 130px;
          line-height: 130px;
          text-align: center;
       }
            /*==== 主体中间的样式 =====*/
     .middle{
          width: 100%;
          background:  #ccffff;
          word-break: break-all;
      }
             /*==== 主体左侧的样式 =====*/
      .left{
          left:-200px;
          margin-left: -100%;   
          width: 200px;
          background:  #99ffff;
      }
             /*==== 主体右侧的样式 =====*/
     .right{
          right:-220px;
          margin-left: -220px;   
          width: 200px;
          background:  #ccff99;
      }


             /*==== 底部样式 ====*/
     .footer{
          clear: both;
      }

    </style>


    (4) 双飞翼布局的css代码:

 <style>
        *{
             margin: 0;
             padding: 0;
          }
        body{
             min-height: 700px;
        }
             /*==== 头部和底部共同的样式 =====*/
        .header,.footer{
             border: 1px solid red;
             background: #399;
             text-align: center;
             height: 50px;
             line-height: 50px;
             color: #fff;
        }


             /*==== 中间、左侧和右侧共同的样式 =====*/
        .sub,.main,.extra{
             float: left;
             min-height: 130px;
             line-height: 130px;
             text-align: center;
        }
              /*==== 中间的样式 =====*/
        .main{
            width: 100%;
        }
        .main .main-inner{
            margin-left: 200px;
            margin-right: 220px;
            min-height: 130px;
            background:  #ccffff;
            word-break: break-all;
        }
             /*==== 左侧的样式 =====*/
        .sub{
            margin-left: -100%;   
            width: 200px;
            background:  #99ffff;
        }
             /*==== 右侧的样式 =====*/
        .extra{
            margin-left: -220px;   
            width: 200px;
            background:  #ccff99;
        }

            /*==== 底部样式 ====*/
        .footer{
             clear: both;
        }
  </style>


4. 双飞翼布局的好处:

  •  主要内容优先加载的优化;
  • 兼容目前所与的主流浏览器,包括IE6;
  •  实现不同的布局方式可以通过调整相关CSS属性即可实现.

2. Flex 弹性布局

 一:基本概念

  •  任何一个容器都可以指定为Flex布局
.box{
    display: flex;
    display: inline-flex;   /*行内元素使用flex布局*/
    display: -webkit-flex;   /*Webkit内核的浏览器必须加上-webkit前缀*/
}
  •  采用Flex布局的元素称为**Flex容器(flex container)**,简称**容器**。它的所有**子元素**自动成为**容器成员**,称为**Flex项目(flex item)**,简称"项目"。
  •  容器默认存在2根**轴**:水平的**主轴(main axis)**、垂直的**交叉轴(cross axis)**。
  •  主轴的开始位置(与边框的交叉点)叫main start,结束的位置叫main end;
  •  交叉轴的开始位置叫cross start , 结束的位置叫cross end。
  •  项目默认沿**主轴**排列。
  •  单个项目占据的主轴空间叫main size,占据的交叉空间叫cross size。

参考文档

二:容器的属性
 

在容器上设置有6个属性:

  •    flex-direction  
  •    flex-wrap
  •    flex-flow
  •    justify-content
  •    align-items
  •    align-content

2.1 flex-direction属性

  •  作用: 决定主轴的方向(即项目的排列方向)。
    .box{
        flex-direction: row | row-reverse | column | column-rerverse
    }
  •  有4个可能值:
  •   row(默认值): 主轴为水平方向,起点在左端。
  •   row-reversr: 主轴为水平方向,起点在右端。
  •   column: 主轴为垂直方向,起点在上沿。
  •   column-reverse: 主轴为垂直方向,起点为下沿。

 2.2 flex-wrap属性

  •  作用: 定义一条轴线排不下的时候如何换行。
    .box{
         flex-wrap: nowrap | wrap | wrap-reverse
      }
  •  默认情况下,项目都在一条线(轴线)上。

  •  有3个可能值:

  • nowrap : (默认值),不换行。

  •  wrap : 换行,第一行在上面。

  •  wrap-reserve: 换行,第一行在下方。

2.3 flex-flow属性

  • flex-direction属性和 flex-wrap属性的**简写形式**。
 .box{
       flex-flow : <flex-direction> || <flex-wrap>
    }
  •  默认值: row nowrap

2.4 justify-content属性

  •  作用: 定义项目在主轴上的对齐方式。
    .box{
           justify-content: flex-start | flex-end | center | space-between | space-around
        }
  •  有 5 个可能值:
  •  flex-start : 默认值,左对齐。
  •  flex-end : 右对齐。
  •  center : 居中。
  •  space-between: 两端对齐,项目之间的间隔都是相等的。(项目左右端居贴着容器框)
  • space-around: 每个项目两侧的间隔相等.所以,项目之间的间隔 比 项目与边框的间隔 大一倍。

 2.5 align-items属性

  •  作用: 定义项目在交叉轴上如何对齐。
     .box{
           align-items: flex-start | flex-end | center | baseline | stretch
       }
  • 具体的对齐方式 与 交叉轴的方向有关.

* 假设交叉轴的方向从上往下,有 5个可能值: 
  * flex-start : 交叉轴的起点对齐。
  * flex-end : 交叉轴的终点对齐。
  * center : 交叉轴的中点对齐。
  * baseline: 项目的第一行文字的基线对齐。
  * stretch : 默认值。如果项目**未设置高度/设置为auto**,将占满整个容器的高度。
 2.6 align-content属性
* 作用: 定义了多根轴线的对齐方式。

.box{
      align-content:flex-start | flex-end | center | space-between | space-around | stretch ;
  }


* 注意: 如果项目只有一根轴线,该属性不生效。
* 有6个可能值:
  * flex-start : 与交叉轴的起点 对齐。
  * flex-end : 与交叉轴的终点 对齐。
  * center : 与交叉轴的中点 对齐。
  * space-between : 与交叉轴两端对齐, 轴线之间的间隔平均分布。
  * space-around : 每根轴线两侧的间隔相等。所以,周线之间的间隔 比 周线与边框之间的间隔 大一倍。
  * stretch:默认值。轴线占满整个交叉轴。

三:项目的属性

* 在项目上设有6个属性值:
  * order
  * flex-grow
  * flex-shrink
  * flex-basis
  * flex
  * align-self
3.1 order属性
* 作用:定义项目的排列顺序。
* 数值越小,排列越靠前,默认为0。

.item{
     order: <integer>  /* 例如: 1  -1   99 */ 
   }


 3.2 flex-grow属性
* 作用: 定义项目的放大比例。
* 默认值为0,即:如果存在剩余空间也不放大

 .item{
      flex-grow: <number>  /* default: 0 */ 
    }


* 如果所有项目的flex-grow属性值都为1,则它们将等分剩余空间(如果有的话)。
* 如果一个项目的flex-grow属性值为2,其它项目都为1,则 前者占据的剩余空间 将比 其他项 多一倍。
3.3 flex-shrink属性
* 作用: 定义了项目的缩小比例。
* 默认值为1,即: 如果空间不足,该项目将缩小。

 .item {
      flex-shrink: <number>;  /* default 1 */
    }


* 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。
* 如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
 3.4 flex-basis属性
* 作用: 定义了在分配多余空间之前,项目占据的主轴空间(main size)。
* 默认值为auto,即项目的本来大小。
* 浏览器根据这个属性,计算主轴是否有多余空间。

 .item {
      flex-basis: <length> | auto; /* default auto */
    }


* 它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
3.5 flex属性
* flex-grow, flex-shrink 和 flex-basis的简写。
* 默认值为 0 1 auto。后两个属性可选。
* 有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。

  .item {
      flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
    }


* 建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
3.6 align-self属性
* 作用: 允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。
* 默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

 .item {
      align-self: auto | flex-start | flex-end | center | baseline | stretch;
    }


* 该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

猜你喜欢

转载自blog.csdn.net/wei_jia007/article/details/82379787