对flex深入研究一点
flex顶层设计
1.在任何流动的方向上(包括上下左右)都能进行良好的布局
2.可以以逆序 或者 以任意顺序排列布局
3.可以线性的沿着主轴一字排开 或者 沿着侧轴换行排列
4.可以弹性的在任意的容器中伸缩大小
5.可以使子元素们在容器主轴方向上 或者 在容器侧轴方向上 进行对齐
主轴和侧轴
什么是主轴
什么是侧轴
他们是如何切换的
首先每一根轴都包括 三个东西:维度、方向、尺寸
- 所谓的维度实际上就是意思就是子元素 横着排还是竖着排(
x
轴 或y
轴) - 方向 即排列子元素的顺序 顺序还是逆序
- 尺寸 即
width
[height
] : 每一个子元素在主轴方向所占的位置的总和 如果主轴是水平的,那么尺寸就是父元素内所有item
的outerWidth
总和,如果主轴是垂直的,那么尺寸就是父元素的outerHeight
为了方便 flex-direction + flex-wrap
合并成了一个属性 flex-flow
主侧轴的切换十分简单,当主轴设定的时候,它的垂直面,就默认被设定成了侧轴
flex-flow: row-reverse wrap-reverse
- 子元素是横着排列的,主轴是水平的横轴,侧轴是竖直的纵轴
- 子元素是逆序并沿着主轴排列的,从右到左
- 子元素是换行的
- 子元素是逆序并沿着侧轴排列的,从下到上
FFC (flex formatting context)
Flexbox 布局新定义了格式化上下文,类似 BFC(block formatting context)。有多类似呢? 就是除了布局和一些细节不同以外的一切规则都和 BFC 是相同的
。
注意 : 我所指的Flexbox 是指设置了
display: flex;
或display: inline-flex;
的盒子。不是指单单设置了display: flex;
的盒子。
例如,设置了 display: flex;
或 display: inline-flex
的元素,和BFC一样,不会被浮动的元素遮盖,不会垂直外边距坍塌等等。
而对于设置了 display: inline-flex
的盒子来说,我们可以类比 display: inline-box;
行理解。即 一个被行列化后的 Flexbox。它不会独占一行,但是可以设置宽和高。
但需要注意的是以下几点细节,Flexbox 布局 和 Block 布局是有细微区别的
- Flexbox 不支持
::first-line
和::first-letter
这两种伪元素 vertical-align
对 Flexbox 中的子元素 是没有效果的float
和clear
属性对 Flexbox 中的子元素是没有效果的,也不会使子元素脱离文档流(但是对Flexbox 是有效果的!)- 多栏布局
(column-*)
在 Flexbox 中也是失效的,就是说我们不能使用多栏布局在Flexbox 排列其下的子元素(鱼和熊掌不可得兼嘛) - Flexbox 下的子元素不会继承父级容器的宽
flex item(flex 子元素)
CSS解析器会把 定义了 display: flex;
和 display: inline-flex;
的 Flexbox 下的子元素外部装进一个看不见的盒子里,我们通过排列这些盒子来达到排序、布局、 伸缩的目的。
规范中把这种盒子 称为 flex item
,而子元素中包括了 标签节点 以及 文本节点。标签节点很容易理解,需要注意的是文本节点。
默认情况下,flex
会将 连续的文本节点 装进 flex-item 之中,使文本可以和标签节点一起排序和定位。
值得注意的是,空格也是文本节点,所以 white-space
会影响Flexbox 中的布局:
flex-item-size 如何计算的
item-size
(尺寸)为主轴方向上item
的 content
再加上自身的margin
、 border
和 padding
就是这个 item
的尺寸。
1. flex-basis 的优先级比 width[height]: 非auto; 高
如果子元素没有内容和默认固定宽高,且设置了flex-basis
。flex-item content
以flex-basis
来决定,无论width[height]
设置了多少。
(可理解为 flex-basis
比 width[height]: 非auto;
的优先级高)
flex-basis
的优先级比width[height]
高,无论width[height]
设置多少,flex-item content都以flex-basis
来决定。
2.元素存在默认宽高
如果子元素有默认固定宽高(例如input
标签)、并且设置了 flex-basis
,那么它的 content
以 固定宽高为下限,如果flex-basis
超过了固定宽高,那么flex-basis
则成为其 content
,如果flex-basis
比固定宽高小,那么以固定宽高为 content
。
3.元素存在 min-width[height] 或者 max-width[height]
如果flex-item
有min-width[min-height]
的限制,那么flex-item content
按照 min-width
值为下限,如果 flex-basis
的值大于 min-width[min-height]
那么flex-item content
以 flex-basis
计算。
如果flex-basis
的值小于 min-width[min-height]
那么flex-item content
以min-width[min-height]
如果 min-width[min-height]
的值已经超出了容器的尺寸,那么即使设置了 flex-shrink
。 CSS解析器也不会进行将这个item
的 content shrink,而是坚持保留它的min-width[min-height]
:
4.width[height]: auto; 优先级等于 flex-basis。
前面提到,如果给item同时设置了width[height]
和 flex-basis
的话。flex-item content以flex-basis
来决定。但是实际上默认的 width[height]: auto;
优先级是等于 flex-basis
的。
CSS解析器对比两者的值,两者谁大取谁 作为item的基本尺寸,如果一个item没有内容,flex-item content就会以flex-basis
来决定。
但是如果item有了内容,且内容撑开的尺寸比flex-basis
大,那么flex-item content就会以width[height]: auto;
来决定,且无法被 shrink。反之,如果比flex-basis
小,flex-item content就会以flex-basis
来决定
idth: auto;
内容长度比 flex-basis
大,则 flex-item content以内容长度来决定,且无法shrink
如果 flex-basis
的长度大于文字内容长度,那么flex-item content以 flex-basis
Flexbox 布局很棒还是需要深入理解的
对flex深入研究一点的更多相关文章
- 前端html、Javascript、CSS技术小结
简单地总结了一下前端用过的html.javascript.css技术,算是清点一下,做个大略的小结,为进一步的学习给个纲领. 一.HTML 由于HTML5的兴起,简单地判断一个网页是否是html5网页 ...
- 精《记叙“tom”4年的软件开发之旅》
1.引言 本篇文章是记叙tom四年的软件开发从业经历,虽然他资历不长,况且本身也是个菜鸟,但他也曾有过荣誉.迷茫.困惑与选择,在这里他希望通过自己所经历过的事情分享给大家,给那些真正热爱软件开发的同学 ...
- DAU新解
写在回归之时 --------------------------- 抱歉,已经超过三年没有回到这里了. 浮躁,虚荣,一颗心没有落到地上,也没有好好总结一下自己.怀念最开始那个时候的状态,安静的做点事 ...
- 20164319 刘蕴哲 Exp1 PC平台逆向破解
[实践内容概述] 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,ge ...
- CSS Grid 读书笔记
基本概念 MDN上的解释是这样的 CSS Grid Layout excels at dividing a page into major regions or defining the relati ...
- Grid布局20行代码快速生成瀑布流
网格布局 Grid 布局,好用又简单,至少比 Flex 要人性化一点,美中不足就是浏览器支持度差点. DOM结构 中间夹层为了后续拓展. CSS .grid { display: grid; grid ...
- 个人成长|荣获CNVD年度最有价值漏洞奖
本文共750+字,预计阅读2-3分钟. 前几天,很荣幸受主办方邀请,还拿了CNVD的一个“年度最有价值漏洞奖”,说一说,这几天的故事吧. 11月20号,意外收到一个会议邀请,当时还比较诧异,印象中我在 ...
- 关于C#中readonly的一点小研究
可能园子里有不少文章已经说明了这个问题了,但是我在这里写这篇博客只是写写自己的一些体会,也权当是整理归纳,高手莫见笑. ===============正文分割线================== 现 ...
- 关于rem自适应的一点研究
参考地址:http://m.ctrip.com/html5/ https://www.amazon.cn/ rem是相对于html根元素的一个单位.rem是px的16倍,即1rem = 16px;除了 ...
随机推荐
- beego框架学习(二) -路由设置
路由设置 什么是路由设置呢?前面介绍的 MVC 结构执行时,介绍过 beego 存在三种方式的路由:固定路由.正则路由.自动路由,接下来详细的讲解如何使用这三种路由. 基础路由 从beego1.2版本 ...
- 红帽学习笔记[RHCSA] 第二周
目录 红帽学习笔记[RHCSA]第二周 环境 第七课[网络配置相关] 在Vmware中添加网卡 将网卡添加到虚拟机上 关于网卡命名规则 配置网络 网络配置命令总结 更改hostname 关于SSH的一 ...
- angular - ngFor, trackby
ngFor ngForOf指令通常使用缩写形式*ngFor为集合中的每个项呈现模板的结构指令.该指令放置在元素上,该元素将成为克隆模板的父级. <li *ngFor="let item ...
- Elasticsearch-索引新数据(创建索引、添加数据)
ES-索引新数据 0.通过mapping映射新建索引 CURL -XPOST 'localhost:9200/test/index?pretty' -d '{ "mappings" ...
- Linux环境下Oracle安装参数设置
前面讲了虚拟机的设置和OracleLinux的安装,接下来我们来说下Oracle安装前的准备工作.1.系统信息查看系统信息查看首先服务器ip:192.168.8.120服务器系统:Oracle Lin ...
- Java中的享元设计模式,涨姿势了!
首先来看一段代码: public class ShareTest { public static void main(String[] args) { Integer a = 127; ...
- vim中代码按照行对齐。
在vim下, 用命令v, 然后移动光标,选种你的文本, 然后按下=键, 看看效果如何吧.
- PythonDay11
第十一章函数使用_迭代器 今日内容 函数名的第一类对象及使用 f-strings 迭代器 函数名的第一类对象及使用 函数名可以当做值,赋值给变量 函数名可以当做容器内的元素 函数名可以当做函数的参数 ...
- 【golang】浅析rune数据类型
golang中string底层是通过byte数组实现的.中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而golang默认编码正好是utf-8. golang中还有一个byte数据 ...
- js 学习三 Array
1.数组的长度 var sequence = [1, 1, 2, 3, 5, 8, 13]; sequence .length //7 2.字符串转换成数组 string.split() var my ...