1. 程式人生 > 其它 >CSS3flex彈性盒子

CSS3flex彈性盒子

技術標籤:html

flex彈性盒子

一、彈性盒子是 CSS3 的一種新的佈局模式。
1、CSS3 彈性盒( Flexible Box 或 flexbox),是一種當頁面需要適應不同的螢幕大小以及裝置型別時確保元素擁有恰當的行為的佈局方式。
2、引入彈性盒佈局模型的目的是提供一種更加有效的方式來對一個容器中的子元素進行排列、對齊和分配空白空間。
3、彈性盒子與絕對定位的比較
優點: flex:flexible box 彈性盒子。可以輕鬆控制元素的排列,對齊和順序。
彈性盒子沒有脫離標準的文件流,絕對定位脫離了標準文件流。

<style>
/*彈性盒子子元素居中*/
        .father
{ width: 400px; height: 400px; margin: 0 auto; margin-top: 50px; border: 1px solid black; display: flex; justify-content: center; align-items: center; } .son{ width: 100px; height
: 100px; background-color: red; }
</style> </head> <body> <div class="father"> <div class="son"> </div> </div>

二、flex宣告
1、 宣告定義:
使用display:flex或display:inline-flex 宣告一個容器為彈性盒子。這個容器中的子元素們,會遵循彈性佈局。

【注】一般是使用display:flex. inline-flex極少用。
flex:如果沒有為父元素設定寬,預設為100%;
inline-flex:如果沒有設定寬,,預設為所有子元素的寬的和。
例如

<style>
       .father {
           height: 400px;
           /* width: 400px; */
           margin: 0 auto;
           margin-top: 50px;
           border: 1px solid black;
           display: flex;
       }
       
       .son {
           width: 100px;
           height: 100px;
           background-color: blue;
       }
       
       .father2 {
           height: 400px;
           margin: 0 auto;
           margin-top: 50px;
           border: 1px solid black;
           display: inline-flex;
       }
       
       .son2 {
           width: 100px;
           height: 100px;
           background-color: blue;
       }
   </style>
</head>
<body>
   <div class="father">
       <div class="son">
       </div>
       <div class="son">
       </div>
       <div class="son">
       </div>
   </div>
   <div class="father2">
       <div class="son2">
       </div>
       <div class="son2">
       </div>
       <div class="son2">
       </div>
   </div>
</body>
</html>

在這裡插入圖片描述
三、flex-direction
用於設定盒子中的子元素的排列方向。
row 從左到右水平排列子元素(預設值)
column 從上往下垂直排列子元素
row-reverse 從右到左排列子元素
column-reverse 從下往上垂直排列子元素

 <style>
        .father {
            width: 500px;
            height: 400px;
            margin: 0 auto;
            margin-top: 50px;
            border: 1px solid black;
            display: flex;
            /*flex-direction: row;
            flex-direction:  row-reverse;
            flex-direction: column;*/
            flex-direction:  column-reverse ;
        }    
        .son {
            width: 100px;
            height: 100px;
            background-color: blue;
            background-clip: content-box;
            padding: 0 10px;
            box-sizing: border-box;
            font-size: 30px;
            line-height: 100px;
            text-align: center;
        }
    </style>
</head>
<body>

    <div class="father">
        <div class="son">1
        </div>
        <div class="son">2
        </div>
        <div class="son">3
        </div>
    </div>
</body>
</html>

flex-direction: row從左到右水平排列子元素
在這裡插入圖片描述
flex-direction: row-reverse 從右到左排列子元素
在這裡插入圖片描述
flex-direction: column從上往下垂直排列子元素
在這裡插入圖片描述
flex-direction: column-reverse 從下往上垂直排列子元素
在這裡插入圖片描述
四、flex-wrap
規定flex容器是單行還是多行,是否換行
nowrap:不換行(預設值)
wrap:換行
wrap-reverse 反向換行。
flex-flow
是flex-direction與flex-wrap的組合寫法。
flex-flow:flex-direction flex-wrap;
例如

<style>
       .father {
           width: 400px;
           height: 400px;
           margin: 0 auto;
           margin-top: 50px;
           border: 1px solid black;
           display: flex;
           flex-flow: column wrap-reverse;
       }        
       .son {
           width: 100px;
           height: 100px;
           background-color: blue;
           background-clip: content-box;
           padding: 0 10px;
           box-sizing: border-box;
           font-size: 30px;
           line-height: 100px;
           text-align: center;
       }
   </style>
</head>
<body>
   <div class="father">
       <div class="son">1
       </div>
       <div class="son">2
       </div>
       <div class="son">3
       </div>
       <div class="son">4
       </div>
       <div class="son">5
       </div>
   </div>
</body>
</html>

子元素從上到下排列反向換行
在這裡插入圖片描述
五、彈性盒子與彈性元素
彈性盒子:指的是使用display:flex或display:inline-flex宣告的容器。
彈性元素:指的是彈性盒子中的子元素。
主軸與側軸(交叉軸)
主軸方向:為子元素排列的方向。可以通過flex-direction改變。
側軸方向:與主軸方向垂直,為子元素的換行方向。可以通過flex-wrap改變。
六、justify-content
用於控制彈性元素在主軸上的排列方式。
flex-start 元素緊靠主軸的起點(預設值)
在這裡插入圖片描述

flex-end 元素緊靠主軸的終點。
在這裡插入圖片描述

center 元素在主軸上居中。
在這裡插入圖片描述
space-between 第一元素緊靠起點,最後一個元素緊靠終點,餘下的元素平均分配剩餘空間。
在這裡插入圖片描述
space-around 每個元素兩側的間隔相等。元素之間的間隔比元素與容器邊框的間隔要大一倍。
在這裡插入圖片描述
space-evenly 元素間距平均分配
在這裡插入圖片描述

<style>
        .father {
            width: 500px;
            height: 400px;
            margin: 0 auto;
            margin-top: 50px;
            border: 1px solid black;
            display: flex;
            flex-flow: row wrap;
            justify-content:  flex-start ;
            justify-content: flex-end ;
            justify-content:  center ;
            justify-content: space-between;
            justify-content: space-around ;
            justify-content: space-evenly;
        }        
        .son {
            width: 100px;
            height: 100px;
            background-color: blue;
            background-clip: content-box;        
            box-sizing: border-box;
            font-size: 30px;
            line-height: 100px;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son">1
        </div>
        <div class="son">2
        </div>
        <div class="son">3
        </div>
        <div class="son">4
        </div>
    </div>
</body>
</html>

七、align-items
控制元素在側軸上的排列方式。
多行單行都適用的屬性。
flex-start 從側軸開始的地方對齊
flex-end 從側軸結束的地方對齊
center 中間對齊
stretch 拉伸 沒有設定側軸方向上的寬/高時,等於父盒子的寬或高。
例如

    <style>
        .father {
            width: 300px;
            height: 300px;
            margin: 0 auto;
            margin-top: 50px;
            border: 1px solid seagreen;
            display: flex;
            flex-flow: row wrap;
            align-content: stretch;
        }        
        .son {
            width: 100px;           
            background-color: sienna;
            background-clip: content-box;
            box-sizing: border-box;
            font-size: 30px;
            line-height: 100px;
            text-align: center;
        }
    </style>
</head>
<body>  
    <div class="father">
        <div class="son">1
        </div>
        <div class="son">2
        </div>
        <div class="son">3
        </div>
    </div>
</body>
</html>

在這裡插入圖片描述
align-content
控制元素在側軸上的排列方式。只適用於多行顯示的彈性容器。
stretch 拉伸
flex-start 元素緊靠行的起點
flex-end 元素緊靠行的終點
center 元素在行中居中
space-between 第一個元素緊靠行的起點,最後一個元素緊靠行的終點,餘下元素平均分配剩餘空間
space-around 元素在側軸方向上的間隔相等。
space-evenly 元素間距離平均分配
八、彈性元素:
不要再去設定float。
設定完絕對定位後,該元素就不再是彈性元素了,不參與彈性佈局。
彈性元素均為塊級元素。
align-self:
用於控制單個元素在側軸上的排列方式。
stretch 拉伸
flex-start
flex-end
center
九、 flex-grow
用於將彈性盒子的可用空間,按照比例分配給彈性元素。

<style>
      .father {
          width: 400px;
          height: 300px;
          margin: 0 auto;
          margin-top: 50px;
          border: 1px solid seagreen;
          display: flex;
          flex-flow: row wrap;
      }      
      .son {
          width: 100px;
          height: 100px;
          background-color: sienna;
          background-clip: content-box;
          box-sizing: border-box;
          font-size: 30px;
          line-height: 100px;
          text-align: center;
          flex-grow: 1;
      }       
      .son:nth-child(2) {
          background-color: cadetblue;
          flex-grow: 2;
      }
  </style>
</head>
<body>
  <div class="father">
      <div class="son">1
      </div>
      <div class="son">2
      </div>
      <div class="son">3
      </div>
  </div>
</body>
</html>

在這裡插入圖片描述
九、flex-shrink
在彈性盒子裝不下子元素時,對子元素縮小的比例設定。
1.計算缺少的值。
2.當前元素應該縮小比例:802/(1001+802+1001)=44.4%
3.應該縮小的值:缺少的值縮小的比例=8044.4%=35.6px
4.最終尺寸:缺少的值-應該縮小的值 80-35.6=44.4px;

  <style>
        .father{
            width: 200px;
            height: 300px;
            margin: 0 auto ;
            margin-top: 50px;
            border: 1px solid seagreen;
            display: flex;
            flex-flow: row nowrap;
        }
        .son{
            width: 100px;
            height: 100px;
            background-color: sienna;
            background-clip: content-box;
            box-sizing: border-box;
            font-size: 30px;
            line-height: 100px;
            text-align: center;
            flex-grow: 1;
        }
        .son:nth-child(2){
            width: 80px;
            background-color: cadetblue;
            flex-shrink: 2;
        }
    </style>
</head>
<body>

在這裡插入圖片描述
十、flex-basis
大部分情況下與寬度相等。優先順序比寬要高。定義了元素在主軸上的空間。

       <style>
        .father {
            width: 300px;
            height: 300px;
            margin: 0 auto;
            margin-top: 50px;
            border: 1px solid seagreen;
            display: flex;
            flex-flow: row nowrap;
        }
        
        .son {
            width: 100px;
            height: 100px;
            background-color: sienna;
            background-clip: content-box;
            box-sizing: border-box;
            font-size: 30px;
            line-height: 100px;
            text-align: center;
        }
        
        .son:nth-child(2) {
            flex-basis: 80px;
            width: 100px;
            background-color: cadetblue;
        }
    </style>
</head>

<body>
  
    <div class="father">
        <div class="son">1
        </div>
        <div class="son">2
        </div>
        <div class="son">3
        </div>
    </div>
</body>
</html>

在這裡插入圖片描述
複合寫法:
flex:flex-grow flew-shrink flex-basis
order:
用於控制彈性元素的位置。預設為0,數值越小越靠前。

 <style>
      .father {
          width: 300px;
          height: 300px;
          margin: 0 auto;
          margin-top: 50px;
          border: 1px solid seagreen;
          display: flex;
          flex-flow: row nowrap;
      }     
      .son {
          width: 100px;
          height: 100px;
          background-color: sienna;
          background-clip: content-box;
          box-sizing: border-box;
          font-size: 30px;
          line-height: 100px;
          text-align: center;
      }
      
      .son:nth-child(2) {
          width: 100px;
          background-color: cadetblue;
          flex: 2 1 100px;
          order: -2;
      }
  </style>
</head>
<body>
  <div class="father">
      <div class="son">1
      </div>
      <div class="son">2
      </div>
      <div class="son">3
      </div>
  </div>
</body>
</html>

在這裡插入圖片描述