博客列表 >flex 浅析

flex 浅析

培(信仰)
培(信仰)原创
2020年12月24日 15:29:21578浏览

flex 布局

什么是flex

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

任何一个容器都可以指定为 Flex 布局。

  1. .box{
  2. display: flex;
  3. }

注意: 设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。

基本概念

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

容器默认存在两根轴:水平的主轴和垂直的交叉轴,项目默认沿主轴排列。

容器的属性

序号 属性 描述
1 flex-flow 主轴方向与换行方式
2 justify-content 项目在主轴上的对齐方式
3 align-items 项目在交叉轴上的对齐方式
4 align-content 项目在多行容器中的对齐方式
  1. <div class="container">
  2. <div class="item">item1</div>
  3. <div class="item">item2</div>
  4. <div class="item">item3</div>
  5. <div class="item">item4</div>
  6. <div class="item">item5</div>
  7. <div class="item">item6</div>
  8. <div class="item">item7</div>
  9. <div class="item">item8</div>
  10. <div class="item">item9</div>
  11. <div class="item">item10</div>
  12. <div class="item">item11</div>
  13. <div class="item">item12</div>
  14. </div>
  1. /* 单行容器 */
  2. .container {
  3. /* 主轴方向 */
  4. /* flex-direction: row; */
  5. /* 是否换行 */
  6. /* flex-wrap: nowrap; */
  7. /* 简写形式,以后采用这种写法第一个参数row或column 第二个参数 是否换行 wrap 或者 nowrap */
  8. flex-flow:row nowrap;
  9. }
  10. /* 多行容器 */
  11. .container {
  12. flex-flow:row wrap;
  13. }
  14. .container {
  15. flex-flow: column wrap;
  16. }

弹性项目在单行容器的对齐方式起效果要有一个前提条件,需要有剩余空间
空间分配有两种方案:

  1. .container {
  2. /* 默认属性 可以不写 */
  3. /* flex-flow: row nowrap; */
  4. /*1. 将所有项目视为一个整体,在项目组两边进行分配 */
  5. /* 从左右向右沿着开始位置 */
  6. justify-content: flex-start;
  7. /* 从右向左 从结束位置 */
  8. justify-content: flex-end;
  9. /* 居中对齐 */
  10. justify-content: center;
  11. /* 2. 将项目视为一个个独立的个体,在项目之间进行分配 */
  12. /* 两端对齐 项目首尾顶住两边,中间项目的间距平均分配剩余空间*/
  13. justify-content: space-between;
  14. /* 分散对齐 剩余空间在每个项目的间距平均分配*/
  15. justify-content: space-around;
  16. /* 平均对齐 所有项目的间距平均分配剩余空间 */
  17. justify-content: space-evenly;
  18. }
  19. /* 交叉轴上的对齐方式 */
  20. .container {
  21. /* 默认属性(等高列) 拉伸,可以不写 */
  22. align-items: stretch;
  23. /* 还可以设置从开始方向 */
  24. align-items: flex-start;
  25. /* 从底部开始 */
  26. align-items: flex-end;
  27. /* 居中对齐 */
  28. align-items: center;
  29. }
  30. /* 单行容器因为只有一行,所以交叉轴上没有剩余空间 */

弹性项目在多行容器的对齐方式起效果要有一个前提条件,需要有剩余空间
空间分配有两种方案:

  1. .container {
  2. flex-flow: row wrap;
  3. /* 将所有项目视为一个整体 */
  4. /* 拉伸 */
  5. align-content: stretch;
  6. /* 从开始位置 */
  7. align-content: flex-start;
  8. /* 从结束位置 */
  9. align-content: flex-end;
  10. /* 交叉轴方向有剩余空间所以有独立的对齐方案*/
  11. /* 两端对齐 相框或者多行菜单*/
  12. align-content: space-between;
  13. /* 分散对齐 */
  14. align-content: space-around;
  15. /* 平均对齐 */
  16. align-content:space-evenly;
  17. }
  18. /*容器属性总结:
  19. flex-flow:主轴方向与换行
  20. justify-content:项目在主轴上的对齐方式
  21. align-item:项目在交叉轴上的对齐方式
  22. align-content:项目在多行容器中交叉轴上的对齐方式 */

3. 项目属性

序号 属性 描述
1 flex 项目的缩放比例与基准宽度
3 align-self 单个项目在交叉轴上的对齐方式
4 order 项目在主轴上排列顺序

flex 属性:项目的缩放比例与基准宽度

  1. /* 项目属性flex */
  2. .container .item{
  3. /* flex: flex-grow flex-shrink flex-basis */
  4. /* flex: 放大因子 收缩因子 项目在主轴上的基准宽度 */
  5. /* 默认值:不放大 可收缩 */
  6. flex:0 1 auto;
  7. /* 等效 */
  8. /* flex:initial; */
  9. /* 允许放大缩小 */
  10. flex:1 1 auto;
  11. /* 等效 */
  12. /* flex:auto; */
  13. /* 禁止放大缩小 */
  14. flex: 0 0 auto;
  15. /* 等效 */
  16. /* flex:none; */
  17. /* 如果只写一个数字,表示放大因子 */
  18. flex:1;
  19. /* flex通常不会用来设置所有项目的默认选项,用来设置某一个项目 */
  20. }
  21. /* 要求第2个和第3个项目是第1个和第4个的两倍 */
  22. .container .item:nth-of-type(2),
  23. .container .item:nth-of-type(3){
  24. flex:2;
  25. }

align-self 属性: 单个项目在交叉轴上的对齐方式

  1. /* 设置第二个项目与其他项目的对齐方式不一样 */
  2. .container>.item:nth-of-type(2){
  3. align-self: stretch;
  4. align-self: flex-start;
  5. align-self: flex-end;
  6. align-self: center;
  7. /* 还支持定位 */
  8. position:relative;
  9. left:-2em;
  10. top:3em;
  11. /* 绝对定位也ok */
  12. position:absolute;
  13. left:2em;
  14. top:3em;
  15. }

order 属性: 项目在主轴上排列顺序

  1. <style>
  2. * {
  3. padding: 0;
  4. margin: 0;
  5. box-sizing: border-box;
  6. }
  7. .container {
  8. /* 转为flex弹性布局元素 */
  9. display: flex;
  10. height: 15em;
  11. border: 1px solid #000;
  12. padding: 1em;
  13. margin: 1em;
  14. position:relative;
  15. }
  16. .container>.item {
  17. /* height: 5em; */
  18. width: 5em;
  19. background-color: skyblue;
  20. border: 1px solid #000;
  21. }
  22. /* 默认是按照书写顺序排列 */
  23. /* order越小越靠前 */
  24. .container .item:first-of-type{
  25. order:1;
  26. background-color: red;
  27. }
  28. .container .item:nth-last-of-type(2){
  29. order:2;
  30. background-color: yellow;
  31. }
  32. .container .item:nth-last-of-type(3){
  33. order:3;
  34. background-color: blue;
  35. }
  36. .container .item:last-of-type{
  37. order:-1;
  38. background-color: green;
  39. }
  40. </style>

总结

  1. 任何元素都可以通过添加display:flex;属性 转为弹性盒子
  2. 转为flex元素后,它的内部“子元素”就支持flex布局了
  3. 使用了display:flex; 属性的元素称为:flex容器
  4. flex 容器中的“子元素”称之为:flex项目
  5. 容器中的项目自动转为“行内块元素”(不管之前是什么类型)
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议