flex布局笔记整理

了解-webkit-box

利用postcss进行css代码的向后兼容时,display:flex兼容后的代码常会带有display:-webkit-box。
部分移动端内核较低,只支持老版本的box布局,不支持flex布局。
box布局是flex布局的前身,与float不同,float超出边界时会自动换行,box和flex不会。

box与flex区别

容器部分

  1. 子元素总宽度超过父元素时:
    box => 子元素溢出父元素边界
    flex => 子元素被挤压
    查看对比
  2. 修改排列时的主轴:
    box => -webkit-box-orient: (horizontal | vertical)
    flex => flex-direction: (row | column)
    (效果相同,差异仅是属性名不同)
  3. 排列时的顺序:
    box => -webkit-box-direction: (normal | reverse)
    flex => flex-direction: (row-reverse | column-reverse)
    注: flex的反转效果,以row-reverse为例,是从容器最右边开始排列的,box反转效果是从容器最左边排列的(查看对比)
  4. 主轴富余空间管理:
    box => -webkit-box-pack:
    /* start: 富余空间在右边
    /
    end: 富余空间在左边
    /
    center: 富余空间在两边
    /
    justify; 富余空间在项目之间
    flex => justify-content:
    /
    flex-start 富余空间在左边
    /
    flex-end 富余空间在右边
    /
    center 富余空间在两边
    /
    space-between, space-around, space-evenly 不同形态的富余空间在项目之间 *
  5. 侧轴富余空间管理:
    box => -weblit-box-align:
    /* start: 富余空间在下面
    /
    center: 富余空间在两边
    /
    end:富余空间在上面
    flex => align-items:
    /
    flex-start: 富余空间在下面
    /
    center: 富余空间在两边
    /
    flex-end: 富余空间在上面
    /
    baseline: 基线对其
    /
    stretch: 等高布局 *

** 注:4、5中是相对于主轴和侧轴,并非固定是X轴还是y轴 **

项目(item)部分

  1. 拉伸与压缩
    box => -webkit-box-flex (既能控制拉伸也能控制压缩)
    flex => flex-grow (只能控制拉伸)、flex-shrink (只能控制压缩)
  2. 宽度设置
    box => width
    flex => width或flex-basis,flex-basis优先级高于width

flex布局基础

基本概念可参考一劳永逸的搞定 flex 布局,大部分属性规则都不复杂,参考下图使用即可。需要注意的属性是flex-grow和flex-shrink。

flex-grow的计算方式

flex-grow的作用: 当主轴方向存在富余空间时,将富余空间赋予对应item
flex-grow默认值: 0
flex-grow触发条件: 主轴方向存在富余空间
flex-grow对于富余空间计算: 富余空间根据flex-grow数值进行分配
例:
假设content宽度为600px,flex布局,其内部有4个item,item初始宽度分别为50px、100px、150px、200px。
第1个item的flex-grow:4;
第4个item的flex-grow:1;
Q:求4个item的宽度分别为多少?
解:

  1. 计算富余空间宽度:
    富余 = 600px - (50+100+150+200)px = 100px
  2. 计算单位flex-grow的分配宽度:
    单位flex-grow宽度 = 富余/(flex-grow总和) = 100px/(4+1) =20px
  3. 按照flex-grow数值分配宽度:
    第1个item宽度 = 初始宽度 + 单位flex-grow宽度*flex值 = 50px + 20px*4 = 130px
    第4个item宽度 = 初始宽度 + 单位flex-grow宽度*flex值 = 200px + 20px*1 = 220px
    因此,4个item宽度分别为130px、100px、150px、220px。可查看实例

flex-shrink的计算方式

flex-shrink的作用: 当容器flex-wrap为nowrap,且item初始宽度之和大于容器宽度时,容器会对其中的item进行压缩,flex-shrink决定压缩时的规则。
flex-shrink默认值: 1
flex-shrink触发条件:容器宽度不够,需要压缩内容显示
flex-shrink计算方式:

  1. 计算压缩空间
  2. 每个item权重 = flex-shrink * 宽度, 根据权重分配压缩空间
  3. 是否有item会被压缩至0宽度,若有则假设这些item宽度为0,重新进行压缩空间分配计算
    ** 注:当item中有内容时,item被压缩的最小宽度为内容宽度**

例:假设content宽度为300px,flex布局,其内部有4个item,item初始宽度分别为50px、100px、150px、200px。
Q1:4个item实际显示的宽度为多少?
item1的flex-shrink设为10;
item4的flex-shrink设为5;
Q2: 4个item的宽度分别为多少?
解:
Q1:

  1. 计算压缩空间宽度
    压缩 = (50+100+150+200)px - 300px = 200px
  2. 分配压缩空间
    4个item宽度比为1:2:3:4,初始flex-shrink为1
    单位权重宽度 = 200px/(1*1+2*1+3*1+4*1) = 20px
    第1个item宽度 = 初始宽度 - 单位权重宽度*权重 = 50px - 20px*1*1 = 30px
    第2个item宽度 = 初始宽度 - 单位权重宽度*权重 = 100px - 20px*2*1 = 60px
    第3个item宽度 = 初始宽度 - 单位权重宽度*权重 = 150px - 20px*3*1 = 90px
    第4个item宽度 = 初始宽度 - 单位权重宽度*权重 = 200px - 20px*4*1 = 120px
  3. 是否需要重新计算
    由于步骤2计算的item宽度都大于等于0,因此不需要重新计算
    因此,4个item宽度分别为 30px、60px、90px、120px。

Q2:

  1. 计算压缩空间宽度
    压缩 = (50+100+150+200)px - 300px = 200px
  2. 分配压缩空间
    4个item宽度比为1:2:3:4,item1、item4的flex-shrink分别为10、5,其余flex-shrink为1
    单位权重宽度 = 200px/(1*10+2*1+3*1+4*5) = 40/7px
    第1个item宽度 = 初始宽度 - 单位权重宽度*权重 = 50px - 40/7px*1*10 = -7.14px
  3. 是否需要重新计算
    由于第1个item计算后的宽度为-7.14px<0,因此需要重新分配压缩空间
  4. 计算压缩空间宽度
    由于上一步中item1宽度小于0,将item1宽度当作0,重新计算压缩空间宽度
    压缩 = (100+150+200)px - 300px = 150px
  5. 分配压缩空间
    单位权重宽度 = 150px/(2*1+3*1+4*5) = 6px
    第1个item宽度 = 0
    第2个item宽度 = 初始宽度 - 单位权重宽度*权重 = 100px - 6px*2*1 = 88px
    第3个item宽度 = 初始宽度 - 单位权重宽度*权重 = 150px - 6px*3*1 = 132px
    第4个item宽度 = 初始宽度 - 单位权重宽度*权重 = 200px - 6px*4*5 = 80px
  6. 是否需要重新计算
    由于步骤5计算的宽度都大于等于0,因此不需要重新计算
    因此,4个item宽度分别为 0、88px、132px、80px。可查看实例
    注意:给item添加文字后,宽度无法压缩为0,压缩空间计算将更为复杂。

flex布局笔记整理的更多相关文章

  1. 弹性布局(Flex布局)整理

    一.  弹性布局 一个好的网站都有让用户看上去很舒服的布局,一个网站的布局也会或多或少影响到它的浏览量,看完阮大神的博客,就想把弹性布局整理一下. 在平时的我们常用的布局类型有以下几种: 1.浮动+定 ...

  2. 1.display:flex布局笔记

    /*display:flex布局方式主要运用于垂直居中的效果*/ 一.Flex译为Flexible Box(弹性盒子),任何一个容器都可以指定为Flex布局 注:设置为Flex布局之后,子元素的flo ...

  3. CSS Flex布局属性整理

    Flex布局 display: flex; 将对象作为弹性伸缩盒展示,用于块级元素 display: inline-flex; 将对象作为弹性伸缩盒展示,用于行内元素 注意兼容问题: webkit内核 ...

  4. flex布局笔记

    flex布局: 容器: 容器主轴方向: 项目的主轴对齐方式: space-between:两端对齐,项目之间的间隔都相等. space-around:每个项目两侧的间隔相等.所以,项目之间的间隔比项目 ...

  5. flex 布局笔记

    1,今天遇到一个问题,就是当元素布局设置为了flex后,里面的内容只有文字,但是对text-align 属性设置无效,仔细想了下,是因为把display 设置为了flex后,flex将里面的文字也认为 ...

  6. 【前端】移动端Web开发学习笔记【2】 & flex布局

    上一篇:移动端Web开发学习笔记[1] meta标签 width设置的是layout viewport 的宽度 initial-scale=1.0 自带 width=device-width 最佳实践 ...

  7. CSS3 Flex布局整理(三)-项目属性

    一.Flex布局中 Flex Item属性控制,可以指定显示顺序.剩余空间的放大,缩小.交叉轴的排列 1.order:定义项目的排列顺序,数值越小,排列越靠前,默认为0.类似z-index 2.fle ...

  8. CSS3 Flex布局整理(二)-容器属性

    一.Flex容器属性介绍 1.flex-flow :水平或垂直方向上的流动方式,包裹处理,其中包括了flex-direction属性和flex-wrap属性. 2.justify-content:定义 ...

  9. CSS3 Flex布局整理(一)

    一.说明 1.在以往的布局方案中,都是基于盒装模型,依赖display属性+position属性+float属性等. 他对于那些特殊布局非常不方便,比如,垂直居中等. 并且不同浏览器的盒模型还有些差异 ...

随机推荐

  1. gcd 和 同余方程(Exgcd)

    求关于x的同余方程 ax≡1(mod b) 的最小正整数解. 对于 100%的数据,2≤a,b≤2*109. NOIP 2012 提高组 第二天 第一题 (只看Exgcd的自行跳过这段文字) 先撇开扩 ...

  2. python3虚拟环境中解决 ModuleNotFoundError: No module named '_ssl'

    前提是已经安装了openssl 问题 当我在python3虚拟环境中导入ssl模块时报错,报错如下: (py3) [root@localhost Python-3.6.3]# python3 Pyth ...

  3. JavaScript的垃圾回收机制与内存泄漏

    常用的两种算法: 引用计数(新版浏览器已弃用,弃用原因:会出现循环引用的情况,无法进行垃圾回收,导致内存泄漏) 标记清除 引用计数法 引用计数,顾名思义一个对象是否有指向它的引用,即看栈中是否有指向要 ...

  4. 数据算法 --hadoop/spark数据处理技巧 --(13.朴素贝叶斯 14.情感分析)

    十三.朴素贝叶斯 朴素贝叶斯是一个线性分类器.处理数值数据时,最好使用聚类技术(eg:K均值)和k-近邻方法,不过对于名字.符号.电子邮件和文本的分类,则最好使用概率方法,朴素贝叶斯就可以.在某些情况 ...

  5. 初学html总结

    2019-08-17 17:58:49 html:超文本标记语言,用于网页结构的搭建 html语言构成:由标签.属性.属性值构成 标签:" < "后面第一个单词 属性:标签后 ...

  6. K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志

    0x00 背景 K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES ...

  7. C#_细说Cookie_Json Helper_Cookies封装

    阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...

  8. Linux设备驱动程序学习----3.模块的编译和装载

    模块的编译和装载 更多内容请参考Linux设备驱动程序学习----目录 1. 设置测试系统 第1步,要先从kernel.org的镜像网站上获取一个主线内核,并安装到自己的系统中,因为学习驱动程序的编写 ...

  9. 谷歌移动UI框架Flutter教程之Widget

    引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...

  10. mysql像通讯录一样把中文按字母排序的sql

    select reimer from lendreimbursement_reimburserecord ORDER BY convert(reimer USING gb2312 ) asc; 是用c ...