当前位置: 首页 > Web前端 > CSS

【前端Talkking】CSS系列——floatfloat

时间:2023-03-30 16:07:24 CSS

深入理解CSSfloat属性是CSS中常用的属性。在实际工作中用的很多。如果使用不当,会出现意想不到的效果。虽然很多人说浮动可以用,浮动已经过时了,但是优秀的前端开发人员需要有“追根究底”的精神,才不会在出现一些问题的时候“手忙脚乱”!所以,今天我就专门对float属性进行整理和总结。一、float简介float属性在CSS界是一个非常古老的属性。设置了浮动属性的元素将根据设置的属性值向左或向右浮动,直到其外边缘接触到包含框或另一个浮动到框架的边界。设置了浮动属性的元素会从正常的文档流中分离出来,相当于不占用任何空间,所以正常流中的元素在文档中的表现就好像浮动元素不存在一样。因此,设置浮动属性会影响我们的页面布局。具体来说就是让block元素忽略float元素,让inline元素像流水一样包围float元素,实现浮动布局。float属性设计的初衷:就是让文字像流水一样围绕着漂浮的元素,如下图:2.float的特点float有哪些有趣的特点?具体情况如下:包覆、高度塌陷、块状,无任何边缘合并。下面将详细解释这些点的含义。2.1封装所谓“封装”,其实是由“封装”和“自适应”两部分组成。假设有如下CSS代码:/*CSScode*/.father{border:1pxsoliddeeppink;宽度:200像素;}.son{浮动:左;字体大小:0;边框:1px纯蓝色;padding:5px;}.fatherimg{width:128px;}1)包装。本例中浮动元素的父元素宽度设置为200px,浮动元素的子元素为一张图片,宽度为128px。这时候浮动元素的宽度被“包裹”了,也就是里面图片的宽度是128px。/*HTML代码*/

2)适应性。在浮动子元素中添加一些文本:/*HTML代码*/美女1、美女2、美女3、美女4、美女5、美女6、后宫1、后宫2、后宫3、后宫
此时浮动元素的宽度自适应父元素的200px宽度,最终的宽度表现也是200px。如下图所示:2.2高度塌陷float属性有一个众所周知的特点:它会塌陷父元素的高度。如2.1章节效果图所示,父元素div的高度没有被子元素拉伸(粉色区域),这种效果可以称为“高度塌陷”。float对div.son蒙上了一层阴影,让元素的高度塌陷为0,所以在计算外层div的高度时,认为div.son的高度为0,相当于高度div.son的内容的为0,那么div.father就认为它没有子元素,所以崩溃率很高。高塌问题如何解决,后面会讲到。2.3阻塞阻塞是指一旦元素的float属性不为none,其显示计算值为block或table。例如:/*JavaScript代码*/varspan=document.createElement('span')document.body.appendChild(span)console.log('1.'+window.getComputedStyle(span).display)//设置元素向左浮动span.style.cssFloat='left'console.log('2.'+window.getComputedStyle(span).display)控制台结果如下:1.inline2.block我没有知道有没有和我一样的问题:既然元素设置了float之后就变成块状了,怎么还能产生环绕效果呢?要回答这个问题,需要重新定义block的含义。这里的块是指像块元素一样可以设置宽高,并不是真正的块元素。因此,没有理由采用以下样式组合:span{display:block;/*冗余*/float:left;}span{浮动:左;垂直对齐:中间;/*redundant*/}2.4没有任何边距Overlap这里我们在.son类中添加margin:10px样式,在浏览器中查看实际效果。/*HTML代码*/我们将.son类的边距增加到10px,浏览器中相邻.son元素的空白区域高度为20px,我们可以发现设置了float属性的元素没有任何marginoverlap,这与正常的元素marginoverlap不同。3.浮动和流体布局使用浮动可以通过破坏正常的文档流来实现CSS换行,但是带来了“高度崩塌”的问题!但是,我们可以利用浮动的特性破坏正常的文档流来实现一些常见的布局:文字环绕变换——中间内容居中,左中右布局直接看例子:左青龙右白虎标题.box{background-color:#f5f5f5;}.fl{float:left;}.fr{float:right;}.text-center{text-align:center;}从下图可以看出,实现了一种中间内容居中的左中右布局。文字换行的推导——固定在一侧美女3、美女4、美女5、美女6、后宫1、后宫2、后宫3、后宫4、后宫5、后宫6

.father{border:1px纯色#444;溢出:隐藏;}.father>img{宽度:60px;高度:64px;float:left;}.girl{/*surround和adaptive的区别*/margin-left:70px;}和文字环绕效果相比,区别在于.girl多了一个margin-left:70px,宽度图片设置为60px,所以不会出现文字环绕的效果。这里我们不使用margin-left,而是通过border-left或者padding-left来改变内容框的大小,达到宽度自适应的布局效果。4、float的克星既然使用float属性会带来一系列的问题,那么有没有办法消除这些问题呢?答案是:肯定有。阅读下文。4.1clear属性在CSS中,可以使用clear来清除导致高度塌陷等问题的float属性。格式如下:clear:none|左|对|bothnone:默认值,允许两边浮动物体;left:不允许left有漂浮物;右:右侧不允许有漂浮物;both:两边都不允许漂浮物体。如果按字面理解,clear:left应该是“清除左浮动”,clear:right应该是“清除右浮动”,其实这个说法是有问题的,因为浮动还在,并没有清除!只能清除浮动的影响。官方对clear属性的解释是:“元素框的边缘不能与前一个浮动元素相邻”。注意这里的“前”三个字,即clear属性对“后”的浮动元素无动于衷。clear属性只能清除元素本身,不能影响其他元素。然后看下面的例子:/*HTML代码*//*CSS代码*/.box1{float:left;宽度:100px;高度:60px;填充:10px;边框:3px纯黑色;background:url("../../lib/img/mm1.png")centerno-repeat;}.box2{border:3pxsolidred;填充:10px;宽度:100px;高度:60px;background:url("../../lib/img/mm2.jpg")centerno-repeat;}如上图所示,box1元素设置了左浮动,脱离了正常的文档流,所以box2可以显示在box1的底部。如果想让box2换行,只需要在.box2类中添加clear:left样式即可。如下图所示:4.2clear属性的不足clear属性只对块级元素有效,但是::after等伪元素默认都是内联的。因此,在实际工作中,我们经常使用如下代码来清除浮动带的影响:.clear::after{content:"";display:table;/*也可以是'block'或者'list-item'*/clear:both;}因为clear:both的本质是让它不和float元素显示在同一行,而且它并不是真正意义上的clearfloating,所以float元素的一些不好的特性还是存在的,如:ifclear:both元素前面的元素是float元素,那么setmargin-topvoid;/*HTML代码*//*CSS代码*/.box1{float:left;宽度:100px;高度:60px;填充:10px;边框:3px纯黑色;背景:url("../../lib/img/mm1.png")centerno-repeat;}.box2{clear:both;边距顶部:-20px;边框:3px纯红色;填充:10px;宽度:100px;高度:60px;background:url("../../lib/img/mm2.jpg")centerno-repeat;}本例中.box2中设置margin-top没有效果,如下图:elementsbehindclear:both可能仍然有文本换行。

美1,美2,美3、美女4、美女5、美女6、后宫1、后宫2、后宫3、后宫

我要美女1,我要美女2
/*CSS代码*/.father{border:1pxsoliddeeppink;宽度:500px;height:70px;}.father:after{content:'';显示:表格;清除:两者;}.float{float:left;}.fatherimg{width:60px;height:70px;}本例中设置了clean:both是为了防止浮动对后面元素的影响,但是还是出现了最终的错位效果(可以将.father的字体大小设置为0,然后设置p标签的字体大小解决了错误的问题)。可见clear:both只能在一定程度上消除浮动元素的影响。如果你想完美去除浮动元素的影响,可以使用其他手段——BFC,再往下看。5、CSS世界的魅力——BFC5.1BFC的定义BFC的全称是blockformattingcontext,中文为“块格式化上下文”。BFC的表现原则是:如果一个元素有BFC,不管它内部的子元素多么压倒性,都不会影响到外部元素。因此,BFC元素不可能重叠边距。另外,BFC元素也可以用来去除浮动的影响。那么拥有BFC必须满足什么条件呢?只要满足以下任一条件,就会触发BFC:html根元素;float的值不是无;overflow的值为auto、scroll或hidden;display的值为table-cell、table-caption和inline-block中的任意一个;位置的值不是相对的或静态的;BFC触发后,不需要再用clear:both属性来清除浮动的影响。5.2BFCClearmarginoverlap的功能/*HTML代码*/

item1

item2

item3

item4

/*CSS代码*/.parent{width:300px;背景色:黑色;溢出:隐藏;}p{背景色:白色;边距:10px0;text-align:center;}在这种情况下,存在重叠边距的效果。如下图所示:使用BFC可以消除边距重叠。记住:只有当元素在同一个BFC中时,垂直方向的margin才会clollpase。如果它们属于不同的BFC,则不会有边缘重叠。所以我们可以构建另一个BFC来防止marginoverlap的发生。所以为了让他们的margin为20px,我们只需要用div创建一个BFC,让p元素在不同的BFC中即可。请看例子:/*HTML代码*/

item1

item2

item3

item4

从下图可以看出,借助BFC消除了marginoverlap的问题。清除高度塌陷的问题在上面章节中,如果子元素设置了浮动属性,那么父元素就会出现高度塌陷的问题。这里,我们可以使用BFC来消除高度塌陷的问题,请看下面的例子:/*HTML代码*/从下图可以看出,设置overflow:hidden样式后,会生成BFC,根据BFC的表现规则,内部元素的样式不会影响外部元素的样式,所以不存在高塌问题。自适应布局(防止文本换行)/*HTML代码*/美女1,美女2,美女3,美女4,美女5,美女6,后宫1,后宫2,后宫3,后宫4,

/*CSS代码*/.parent{border:1pxsolid深粉红色;宽度:200px;font-size:0;}.parentimg{border:1pxsolidblue;float:left;}.girl{/*overflow:hidden;*/font-size:12px;#cdcdcd;}如果我们给.girl元素设置具有BFC特性的属性,比如:overflow:hidden,就可以实现更加健壮和智能的自适应布局。这里的.girl元素沿着浮动边缘形成了自己的封闭上下文,以免与浮动元素有任何交集。设置overflow:hidden后,普通元素会自动填充容器中除浮动元素外的剩余空间,形成自适应效果。与纯流体布局相比,这种自适应布局由于其封闭性而更加健壮。它更容错;自适应内容可以填充浮动元素以外的区域,不需要关心浮动元素的宽度。6.结语这篇文章是我对float属性学习的一个总结。可能有些地方我的理解是准确的。欢迎大家在评论区评论指点。大家互相帮助,共同进步。最后希望本文的内容能够对大家对float的理解有所帮助,感谢阅读。参考张新旭-《CSS世界》认识的,不妨关注我的微信公众号《前端Talking》