因为其中的
counter部分以及内联元素部分篇幅较长,会单独整理一篇wiki,故不包含在本文章内
流体布局
- 流:CSS的布局就像水流一样,元素就像其中的物体,依次排列,位置不足则自动换行
- 环境:IE8及以上
- 流特性对不适用
- 流本身具有一定的自适应性,比如自动换行等
- "#"选择器权重过高,不推荐使用
-
CSS世界中很多行为受Web标准约束,如果越界,就称为bug,但是标准不可能面面俱到,存在描述以外的场景,就只能以浏览器厂家的理解为准,比如
:active伪类:active在IE和Chrome是鼠标按下的时候触发,而在Firefox认为:active发生在mousedown事件之后 - 具有换行特性,可以配合clear属性清除浮动
- 充分利用可用空间(fill-available):像、
等元素是默认100%于父级容器
- 收缩与包裹(shrink-to-fit|fit-content):浮动、绝对定位、inline-block或者table元素
- 收缩到最小(preferred minimum width|minimum content width|min-content):在table-layout为auto的表格中出现,在每一列空间都不够的时候,文字会被截断,中文是随便截断,英文单词不会被截断,如果都是中文,就会出现一柱擎天的情况
- 超出容器限制:设置
white-space:nowarp时会出现,一般用来截断文字,显示省略号的能力 - 流动性:一种 margin/border/padding 和 content 内容区域自动分配水平空间的机制
- 正常流宽度:当我们在一个容器里倒入足量的水时,水一定会均匀铺满整个容器,在页面中扔一个div元素也会同样铺满容器
- 格式化宽度:格式化宽度仅出现在“绝对定位模型”中,也就是出现在 position 属性值为 absolute 或 fixed 的元素中,当 left/right 或 top/bottom 对立方位的属性值 同时存在的时候,元素的宽度基于父元素的宽度决定,具有流的特性
-
包裹性
文中提到的实现方式,从布局的角度理解,就是文字少时,让包裹文字的元素在父元素中居中显示,当文字多的时候,包裹文字的元素宽度不超过父元素的宽度,产生了换行效果,此时让元素内的文字左对齐,就可以得到上图的效果
-
首选最小宽度
-
最大宽度
最大连续内联盒子(在一行内显示,如display 为 inline、inline-block、inline-table 等元素)的宽度
选择器
未定义行为 (undefined behavior)
块级元素
width:auto
width的默认值是auto,包含至少以下四种宽度表现
流动性丢失
当对块状元素设置宽度后,会使其流动性丢失,如果你加了宽度,就要加更多的参数去调整他的样式
流体特性
文中提到利用文字的换行特性,基于首选最小宽度这个特性,来构造一些需要大量css来实现的形状
如果需要英文也和中文一样,每个字符都用最小宽度,可以使用
word-break:break-all
盒尺寸
一个css盒子由 content box、padding box、border box 和 margin box组成,一般默认使用width属性控制的是content box,通过box-sizing属性可以控制width作用的盒子(不支持margin box,原因是margin box的使用场景不多,并且规范中margin的背景永远是透明的)
宽度分离
宽度分离之前
宽度分离之后,我们并不需要这些繁琐的计算
box-sizing
解决替换元素的宽度自适应问题,比如让尺寸百分百自适应父容器,有border和padding,在box-sizing出现之前,以前都是使用div的包裹性和流动性,嵌套一层div,模拟border和padding去自适应父容器,但是这种解决方式存在问题,使用box-sizing解决更为合理,可以像下面这样使用。
input, textarea, img, video, object {
box-sizing: border-box;
}
height:auto
height:100%
对于height的百分比值,需要一直到根节点都存在height的值例如以下设置
html, body {
height: 100%;//仅仅设置body的话,html的高度值也丢失了
}
百分比高度失效(高度丢失)
在日常的开发中,我经常遇到使用百分比高度失效(我个人称其为丢高度了)的情况,产生这个情况的原因就是父级元素的高度为auto(默认不设置高度的话自动为height:auto)
为什么height为auto不支持子元素的百分比高度呢,因为规范中做出了解释
如果包含 块的高度没有显式指定(即高度由内容决定),并且该元素不是绝对定位,则计算值为 auto
所以如果子元素使用百分比,得到的值就是'auto' * 100/100 = NaN
但是为什么width:100%不会出现这个问题呢,因为在规范中,width没有做出定义,所以是未定义行为 (undefined behavior),文中张鑫旭大大提到根据他的测试,在各个浏览器下的width的表现基本一致,都使用了包含块真实的计算值作为百分比基数,所以在width:auto的时候,并不是拿auto计算,而是拿数值进行运算,就能得到有效的结果
如何让百分比高度生效
- 首先是上面提到了,在父级设置可以生效的高度值,例如:
html, body {
height: 100%;
}
- 或者使用绝对定位,绝对定位元素的计算与非绝对定位不同,非绝对定位元素是相对于content box计算的,而绝对定位元素是根据padding box计算的,所以不受祖先元素height为auto的影响
div {
height: 100%;
position: absolute;//如果祖先元素存在position:relative的元素,则会根据以该元素为基准做计算
}
min-width/max-width 和 min-height/max-height
- 为流体而生
- max-width/height的初始值是none,min-width/height的初始值在大大的测验下呈现auto值的效果
- max-width/height会覆盖width/height,无论他们是不是!important
- min-width/height值在大于max-width/height时会覆盖他们
如内容有误,欢迎评论指出,我会及时修改