博客列表 >前端弹性布局flex基础知识

前端弹性布局flex基础知识

emagic
emagic原创
2020年06月23日 21:59:00818浏览

0622作业

1.基于浮动的两列布局复习

关键是

  • 1.通过float: left;设置左边栏。
  • 2.float: right;设置内容区
  • 3.为解决因高度塌陷导致页脚占据主体位置被遮挡 ,让父级可以包住子元素,.wrap容器设置overflow: hidden属性;
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>基于浮动的两列布局复习</title>
  7. <style>
  8. header,footer,aside,main {
  9. /* 各自给一个初始化的背景色 */
  10. background-color: #ccc;
  11. }
  12. header,footer {
  13. /* 页眉、页脚的高度设置 */
  14. height: 50px;
  15. }
  16. main,aside {
  17. /* 主体和边栏给个最小高度撑起来,没有内容也可以显示 */
  18. min-height: 500px;
  19. }
  20. .wrap {
  21. /* 容器浮动设置 */
  22. width: 1000px;
  23. border: 1px solid #000;
  24. /* 解决因高度塌陷导致页脚占据主体位置被遮挡 ,让父级可以包住子元素*/
  25. overflow: hidden;
  26. /* 容器居中设置 */
  27. margin: 10px auto;
  28. }
  29. aside {
  30. width: 200px;
  31. /* 将侧边栏设置为左浮动 */
  32. float: left;
  33. }
  34. main {
  35. /* 因为总宽度是1000,左边aside占据了200,剩下800,留下部分间隔作为外边距*/
  36. width: 790px;
  37. /* 将主体设置为右浮动 */
  38. float: right;
  39. }
  40. </style>
  41. </head>
  42. <body>
  43. <header>页眉</header>
  44. <div class="wrap">
  45. <aside>侧边栏</aside>
  46. <main>主体内容区</main>
  47. </div>
  48. <footer>页脚</footer>
  49. </body>
  50. </html>

2.基于定位的两列布局复习

关键步骤:

  • 使用定位的方法即使父元素包不住子元素也不能用overflow: hidden;,该属性适用于float元素,这里用定位没用浮动也是无法包住溢出元素的。
  • 解决方案 :设置继承高度。为防止超出,左边栏aside和内容区main设置min-height: inherit;最小高度自动继承父元素的高度
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>基于定位实现的两列布局复习</title>
  7. <style>
  8. header,footer,aside,main {
  9. /* 各自给一个初始化的背景色 */
  10. background-color: #ccc;
  11. }
  12. header,footer {
  13. /* 页眉、页脚的高度设置 */
  14. height: 50px;
  15. }
  16. main,aside {
  17. /* 主体和边栏给个最小高度撑起来,没有内容也可以显示 */
  18. min-height: 500px;
  19. }
  20. .wrap {
  21. /* 设置定位父级作为参考点 */
  22. position: relative;
  23. width: 1000px;
  24. border: 1px solid #000;
  25. /* 容器居中设置 */
  26. margin: 10px auto;
  27. /* 这里包不住也不能用overflow: hidden;,该属性适用于float元素,这里用定位没用浮动也是无法包住溢出元素的 */
  28. /* 解决方案:添加高度 */
  29. min-height: 600px;
  30. }
  31. aside {
  32. width: 200px;
  33. /* 左边栏设为绝对定位,找父元素从左上角开始定位 */
  34. position: absolute;
  35. /* 为防止超出,最小高度自动继承父元素的高度 */
  36. min-height: inherit;
  37. /* 左边栏左上角对齐父元素左上角,下面的top: 0;left: 0;是默认值,可以省略 */
  38. top: 0;
  39. left: 0;
  40. }
  41. main {
  42. /* 因为总宽度是1000,左边aside占据了200,剩下800,留下部分间隔作为外边距*/
  43. width: 790px;
  44. background-color: wheat;
  45. /* 内容栏也设为绝对定位*/
  46. position: absolute;
  47. /* 找父元素右上角定位 */
  48. /* 为防止超出,最小高度自动继承父元素的高度 */
  49. min-height: inherit;
  50. right: 0;
  51. }
  52. </style>
  53. </head>
  54. <body>
  55. <header>页眉</header>
  56. <div class="wrap">
  57. <aside>侧边栏</aside>
  58. <main>主体内容区</main>
  59. </div>
  60. <footer>页脚</footer>
  61. </body>
  62. </html>

3.内容的多栏/多列显示

关键代码

  • 分列显示 column-count: 列数

  • 分隔条 column-rule

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>内容的多栏/多列显示</title>
  7. <style>
  8. /* 样式初始化的套路 */
  9. * {
  10. padding: 0;
  11. margin: 0;
  12. box-sizing: border-box;
  13. }
  14. /* 可以用一个伪类:root来代替html */
  15. :root {
  16. font-size: 16px;
  17. color: #555;
  18. }
  19. div {
  20. border: 1px solid #000;
  21. /* 相对跟元素的字体大小进行设置padding */
  22. padding: 1rem;
  23. width: 60rem;
  24. /* 居中设置 margin:上下 30px 左右自动 */
  25. margin: 30px auto;
  26. }
  27. div {
  28. /* 分列显示 column-count: 列数 */
  29. column-count: 3;
  30. /* 设置列数后,列宽可以自动计算,反之亦然,既然是自动,其实也可以略去不写 */
  31. /* column-width: auto; */
  32. /* 分隔条 */
  33. column-rule-style: solid;
  34. /* 分隔条的粗细 column-rule-width:3px 默认值是3px*/
  35. column-rule-width: 1px;
  36. /* 分割线的颜色,默认为黑色 */
  37. column-rule-color: salmon;
  38. /* 以上三个column-rule设置可以简写合并为column-rule */
  39. column-rule: 1px solid salmon;
  40. }
  41. </style>
  42. </head>
  43. <body>
  44. <div>
  45. 6月21日,交个朋友科技公司创始人罗永浩在做客极客公园Rebuild 2020大会时表示,自己做直播带货在形式上做到了 60 分,内容上还是不及格的。“我们每天都在修正自己的意见,修正自己的想法,我们有好几个尝试的方向正在慢慢试。然后我估计再做 3 个月以上,可能就能到 80 分、90 分这个样子。” 罗永浩谈到,因为他直播卖的是别人的产品,不是自己的产品,所以某种程度上是一个服务性质的,他个人的意志在产品上是没有体现的,但是未来如果他们自己做自有品牌,就会在产品上体现很多他个人的想法。罗永浩认为,做自有品牌更大概率是投资的形式,多过自己做的可能性。 罗永浩以前做锤子科技,只有不到 10 个月是正现金流,剩下全是在亏的,所以公司团建就成了一门硬功夫,现在做直播电商,因为它第一天就是盈利的,所以根本不搞团建,发红包就完了。 多年以来大家说罗永浩是脱口秀演员、相声演员,但实际上他一天也没有做过。不过,罗永浩透露,他自己现在就准备再勇敢的走出这一步,准备在一个大平台上做一个正经的综艺节目,就是一个脱口秀节目,可能先季播,后面做成是周播的,现在正在组建团队罗永浩透露,公司内部很冷静、很清醒地认为,他做直播电商还需要扩大自己的影响面,一定要出圈。“因为我们讨论到一个问题,就是说如果我们想做成中国最成功的直播电商主播,那我还要扩大我的影响面。我们内部很冷静、很清醒地说一定要破这个圈,要出圈。最大范围的出圈一定不是别的,就是做娱乐行业相关的,才能最大程度出圈,所以我们决定做这么一档节目。”
  46. </div>
  47. </body>
  48. </html>

4. column-count分列

  • column-count分列只能对称等分,布局中不推荐使用,主要用途是内容排版
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>column-count分列</title>
  7. <style>
  8. header,
  9. footer {
  10. background-color: skyblue;
  11. height: 40px;
  12. }
  13. .container {
  14. width: 1000px;
  15. margin: 10px auto;
  16. border: 1px solid #000;
  17. /* 分栏,示例分三列 */
  18. column-count: 3;
  19. }
  20. aside {
  21. background-color: lightgreen;
  22. min-height: 600px;
  23. }
  24. main {
  25. background-color: lightcoral;
  26. min-height: 600px;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <header>页眉</header>
  32. <div class="container">
  33. <aside>左边栏</aside>
  34. <main>主体内容</main>
  35. <aside>右边栏</aside>
  36. </div>
  37. <footer>页脚</footer>
  38. </body>
  39. </html>

5. flexbox弹性盒子布局

  • 建议使用火狐浏览器方便调试
    下载地址 http://www.firefox.com.cn/download/
    vscode 文件->首选项->设置中 搜索框输入browser

    自定义Live Server打开的浏览器为firefox

  • 如果这个容器中的内容使用FlexBox弹性盒子布局,第一步必须display: flex;将这个容器转为弹性盒子

  • 查看盒子布局信息点击flex标签

  • display:flex 将当前容器转为弹性盒子

  • 一旦将父元素转为弹性容器,内部的子元素就自动成为:弹性项目
  • 不管这个项目标签之前是什么类型,统统转为“行内块”
  • 行内:全部在一排显示
  • 块:可以设置高和宽
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>FlexBox弹性盒子布局</title>
  7. <style>
  8. .container {
  9. width: 300px;
  10. /* 如果这个容器中的内容使用FlexBox弹性盒子布局,第一步必须将这个容器转为弹性盒子 */
  11. /* 将当前容器转为弹性容器 */
  12. display: flex;
  13. }
  14. .container > .item {
  15. /* 一旦将父元素转为弹性容器,内部的子元素就自动成为:弹性项目*/
  16. /* 不管这个项目标签之前是什么类型,统统转为“行内块” */
  17. /* 行内:全部在一排显示 */
  18. /* 块:可以设置高和宽 */
  19. flex: auto;
  20. /* width: 60px;
  21. height: 60px; */
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="container">
  27. <!-- 不管多少个都会在一样自动缩放 -->
  28. <item class="item">1</item>
  29. <span class="item">2</span>
  30. <a class="item">3</a>
  31. <a class="item">4</a>
  32. <a class="item">5</a>
  33. <a class="item">6</a>
  34. <a class="item">7</a>
  35. <a class="item">8</a>
  36. <a class="item">9</a>
  37. </div>
  38. </body>
  39. </html>

6. 多行容器的换行排列

  • 所有的项目必须沿着主轴排列
  • 跟主轴垂直的叫交叉轴
  • 默认叫单行容器,一旦换行叫多行容器

  • 换行显示 flex-wrap:warp; 默认是flex-wrap:nowrap 即不换行

  1. .container {
  2. flex-wrap: wrap;
  3. }

容器的对齐方式

7. 单行容器中的项目对齐方式

justify-content:控制所有项目在主轴上对齐方式,本质上是设置容器中的剩余空间在所有”项目之间”的分配方案。

  1. .container {
  2. width: 300px;
  3. display: flex;
  4. /* justify-content: 控制所有项目在主轴上的对齐方式; */
  5. /* 本质是:设置容器中的剩余空间在所有 “项目之间”的分配方案 */
  6. /* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
  7. /* 从书写方向起始方向开始 */
  8. justify-content: flex-start;
  9. /* 从书写方向终止方向排列 */
  10. justify-content: flex-end;
  11. /* 单行居中排列 */
  12. justify-content: center;
  13. /* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
  14. /* 两端齐平父容器边界,中间剩余空间平均分布 */
  15. justify-content: space-between;
  16. /* 分散对齐: 剩余空间在所有项目二侧平均分配 */
  17. justify-content: space-around;
  18. /* 各元素两端都平均分布 ,瓜分剩余空间*/
  19. justify-content: space-evenly;
  20. }
  21. .container > .item {
  22. width: 60px;
  23. }

(1) 容器剩余空间在所有项目两边是如何分配的,将全部项目看成一个整体
justify-content:flex-start;

justify-content:flex-end;

justify-content:center;

(2)容器剩余空间在所有项目之间是如何分配的,将项目看成一个个独立的个体

justify-content:space-between;(两端齐平父容器边界,中间剩余空间平均分布)

justify-content:space-around;(分散对齐:剩余空间在所有项目两侧平均分配)

justify-content:space-evently;(各元素两端都平均分布)

8.多行容器中的项目对齐方式

多行容器使用的是align-content

  1. .container {
  2. width: 300px;
  3. display: flex;
  4. /* 多行容器 */
  5. flex-wrap: wrap;
  6. height: 150px;
  7. /* align-content: 设置多行容器中的项目排列; */
  8. /* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
  9. /* 默认样式 */
  10. align-content: stretch;
  11. /* (多行-全部子项作为一个整体 ,起始边开始排 */
  12. align-content: flex-start;
  13. /* 多行-全部子项作为一个整体 ,终止边开始排 */
  14. align-content: flex-end;
  15. /* 多行-全部子项作为一个整体 ,中间开始排 */
  16. align-content: center;
  17. /* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
  18. /* 将`每行项目组`看成一个个独立的个体 */
  19. /* 两端齐平父容器上下边界,各行中间剩余空间平均分布 */
  20. align-content: space-between;
  21. /* 多行分散对齐:剩余空间在所有项目两侧平均分配 */
  22. align-content: space-around;
  23. /* 各行两端都平均分布 */
  24. align-content: space-evenly;
  25. }

(1) 容器剩余空间在所有项目两边是如何分配的,将全部项目看成一个整体
align-content:strentch (默认值)

align-content:flex-start;(多行-全部子项作为一个整体 ,起始边开始排)

align-content:flex-end;(多行-全部子项作为一个整体 ,终止边开始排)

align-content:center;(多行-全部子项作为一个整体 ,中间开始排)

(2)容器剩余空间在所有项目之间是如何分配的,将每行项目组看成一个个独立的个体
align-content:space-between;(两端齐平父容器上下边界,各行中间剩余空间平均分布)

align-content:space-around;(多行分散对齐:剩余空间在所有项目两侧平均分配)

align-content:space-evently;(各行两端都平均分布)

9. 主轴为垂直方向时的项目排列

主轴方向:默认为行flex-direction:row;

改变方向为垂直列的方向flex-direction:column;

(1)项目两边分配
justify-content:flex-start;(全部子项作为一个整体 ,起始边开始排)

justify-content:flex-end;(全部子项作为一个整体 ,终止边开始排)

justify-content:center;(全部子项作为一个整体 ,中间开始排)

(2)项目之间分配

justify-content: space-between;

justify-content: space-around;

justify-content: space-evenly;

10. 所有项目(items)在交叉轴(垂直于主轴)上的排列

  • 项目在交叉轴上默认是自动伸缩的,默认值为align-items: stretch

align-items: flex-start;

align-items: flex-end;

align-items: center;

11.主轴方向与项目排列的简写

flex-direction: row;
flex-wrap: nowrap;
以上两个可以简写为:flex-flow: row nowrap,这是默认值,都可以不写
flex-flow: column wrap;

12. 导航(用flexbox容器实现)

  1. /* 初始化套路 */
  2. * {
  3. padding: 0;
  4. margin: 0;
  5. box-sizing: border-box;
  6. }
  7. a {
  8. /* 取消超链接的下划线 */
  9. text-decoration: none;
  10. color: bisque;
  11. }
  12. nav {
  13. height: 40px;
  14. background-color: green;
  15. padding: 0 50px;
  16. /* 转为弹性盒子布局 */
  17. display: flex;
  18. }
  19. nav a {
  20. /* 继承行高 */
  21. height: inherit;
  22. /* line-height和当前盒子高度一样就可以实现居中效果 */
  23. line-height: 40px;
  24. padding: 0 15px;
  25. }
  26. nav a:hover {
  27. background-color: red;
  28. /* 文本设置白色高光 */
  29. color: white;
  30. }
  31. /* 一般登录放到最右边 */
  32. nav a:last-of-type {
  33. /* 实现自动靠右,把剩余空间全部给最后的登录这个元素,它的margin自动计算把尽可能大的空间全部左边外边距 */
  34. margin-left: auto;
  35. }

13.控制项目顺序

  • order控制项目的顺序
    每个项目的order默认是0,越大越往后排
  1. <style>
  2. .container {
  3. width: 200px;
  4. height: 50px;
  5. display: flex;
  6. }
  7. span {
  8. width: 50px;
  9. }
  10. span:first-of-type {
  11. /* order默认为0,值越大顺序越靠后 */
  12. order: 1;
  13. }
  14. span:last-of-type {
  15. order: -1;
  16. }

小结

Flex弹性布局常用属性

属性 功能
display:flex 声明该容器为flex容器
flex-wrap 是否换行,是否转为多行容器,默认单行。warp参数为多行允许换行
justify-content                                                                            控制所有项目在主轴上的对齐方式(适用于单行),一种是容器剩余空间在所有项目两边是如何分配的,将全部项目看成一个整体,参数有flex-start; flex-end; center;另一种容器剩余空间在所有项目之间是如何分配的,将项目看成一个个独立的个体,参数有space-between; space-around; space-evenly;
align-content 控制多行容器中的项目对齐方式(适用于多行),默认参数是stretch;拉伸,其他参数同上
align-items 所有项目(items)在交叉轴(垂直于主轴)上的排列,参数同上
flex-direction 设置主轴方向,默认为row,另一个为column
flex-flow flex-wrap flex-direction合并的简写。 flex-flow:row/column nowrap/wrap;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议