【首先解释部分】
eg:父topDiv 浮动floatDiv (左浮)子textDiv / 父的兄弟bottomDIv
首先 textDiv设置clear left
(1)通过上面的样式,.textDiv
告诉浏览器,我的左边不允许有浮动的元素存在,请清除掉我左边的浮动元素。然而,因为浮动元素(.floatDiv
)位置已经确定,浏览器在计算.textDiv
的位置时,为满足其需求,将.textDiv
渲染在浮动元素下方,保证了.textDiv
左边没有浮动元素。同时可以看出,父元素的高度也被撑起来了,其兄弟元素的渲染也不再受到浮动的影响,这是因为.textDiv
仍然在文档流中,它必须在父元素的边界内,父元素只有增加其高度才能达到此目的,可以说是一个意外收获。(clear
的值为both
也有相同的效果,通俗理解就是,哪边不允许有浮动元素,clear就是对应方向的值,两边都不允许就是both
)
(2)如果先孩子,再float元素(不行,因为先确定子元素,浮动另起一行就影响不到了)(所以也有个局限,最好的还是用空的代替)
.textDiv
的位置先确定了,于是浮动元素就紧接着.textDiv
下方渲染在父元素的左侧。然而,父元素的高度并没有被撑起来,没有将浮动影响“内化”,导致浮动影响到了接下来的元素排版。
实际上,这里主要是为了清除浮动,撑起来父元素是个附属品
(3)根据这个思路,因为不能确定是否父元素的最后一个元素能否做到clearboth 更为通用的是添加一个blank来清除
<div class="blankDiv"></div>
注意必须是块级元素,否则无法撑起父级元素高度。
(是因为为了满足这个块级的clear要求,父元素额外定位的,行内的话就没有高度了)
(4)同样的 原理 只是利用伪元素来做都不用加新元素了
原理是,想让after的左边也没有伪元素,这样兄弟就正常了,底部和父元素的边框也正常了,
可以看到before是完了才另起一行的,after才能碰到float,所以就在after身上设置clear both
设置block是必须要有高度才能有能力撑起来,哪怕高度是0,也是有那个能力在的…… 如果是行内的话就直接被忽略了块元素不会!
(5)父元素 overflow: auto;
这里的overflow值,可以是除了"visible"之外的任何有效值
副作用比如,scroll值会导致滚动条始终可见,hidden会使得超出边框部分不可见等
因为bfc:BFC在计算高度的时候,内部浮动元素的高度也要计算在内。也就是说,即使BFC区域内只有一个浮动元素,BFC的高度也不会发生塌缩,高度是大于等于浮动元素的高度的。
display inline -block也可以bfc,但是
在各种构建BFC的方式中,overflow
方式可能是外部影响更可控的一种所以也是最常用
【其次解决方案】
解决方案:看了半天,一般这三个是最主流的:
(1)比如有三个浮动的元素,再加一个浮动的子元素,并设置clear: both
语义化不太好
(2)父元素overflow:hidden,形成bfc(scroll也可以)
(3)父元素伪元素
.clearfix:after{/*伪元素是行内元素 正常浏览器清除浮动方法*/content:"";display:block;clear:both;}.clearfix{*zoom:1;/*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/}
其他的bfc会有一些问题(子元素它确实没有影响到外部了,这个影响是父元素影响到了外部)
QAQ bfc呢,也是
overflow(不是visible)
display flex 、inline-block
position(ab,fix)
float(right left
(但首先bfc有一些问题,尤其是下面那两个,其次你讲bfc太混乱了人家不懂)
参考 https://juejin.cn/post/6844903504545316877#heading-4
和js比起来,css弄清除了原理已经算很简单了。。
附赠补充:
1、伪类
伪类是选择器的一种,它用于选择处于特定状态的元素,比如当它们是这一类型的第一个元素时,或者是当鼠标指针悬浮在元素上面的时候。它们表现得会像是你向你的文档的某个部分应用了一个类一样,帮你在你的标记文本中减少多余的类,让你的代码更灵活、更易于维护。
伪元素
表现得是像你往标记文本中加入全新的HTML元素一样,而不是向现有的元素上应用类。伪元素开头为双冒号::(早期单冒号 但是双冒号更规范哦)
比如::first-line可以精准自适应选中第一行
::before 这些伪元素的更推荐的用法是插入一个图标,例如下面的示例加入的一个小箭头,作为一个视觉性的提示,而且我们并不希望屏幕阅读器读出它。