【CSS3系列】第八章 · 伸缩盒模型
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
写在前面
Hello大家好 我是【麟-小白】一位软件工程专业的学生喜好计算机知识。希望大家能够一起学习进步呀本人是一名在读大学生专业水平有限如发现错误或不足之处请多多指正谢谢大家
如果小哥哥小姐姐们对我的文章感兴趣请不要吝啬你们的小手多多点赞加关注呀❤❤❤ 爱你们
目录
【往期回顾】
【其他系列】
1. 伸缩盒模型
1.1 伸缩盒模型简介
- 2009 年 W3C 提出了一种新的盒子模型 —— Flexible Box 伸缩盒模型又称弹性盒子。
- 它可以轻松的控制元素分布方式、元素对齐方式、元素视觉顺序 .......
- 截止目前除了在部分 IE 浏览器不支持其他浏览器均已全部支持。
- 伸缩盒模型的出现逐渐演变出了一套新的布局方案 —— flex 布局。
小贴士
- 传统布局是指基于传统盒状模型主要靠 display 属性 + position 属性 + float属性。
- flex 布局目前在移动端应用比较广泛因为传统布局不能很好的呈现在移动设备上。
1.2 伸缩容器、伸缩项目
伸缩容器 开启了 flex 的元素就是伸缩容器。
- 给元素设置
- display:flex 或 display:inline-flex 该元素就变为了伸缩容器。
- display:inline-flex 很少使用因为可以给多个伸缩容器的父容器也设置为伸缩容器。
- 一个元素可以同时是伸缩容器、伸缩项目。
伸缩项目 伸缩容器所有 子元素 自动成为了伸缩项目。
- 仅伸缩容器的子元素成为了伸缩项目孙子元素、重孙子元素等后代不是伸缩项目。
- 无论原来是哪种元素块、行内块、行内一旦成为了伸缩项目全都会“块状化”。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>01_伸缩容器_伸缩项目</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } .inner3 { display: flex; /* font-size: 20px; */ /* line-height: 2em; */ } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner inner3"> <div>a</div> <div>b</div> <div>c</div> </div> </div> </body> </html>
1.3 主轴与侧轴
- 主轴 伸缩项目沿着主轴排列主轴默认是水平的默认方向是从左到右左边是起点右边是终点。
- 侧轴 与主轴垂直的就是侧轴侧轴默认是垂直的默认方向是从上到下上边是起点下边是终点。
1.4 主轴方向
- 属性名 flex-direction
- 常用值如下
- row 主轴方向水平从左到右 —— 默认值
- row-reverse 主轴方向水平从右到左。
- column 主轴方向垂直从上到下。
- column-reverse 主轴方向垂直从下到上。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>02_主轴方向</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ /* flex-direction: row; */ /* 调整主轴方向水平从右到左 */ flex-direction: row-reverse; /* 调整主轴方向垂直从上到下 */ /* flex-direction: column; */ /* 调整主轴方向垂直从下到上 */ /* flex-direction: column-reverse; */ } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner">3</div> </div> </body> </html>
1.5 主轴换行方式
- 属性名 flex-wrap
- 常用值如下
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>03_主轴换行方式</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式不换行默认值 */ /* flex-wrap: nowrap; */ /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴换行方式反向换行 */ /* flex-wrap: wrap-reverse; */ } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner">3</div> <div class="inner">4</div> <div class="inner">5</div> <div class="inner">6</div> <div class="inner">7</div> <div class="inner">8</div> <div class="inner">9</div> <div class="inner">10</div> <div class="inner">11</div> </div> </body> </html>
1.6 flex-flow
- flex-flow 是一个复合属性复合了 flex-direction 和 flex-wrap 两个属性。 值没有顺序要求。
flex-flow: row wrap;
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>04_flex-flow</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ /* flex-direction: row; */ /* 主轴换行方式换行 */ /* flex-wrap: wrap; */ flex-flow: row wrap; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner">3</div> <div class="inner">4</div> <div class="inner">5</div> <div class="inner">6</div> <div class="inner">7</div> <div class="inner">8</div> <div class="inner">9</div> <div class="inner">10</div> <div class="inner">11</div> </div> </body> </html>
1.7 主轴对齐方式
- 属性名 justify-content
- 常用值如下
- flex-start 主轴起点对齐。—— 默认值
- flex-end 主轴终点对齐。
- center 居中对齐
- space-between 均匀分布两端对齐最常用。
- space-around 均匀分布两端距离是中间距离的一半。
- space-evenly 均匀分布两端距离与中间距离一致。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>05_主轴对齐方式</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴的对齐方式主轴的起始位置 */ /* justify-content: flex-start; */ /* 主轴的对齐方式主轴的结束位置 */ /* justify-content: flex-end; */ /* 主轴的对齐方式中间对齐 */ /* justify-content: center; */ /* 主轴的对齐方式项目均匀的分布在一行中项目与项目之间的距离是项目距边缘的二倍 */ /* justify-content: space-around; */ /* 主轴的对齐方式项目均匀的分布在一行中项目与项目之间的距离是相等的项目距边缘没有距离 */ justify-content: space-between; /* 主轴的对齐方式项目均匀的分布在一行中 */ /* justify-content: space-evenly; */ } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner">2</div> <div class="inner">3</div> </div> </body> </html>
1.8 侧轴对齐方式
一行的情况
- 所需属性 align-items
- 常用值如下
- flex-start 侧轴的起点对齐。
- flex-end 侧轴的终点对齐。
- center 侧轴的中点对齐。
- baseline : 伸缩项目的第一行文字的基线对齐。
- stretch 如果伸缩项目未设置高度将占满整个容器的高度。—— 默认值
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>06_侧轴对齐方式_一行</title> <style> .outer { width: 1000px; height: 600px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; /* 侧轴的对齐方式侧轴的起始位置对齐 */ align-items: flex-start; /* 侧轴的对齐方式侧轴的结束位置对齐 */ /* align-items: flex-end; */ /* 侧轴的对齐方式侧轴的中间位置对齐 */ /* align-items: center; */ /* 侧轴的对齐方式侧轴的中间位置对齐 */ /* align-items: baseline; */ /* 侧轴的对齐方式拉伸到整个父容器前提伸缩项目不能给高度默认 */ /* align-items: stretch; */ } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } .inner2 { height: 300px; font-size: 80px; } .inner3 { height: 100px; } </style> </head> <body> <div class="outer"> <div class="inner">1x</div> <div class="inner inner2">2x</div> <div class="inner inner3">3x</div> </div> </body> </html>
多行的情况
- 所需属性 align-content
- 常用值如下
- flex-start 与侧轴的起点对齐。
- flex-end 与侧轴的终点对齐。
- center 与侧轴的中点对齐。
- space-between 与侧轴两端对齐中间平均分布。
- space-around 伸缩项目间的距离相等比距边缘大一倍。
- space-evenly : 在侧轴上完全平分。
- stretch 占满整个侧轴。—— 默认值
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>07_侧轴对齐方式_多行</title> <style> .outer { width: 1000px; height: 900px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; /* 侧轴的对齐方式多行侧轴的起始位置对齐 */ align-content: flex-start; /* 侧轴的对齐方式多行侧轴的结束位置对齐 */ /* align-content: flex-end; */ /* 侧轴的对齐方式多行侧轴的中间位置对齐 */ /* align-content: center; */ /* 侧轴的对齐方式多行伸缩项目之间的距离是相等的且是边缘距离的2倍 */ /* align-content:space-around; */ /* 侧轴的对齐方式多行伸缩项目之间的距离是相等的且边缘没有距离 */ /* align-content:space-between; */ /* 侧轴的对齐方式多行伸缩项目之间的距离是相等的 */ /* align-content:space-evenly; */ /* 侧轴的对齐方式多行拉伸默认 */ /* align-content: stretch; */ } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } .inner2 { height: 300px; } .inner3 { height: 100px; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner inner2">2</div> <div class="inner inner3">3</div> <div class="inner">4</div> <div class="inner">5</div> <div class="inner">6</div> <div class="inner">7</div> <div class="inner">8</div> <div class="inner">9</div> <div class="inner">10</div> <div class="inner">11</div> </div> </body> </html>
1.9 flex 实现水平垂直居中
- 方法一父容器开启 flex 布局随后使用 justify-content 和 align-items 实现水平垂直居中
.outer { width: 400px; height: 400px; background-color: #888; display: flex; justify-content: center; align-items: center; } .inner { width: 100px; height: 100px; background-color: orange; }
- 方法二父容器开启 flex 布局随后子元素 margin: auto
.outer { width: 400px; height: 400px; background-color: #888; display: flex; } .inner { width: 100px; height: 100px; background-color: orange; margin: auto; }
1.10 伸缩性
1. flex-basis
- 概念 flex-basis 设置的是主轴方向的基准长度会让宽度或高度失效。
- 备注主轴横向宽度失效主轴纵向高度失效
- 作用浏览器根据这个属性设置的值计算主轴上是否有多余空间默认值 auto 即伸缩项目的宽或高。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>09_项目在主轴的基准长度</title> <style> .outer { width: 1000px; height: 900px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; } .inner2 { /* 设置伸缩项目在主轴上的基准长度若主轴是横向的宽失效若主轴是纵向的高失效 */ flex-basis: 300px; } </style> </head> <body> <div class="outer"> <div class="inner">1</div> <div class="inner inner2">2</div> <div class="inner">3</div> </div> </body> </html>
2. flex-grow伸
- 概念 flex-grow 定义伸缩项目的放大比例默认为 0 即纵使主轴存在剩余空间也不拉伸放大。
- 规则
- 若所有伸缩项目的 flex-grow 值都为 1 则它们将等分剩余空间如果有空间的话。
- 若三个伸缩项目的 flex-grow 值分别为 1 、 2 、 3 则分别瓜分到 1/6 、 2/6 、3/6 的空间。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>10_伸缩项目_伸</title> <style> .outer { width: 1000px; height: 900px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ flex-wrap: wrap; /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; flex-grow: 0; } .inner1 { flex-grow: 1; } .inner2 { flex-grow: 2; width: 300px; } .inner3 { flex-grow: 3; } </style> </head> <body> <div class="outer"> <div class="inner inner1">1</div> <div class="inner inner2">2</div> <div class="inner inner3">3</div> </div> </body> </html>
3. flex-shrink缩
- 概念 flex-shrink 定义了项目的压缩比例默认为 1 即如果空间不足该项目将会缩小。
- 收缩项目的计算略微复杂一点我们拿一个场景举例
- 例如
- 三个收缩项目宽度分别为 200px 、 300px 、 200px 它们的 flex-shrink 值分别 为 1 、 2 、 3 若想刚好容纳下三个项目需要总宽度为 700px 但目前容器只有 400px 还差 300px 所以每个人都要收缩一下才可以放下具体收缩的值这样计算
1. 计算分母 (200×1) + (300×2) + (200×3) = 1400
2. 计算比例
- 项目一 (200×1) / 1400 = 比例值1
- 项目二 (300×2) / 1400 = 比例值2
- 项目三 (200×3) / 1400 = 比例值3
3. 计算最终收缩大小
- 项目一需要收缩 比例值1 × 300
- 项目二需要收缩 比例值2 × 300
- 项目三需要收缩 比例值3 × 300
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>11_伸缩项目_缩</title> <style> .outer { width: 400px; height: 900px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ /* flex-wrap: wrap; */ /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; /* 侧轴的对齐方式 */ align-content: flex-start; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; flex-grow: 1; } .inner1 { flex-shrink: 1; } .inner2 { flex-shrink: 2; width: 300px; } .inner3 { flex-shrink: 3; } </style> </head> <body> <div class="outer"> <div class="inner inner1"> <div style="width: 50px;height:50px;background-color: green;">1</div> </div> <div class="inner inner2">2</div> <div class="inner inner3">3</div> </div> </body> </html>
1.11 flex复合属性
- flex 是复合属性复合了flex-grow 、 flex-shrink 、 flex-basis 三个属性默认值为 0 1 auto 。
- 如果写 flex:1 1 auto 则可简写为flex:auto
- 如果写 flex:1 1 0 则可简写为flex:1
- 如果写 flex:0 0 auto 则可简写为 flex:none
- 如果写 flex:0 1 auto 则可简写为flex:0 auto —— 即 flex 初始值。
1.12 项目排序
- order 属性定义项目的排列顺序。数值越小排列越靠前默认为 0 。
1.13 单独对齐
- 通过 align-self 属性可以单独调整某个伸缩项目的对齐方式
- 默认值为 auto 表示继承父元素的 align-items 属性。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>13_项目排序与单独对齐</title> <style> .outer { width: 600px; height: 900px; background-color: #888; margin: 0 auto; /* 伸缩盒模型相关属性-start */ /* 将该元素变为了伸缩容器开启了flex布局 */ display: flex; /* 调整主轴方向水平从左到右默认 */ flex-direction: row; /* 主轴换行方式换行 */ /* flex-wrap: wrap; */ /* 主轴的对齐方式主轴的起始位置 */ justify-content: flex-start; /* 侧轴的对齐方式 */ align-content: flex-start; } .inner { width: 200px; height: 200px; background-color: skyblue; border: 1px solid black; box-sizing: border-box; /* 可以拉伸 可以压缩 设置基准长度为0可简写为flex:1 */ flex: 1 1 0; } .inner1 { order: 3; } .inner2 { order: 2; } .inner3 { order: 1; } .inner2 { align-self: center; } </style> </head> <body> <div class="outer"> <div class="inner inner1">1</div> <div class="inner inner2">2</div> <div class="inner inner3">3</div> </div> </body> </html>
结语
本人会持续更新文章的哦希望大家一键三连你们的鼓励就是作者不断更新的动力