伸缩盒模型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>