博客列表 >flex 布局

flex 布局

JKY辉哥
JKY辉哥原创
2020年06月25日 19:57:56708浏览

flex 布局

  • 1. flex 基础

    • 1.1. flex 布局是什么?

      Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。

    • 1.2. flex 特点
      • flex 布局没有方向性
      • flex 布局空间自由分配, 自动对齐
      • flex 仅适用于简单的线性布局
    • 1.3. Flex 基本概念

      采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称"项目"。

    flex

    容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
    项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

  • 2. flex 属性

  • 2.1 flex 容器

可以将任一元素添加display:flex属性转为 flex 容器

允许应用到 flex 容器上的 6 个属性

序号 描述 属性/值
1 方向 flex-direction:row/column/row-reverse/column-reverse
2 换行 flex-wrap: wrap/nowrap/wrap-reverse
3 flex-flow 上面 2 个的简写 flex-flow: flex-direction, flex-wrap
4 主轴的对齐方向 justify-content:center/flex-start/flex-end/space-around/space-between
5 侧轴的对齐方向 align-items:center/flex-end/flex-start/stretch/baseline
6 多行列的对齐方向 align-content

2.2 flex 项目(item)

序号 描述 属性/值
1 增长比例 flex-grow
2 缩减比例 flex-shrink
3 默认大小 flex-basis
4 上述三者简写 flex
5 项目顺序 order
6 自身对齐方式 align-self
  • 3. FlexBox 弹性盒布局案例

  • 3.1 FlexBox 弹性盒布局快速预览案例代码

  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. /* 弹性盒子,要用火狐浏览器查看 */
  9. .container {
  10. width: 300px;
  11. /* 如果这个容器中的内容要使用flexBox布局, 第一步就是必须将这个容器转为弹性盒子 */
  12. display: flex;
  13. }
  14. .container > .item {
  15. /* 一旦将父元素转为弹性容器,内部的“子元素”就会自动成为: 弹性项目 */
  16. /* 不管这个项目标签之前是什么类型,统统转为“行内块” */
  17. /* 行内:全部在一排显示 */
  18. /* 块: 可以设置宽和高 */
  19. /* 设置弹性项目空间平分分配,进行平均缩放,如果没有定义,可能会有剩余空间 */
  20. /* flex: auto; */
  21. /* 设置每个弹性项目宽度和高度 */
  22. width: 40px;
  23. height: 30px;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <!-- .container>.item{$}*3 -->
  29. <div class="container">
  30. <div class="item">1</div>
  31. <div class="item">2</div>
  32. <div class="item">3</div>
  33. <div class="item">4</div>
  34. <div class="item">5</div>
  35. </div>
  36. </body>
  37. </html>

快速flex布局

  • 3.2 FlexBox 弹性盒多行容器案例代码
  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. /* 弹性容器 */
  11. display: flex;
  12. }
  13. .container > .item {
  14. /* 通过改变弹性项目宽度查看换行属性,默认不换行 */
  15. width: 60px;
  16. width: 120px;
  17. width: 150px;
  18. }
  19. /* 换行显示:flex-wrap:wrap ,转换为多行容器*/
  20. .container {
  21. flex-wrap: wrap;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <!-- .container>.item{$}*3 -->
  27. <div class="container">
  28. <div class="item">1</div>
  29. <div class="item">2</div>
  30. <div class="item">3</div>
  31. <div class="item">4</div>
  32. <div class="item">5</div>
  33. </div>
  34. </body>
  35. </html>

多行容器

  • 3.3FlexBox 单行容器中的项目对齐方式代码案例
  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. .container {
  9. /* 转为弹性盒 */
  10. display: flex;
  11. width: 300px;
  12. /* justify-content: 控制所有项目在主轴上的对齐方式; */
  13. /* 本质是:设置容器中的剩余空间在所有 “项目之间”的分配方案 */
  14. /* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
  15. justify-content: flex-start;
  16. justify-content: flex-end;
  17. justify-content: center;
  18. /* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
  19. /* 弹性项目两端对齐 */
  20. justify-content: space-between;
  21. /* 分散对齐: 剩余空间在所有项目二侧平均分配 */
  22. justify-content: space-around;
  23. /* 平均对齐分配空间 */
  24. justify-content: space-evenly;
  25. }
  26. .container > .item {
  27. /* 设置每个弹性项目宽度 */
  28. width: 60px;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <div class="container">
  34. <div class="item">1</div>
  35. <div class="item">2</div>
  36. <div class="item">3</div>
  37. </div>
  38. </body>
  39. </html>

单行容器对齐方式

  • 3.4 FlexBox 多行容器中的项目对齐方式演示代码
  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. .container {
  9. /* 转为弹性盒 */
  10. width: 300px;
  11. display: flex;
  12. /* 多行容器 */
  13. flex-wrap: wrap;
  14. height: 150px;
  15. /* align-content: 设置多行容器中的项目排列; */
  16. /* 1. 容器剩余空间在所有项目“二边”的如何分配 ,将全部项目视为一个整体*/
  17. /* 默认值 */
  18. align-content: stretch;
  19. /* 从顶部左侧开始排列 */
  20. align-content: flex-start;
  21. /* 从底部部右侧开始排列 */
  22. align-content: flex-end;
  23. /* 居中排列 */
  24. align-content: center;
  25. /* 2. 容器剩余空间在所有项目“之间”的如何分配 ,将项目视为一个个独立的个体*/
  26. /* 两端对齐 */
  27. align-content: space-between;
  28. /* 分散对齐 */
  29. align-content: space-around;
  30. /* 平均分配对齐 */
  31. align-content: space-evenly;
  32. }
  33. .container > .item {
  34. /* 设置每个弹性项目宽度 */
  35. width: 60px;
  36. }
  37. </style>
  38. </head>
  39. <body>
  40. <div class="container">
  41. <div class="item">1</div>
  42. <div class="item">2</div>
  43. <div class="item">3</div>
  44. <div class="item">4</div>
  45. <div class="item">5</div>
  46. <div class="item">6</div>
  47. <div class="item">7</div>
  48. <div class="item">8</div>
  49. </div>
  50. </body>
  51. </html>

多行容器对齐方式

  • 3.5 FlexBox 主轴为垂直方向时的项目排列案例代码
  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. .container {
  9. /* 转为弹性盒 */
  10. width: 300px;
  11. height: 150px;
  12. display: flex;
  13. /* 主轴方向:默认为行 */
  14. flex-direction: row;
  15. flex-direction: column;
  16. /* 项目二边分配 */
  17. justify-content: flex-start;
  18. justify-content: flex-end;
  19. justify-content: center;
  20. /* 项目之间分配 */
  21. justify-content: space-between;
  22. justify-content: space-around;
  23. justify-content: space-evenly;
  24. }
  25. .container > .item {
  26. /* 设置每个弹性项目宽度 */
  27. /* width: 60px; */
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="container">
  33. <div class="item">1</div>
  34. <div class="item">2</div>
  35. <div class="item">3</div>
  36. </div>
  37. </body>
  38. </html>

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

  • 3.6 FlexBox 项目在交叉轴上的排列演示代码
  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. .container {
  9. /* 转为弹性盒 */
  10. display: flex;
  11. width: 300px;
  12. height: 200px;
  13. /* 项目在交叉轴上默认是自动伸缩的 */
  14. /* 默认值 */
  15. align-items: stretch;
  16. /* 项目交叉轴排列 */
  17. align-items: flex-start;
  18. align-items: flex-end;
  19. align-items: center;
  20. }
  21. .container > .item {
  22. /* 设置每个弹性项目宽度 */
  23. width: 60px;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="container">
  29. <div class="item">1</div>
  30. <div class="item">2</div>
  31. <div class="item">3</div>
  32. </div>
  33. </body>
  34. </html>

项目在交叉轴上的排列

  • 3.7 FlexBox 主轴方向与项目排列的简写演示代码
  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. .container {
  9. /* 转为弹性盒 */
  10. display: flex;
  11. width: 300px;
  12. height: 50px;
  13. /* 默认值就不用写出来 */
  14. /* 默认对齐方式 */
  15. /* flex-direction: row; */
  16. /* 禁止换行 */
  17. /* flex-wrap: nowrap; */
  18. /* 提换上面两行代码简写 */
  19. /* flex-flow: row nowrap; */
  20. /* 按列排列,可以设置换行和不换行(nowrap/wrap),换行就是多行容器 */
  21. flex-flow: column wrap;
  22. }
  23. .container > .item {
  24. /* 设置每个弹性项目宽度 */
  25. width: 60px;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="container">
  31. <div class="item">1</div>
  32. <div class="item">2</div>
  33. <div class="item">3</div>
  34. <div class="item">4</div>
  35. <div class="item">5</div>
  36. </div>
  37. </body>
  38. </html>

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

  • 3.8 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>flex容器属性实战:快速撸一个主导航</title>
  7. <style>
  8. * {
  9. padding: 0;
  10. margin: 0;
  11. box-sizing: border-box;
  12. }
  13. a {
  14. text-decoration: none;
  15. color: #ccc;
  16. }
  17. nav {
  18. height: 40px;
  19. line-height: 40px;
  20. background-color: #333;
  21. padding: 0 50px;
  22. /* 转换为弹性盒布局 */
  23. display: flex;
  24. }
  25. nav a {
  26. height: inherit;
  27. line-height: 40px;
  28. padding: 0px 15px;
  29. }
  30. nav a:hover {
  31. background-color: seagreen;
  32. color: white;
  33. }
  34. /* 登录/注册放在最右边 */
  35. nav a:last-of-type {
  36. margin-left: auto;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <header>
  42. <nav>
  43. <a href="">首页</a>
  44. <a href="">HTML</a>
  45. <a href="">CSS</a>
  46. <a href="">JavaScript</a>
  47. <a href="">PHP</a>
  48. <a href="">登录/注册</a>
  49. </nav>
  50. </header>
  51. </body>
  52. </html>

快速撸一个主导航

  • 4. 总结

  • 传统布局: 基于浮动(float)与定位(position),flex 弹性布局: 灵活,强大,简单,直观
  • 可以将任一元素添加display:flex属性转为 flex 容器
  • 中间主体占据全部剩余空间 flex-grow: 1;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议