伸縮盒模型javascript
CSS3 引入的佈局模式 Flexbox 佈局css
主要思想: 讓容器有能力讓其子項目可以改變其寬度,高度,以最佳方式填充可用空間。html
特色:java
display: flex; 只能控制其子元素web
浮動沒法影響伸縮容器,可是若是內聯伸縮容器 設置了浮動,元素將會以塊級伸縮容器顯示。面試
伸縮容器的 margin 與其內容的 margin 不會重疊瀏覽器
項目構建,會將新版語法構建成老闆語法佈局
主軸在水平方向時,元素要換行,可是子元素沒有 width,此時,使用換軸(父元素加 flex-direction: column;)flex
/**** 新版語法 ****/
#wrap { display: flex; justify-content: center; align-items: center; }
/**** 老版語法 ****/
#wrap {
display: -webkit-flex;
-webkit-box-pack: center;
-webkit-box-align: center;
}
以上代碼適用於 任何類型子元素 的水平垂直居中(塊元素,行內元素,行內塊元素)。url
1. 伸縮容器屬性(父元素屬性)
display: flex;
設置爲塊級伸縮容器。
/**** 新老版本兼容寫法 ****/ #wrap { display: -webkit-box; display: -webkit-flex; display: flex; }
display: inline-flex; 設置爲內聯級伸縮容器。
定義 Flex 項目 在 Flex 容器 中放置的方向。
設置 伸縮項目 在主軸上的對齊方式。
指定如何在 伸縮項目 之間分佈伸縮容器富裕空間
設置 伸縮項目 在主軸上的對齊方式。
align-items 控制的是每一行的富裕空間
align-items 是用來管理伸縮容器側軸方向的額外空間
flex 項目 實現換行
新版本 flex 容器 特有屬性
換行之後:
生效條件:
是 flex-wrap 和 flex-direction 的縮寫
等同於 flex-wrap: wrap-reverse; flex-direction: colum;
waiting
2. 伸縮項目屬性(子元素屬性)
設置 Flex 項目 的擴大比例,或者說,空間分配比例
flex-grow 處理的是 伸縮容器內部 剩下的額外空間
默認值爲 0,不能取負值,沒有單位
<style> .box{ width:100%; border-bottom: 1px solid red; display:flex; } .box div{ width:100px; border:1px solid; } .box div:nth-child(1){ flex-grow:1; } .box div:nth-child(2){ flex-grow:2; } .box div:nth-child(3){ flex-grow:3; } </style> </head> <body> <div class="box"> <div>A</div> <div>B</div> <div>C</div> </div> </body>
收縮率 flex-shrink 處理的是 因爲伸縮容器過小, 溢出的額外空間。處理是,按比例分配,不寫比例,默認1份
默認值 1,即若是溢出,每一個子元素均分容器主軸空間
默認 將溢出部分分紅 n 份,每一個 伸縮項目 縮放 1/n
<style> .box{ width:100px; border-bottom: 1px solid red; display:flex; } .box div{ width:100px; border:1px solid; } .box div:nth-child(1){ flex-shrink:1; } .box div:nth-child(2){ flex-shrink:2; } .box div:nth-child(3){ flex-shrink:1; } </style> </head> <body> <div class="box"> <div>A</div> <div>B</div> <div>C</div> </div> </body>
flex 項目 的排列順序,沿着主軸方向進行排序
未排序元素正常排列再前,將 排序元素 單獨拿出來,再在後面排序
flex 項目自身的側軸富裕空間
flex 項目 的基準值
/**** 新版語法(面試題) ****/
#inner_box {
flex-basis: 0; /**** 讓 伸縮項目 的 主軸空間(width/height) 始終等於 0 ****/
flex-grow: 1;
}
/**** 老版語法(面試題) ****/
#inner_box {
width: 0;
-webkit-box-flex: 1; /**** 等同於新版的 flex-grow ****/
}
/**** 新版本 特有實現 等分佈局 ****/ #inner_box { flex: 1; /**** ----等同於 flex-basis: 0; flex-grow: 1; flex-shrink: 1; ****/ }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> * { margin: 0; padding: 0; } /**** Double Line Goods ****/ a { text-decoration: none; } #top_line, #bottom_line { display: flex; list-style: none; } #top_line li, #bottom_line li { /**** 等分佈局 ****/ flex-flow: 0; flex-grow: 1; display: flex; justify-content: center; /**** li 中 子元素 水平居中 ****/ } #top_line li a, #bottom_line li a { display: flex; flex-direction: column; /**** a 中 子元素 在一列 ****/ align-items: center; /**** a 中 文字水平居中 ****/ } #top_line li a::before, #bottom_line li a::before { content:""; display: block; width: 86px; height: 86px; } #top_line li:nth-child(1) a::before { background-image: url(./img/01.png); } #top_line li:nth-child(2) a::before { background-image: url(./img/02.png); } #top_line li:nth-child(3) a::before { background-image: url(./img/03.png); } #top_line li:nth-child(4) a::before { background-image: url(./img/04.png); } #top_line li:nth-child(5) a::before { background-image: url(./img/05.png); } #bottom_line li:nth-child(1) a::before { background-image: url(./img/06.png); } #bottom_line li:nth-child(2) a::before { background-image: url(./img/07.png); } #bottom_line li:nth-child(3) a::before { background-image: url(./img/08.png); } #bottom_line li:nth-child(4) a::before { background-image: url(./img/09.png); } #bottom_line li:nth-child(5) a::before { background-image: url(./img/10.png); } </style> </head> <body> <ul id="top_line"> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> </ul> <ul id="bottom_line"> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> <li><a href="javascript:;">天貓</a></li> </ul> </body> </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Dice</title> <style type="text/css"> *{ padding: 0; margin: 0; } body { width: 100%; padding-top: 300px; color: #000; background: #96b377; font: 14px Helvetica, Arial, sans-serif; display: flex; justify-content: center; align-items: center; } /**** flex 實現 Dice ****/ /* 白點 */ .dice_point { width: 20px; height: 20px; border-radius: 100%; background-color: #fff; } /* 黑底 */ .diy_dice { width: 140px; height: 140px; background-color: #000; } #dice_1 { display: flex; justify-content: center; align-items: center; } #dice_2 { display: flex; justify-content: space-between; padding: 20px 20px; box-sizing: border-box; } #dice_2>div:nth-child(2){ align-self: flex-end; } #dice_3 { display: flex; justify-content: space-between; padding: 20px 20px; box-sizing: border-box; } #dice_3>div:nth-child(2){ align-self: center; } #dice_3>div:nth-child(3){ align-self: flex-end; } #dice_4, #dice_5, #dice_6 { display: flex; justify-content: space-between; padding: 20px 20px; box-sizing: border-box; } #dice_4>div:nth-child(1), #dice_4>div:nth-child(2), #dice_5>div:nth-child(1), #dice_5>div:nth-child(3), #dice_6>div:nth-child(1), #dice_6>div:nth-child(2) { display: flex; flex-direction: column; justify-content: space-between; } #dice_5>div:nth-child(2){ align-self: center; } /**** 3D 盒子 + 旋轉****/ #dice_box { position: relative; width: 140px; height: 140px; perspective: 2800px; transform-style: preserve-3d; transform-origin: 50% 50% -70px; transform: rotateX(-20deg) rotateY(20deg); animation: turnaround 5s infinite alternate; } @keyframes turnaround { from{ transform: rotateX(0deg) rotateY(0deg); } to{ transform: rotateX(-360deg) rotateY(360deg); } } .diy_dice { position: absolute; } #dice_2 { top: -100%; transform-origin: bottom; transform: rotateX(90deg); } #dice_3 { left: 100%; transform-origin: left; transform: rotateY(90deg); } #dice_4 { left: -100%; transform-origin: right; transform: rotateY(-90deg); } #dice_5 { top: 100%; transform-origin: top; transform: rotateX(-90deg); } #dice_6 { transform: rotateY(180deg) translateZ(140px) ; } </style> </head> <body> <div id="dice_box"> <div id="dice_1" class="diy_dice"> <div class="dice_point"></div> </div> <div id="dice_2" class="diy_dice"> <div class="dice_point"></div> <div class="dice_point"></div> </div> <div id="dice_3" class="diy_dice"> <div class="dice_point"></div> <div class="dice_point"></div> <div class="dice_point"></div> </div> <div id="dice_4" class="diy_dice"> <div> <div class="dice_point"></div> <div class="dice_point"></div> </div> <div> <div class="dice_point"></div> <div class="dice_point"></div> </div> </div> <div id="dice_5" class="diy_dice"> <div> <div class="dice_point"></div> <div class="dice_point"></div> </div> <div class="dice_point"></div> <div> <div class="dice_point"></div> <div class="dice_point"></div> </div> </div> <div id="dice_6" class="diy_dice"> <div> <div class="dice_point"></div> <div class="dice_point"></div> <div class="dice_point"></div> </div> <div> <div class="dice_point"></div> <div class="dice_point"></div> <div class="dice_point"></div> </div> </div> </div> </body> </html>