ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### float 块状化的意思是:元素一旦float值不为none,则其display计算值就自动变成了block,不管你之前是内联还是块级。 两侧定宽,中间自适应: ``` .left { float: left; width: 70px; } .right { float: right; width: 70px; } .container { margin: 0 70px; } ``` ### clear clear的意思是:设置了clear属性的元素自身如何如何,而不是让float元素如何如何。 * none: 默认值,左右浮动来就来 * left:左侧抗浮动 * right:右侧抗浮动 * both:两侧抗浮动 ``` li { width=height=20px; float: left; } li:nth-child(3) { clear: both; } ``` ![](https://box.kancloud.cn/0065ca17601dcedd1d24926e26ef3566_500x277.jpg) 你可能好奇为什么不是三行? clear属性是让自身不能和前面的浮动元素相邻,也就是说后面的浮动元素它是不管的。更进一步讲,float为left时,clear: left有效float为right时,clear: right有效。其实,float为left时,both等同于left,float为right时,both等同于right。 clear属性只有块级元素才有效。而伪元素默认都是内联,这就是平时借助伪元素清除浮动时需要设置display的原因: ``` .clear:after { content: '', display: table\block\list-item; clear: both; } ``` ### BFC(!!!) BFC全称为块级格式化上下文。如果一个元素是BFC,那么它的内部元素再怎么折腾都不会影响外部元素(比如absolute,再怎么折腾,会影响外层元素吗?不会!)。所以,BFC元素是不可能发生margin重叠的,因为margin重叠是会影响外部元素的。BFC元素也可以用来清除浮动,因为如果不清除,子元素浮动会导致父元素高度塌陷,必然影响后面元素的布局和定位。 如何BFC?(满足一个即可) * html根元素 * float值不为none * overflow值为hidden(常用) * display值为table-cell或inline-block(常用) * position为absolute或fixed 具有BFC特性的元素的子元素不会受外部元素影响,也不会影响外部元素。 举个例子: ``` <div> <img src="xxx.jpg"/> <p>文字</p> </div> img { float: left; } ``` ![](https://box.kancloud.cn/dba859076b1fdc1b46ec291db69cf0a7_437x226.jpg) float为left后影响了原有的布局。 我们为p设置`overflow: hidden`让p变成BFC(子元素也就是文本不会受外部元素float: left影响)。 ![](https://box.kancloud.cn/e42cbaad2d397aca8823182888668601_424x210.jpg) 再举个例子: ``` <div class="father"> <div class="child"></div> </div> .father { border: 1px solid black; } .child { float: left; width=height=100px; background-color: red; } ``` ![](https://box.kancloud.cn/91f1b888af85fd391fa5bfe7131c7386_424x210.jpg) 可以看到,float影响了father的布局。我们为father设置`overflow: hidden`,效果如下: ![](https://box.kancloud.cn/76c5f6386709b274f2a06873c6da5205_424x210.jpg) table-cell的特性:不管你给他设置多么大的宽,它都不会超过父级的宽。 ### overflow 当子元素内容超过容器高度限制的时候,裁剪的边界是`border box`,而非`padding box`。 在chrome浏览器下,如果容器可滚动,则padding-bottom也算在滚动尺寸之内,ie和firefox会忽略padding-bottom。 当滚动到底部时,chrome的效果: ![](https://box.kancloud.cn/cc5e6c601f4672a13c9dbffb02f572c9_424x210.jpg) ie和firefox的效果: ![](https://box.kancloud.cn/2e345a0cd433efdb5afb64859954c7fc_424x210.jpg) 浏览器的差异会导致scrollHeight和其他值不一样,因此,不要在滚动容器中设置padding-bottom,而是在最底部的子元素上设置margin-bottom。 在pc端,窗体滚动高度可以使用`document.documentElement.scrollTop`获取,在移动端可以使用`document.body.scrollTop`获取。 *** 文字溢出时的点点点效果: ``` .ell { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } ``` 锚点定位的两种方法: * id * a标签的href ``` <div id="here"></div> <a name="there"></a> <a href="#here">toHere</a> <a href="#there">toThere</a> ``` 在滚动元素上设置overflow: hidden,你会看见内容被裁剪了,滚动条也不见了。其实,内容并没有被裁剪,滚动条也仅仅是隐藏了,鼠标无法滚动了而已。不信你用js更改滚动条的滚动距离或者锚点定位一下,你会发现和overflow: auto\scroll没区别。 ### absolute 绝对定位的宽与高均是针对参照物定位的。 正常流的width100%和height100%参考自father的`content box`,absolute则参考自参照物的`padding box`。absolute的top\right\bottom\left无视参照物的padding,始终从padding外侧开始定位。absolute的margin和trbl是可以共存的,效果是二者之和。trbl的百分比同width和height,参照的是参照物的`padding box`,你就这么认为吧,绝对定位的所有百分比均参考的是参照物的`padding box`。 如果只设置了absolute而没有指定trbl中的任何一个,那么元素的布局与正常流没区别,唯一的区别就是它不占据空间了。举个例子: ![](https://box.kancloud.cn/f75564a60b2a10531a3722603620b5ba_372x384.jpg) absolute的定位(不使用trbl)则不需要父元素设置为relative,当然,如果你设置的值是百分比就需要指定父元素为relative,否则它会一直向上寻找直到找到参照物并参考它的`padding box`作为百分比的值。 *** 父级的text-align会影响absolute(不管absolute的元素是内联还是块级),因此用它实现水平居中: ``` .father { text-align: center; } .child { display: inline-block; position: absolute; width=height=100px; margin-left: -50px; } //原理:inline-block会在child前面产生幽灵空白节点,text-align: center使得幽灵空白节点居中于father。而child为absolute使其表现为无依赖的绝对定位,最终位于幽灵空白节点的后面。然后我们再使用margin-left调整位置。 //兼容edge浏览器 .father:before { content: ''; } ``` ### absolute与overflow 以下几种情况,overflow不会裁剪: ``` <div style="overflow: hidden;"> <img src="xxx.jpg" style="position: absolute;"> </div> //子元素设置了absolute,不裁剪 ``` ``` <div style="position: relative;"> <div style="overflow: hidden;"> <img src="xxx.jpg" style="position: absolute;"> </div> </div> //overflow的父级元素是定位元素,不裁剪 ``` ``` <div style="overflow: hidden; position: relative;"> <img src="xxx.jpg" style="position: absolute;"> </div> //overflow本身也是定位,裁剪,请与1做对比 ``` ``` <div style="overflow: hidden;"> <div style="position: relative;"> <img src="xxx.jpg" style="position: absolute;"> </div> </div> //overflow和定位元素之间还有一个定位元素,裁剪。请与2做对比 ``` 如果overflow的属性值不是hidden,那么即使绝对定位元素高度比overflow元素高度还要大,也不会出现滚动条。 除了以上之外,当遇到absolute元素被裁剪或者fiexd固定定位失效时,看看定位元素的子元素是不是设置了transform。 ### absolute的流体特性 当设置了trbl后,绝对定位才真正变成绝对定位元素。 绝对定位的height百分比直接参考参照物的`padding box`垂直方向,不需要从html、body开始一层层设置height。 ### relative 相对定位设置trbl是相对于自身进行偏移的,有点像margin,但不会影响后面元素的布局。 ``` //文字不动,只是div上移100 <div relative top-100></div> <p>123</p> //文字跟着div一起上移100 <div margin-top-100></div> <p>123</p> ``` 相对定位中,一切百分比均参考自父级的`content box`,注意是父级,而不是参照物。对于relative来说,参照物就是父级。垂直方向参考自父级的height。 与absolute不同,当relative的设置了对立方向(top-bottom、left-right)时,根据文档流的方向保留,比如,正常文档流下设置同时设置了trbl,只有tl生效。 定位元素的层级大于正常元素。 ### fixed fixed元素的参照物是根元素html。 我们往往使用fixed实现全屏模态框(将遮罩层设为fixed),但你会发现当模态框内容溢出时你去滚动它,正常文档也会跟着滚动没有锁定。如果是移动端项目,阻止touchmove事件的默认行为可以防止滚动;如果是pc端项目,直接让根元素overflow: hidden即可。