• --外功篇-《CSS的天空》-清除浮动以及清除浮动的方法--


    清除浮动

    float布局,是我们在CSS中经常使用到的一种布局方式,能够快速的将元素设置为靠左、靠右的样式。但在我们使用的过程中,由于设置float属性,而经常导致布局塌陷,混乱。这篇笔记将记录float出现的原因以及解决办法。

    浮动

    首先,万事看文档:

    float CSS属性指定一个元素应沿其容器的左侧或右侧放置,允许文本和内联元素环绕它。该元素从网页的正常流动(文档流)中移除,尽管仍然保持部分的流动性(与绝对定位相反)。 ——MDN-CSS-float

    由文档可知,float设计的初衷是为了能够使文本内容、内联元素实现环绕效果。

    例如:

    并且,float属性会将元素在正常文档流中移除,也就是会造成父元素实际大小出现塌陷的原因。

    浮动造成的布局塌陷

    代码样例:

    #box{
    	background-color: orange;
    }
    #boxson{
    	float: left;
    	 50px;
    	height: 50px;
    	background-color: #999;
    }
    /*CSS代码*/
    
    <div id="box">
    	<div id="boxson">
    	</div>
    </div>
    <!--html代码-->
    

    效果:

    由效果可知,在某些情况下,父元素没有设置宽高(需要子元素撑起来的情况下),对子元素使用float布局,会造成父元素的宽高塌陷。

    清除浮动的几种方式

    一、clear:both

    #box{
    	background-color: #333333;
    }
    #boxson{
    	float: left;
    	 50px;
    	height: 50px;
    	background-color: #999;
    }
    #boxson2 {
    	clear: both;
    }
    /*CSS部分*/
    
    <div id="box">
    	<div id="boxson"></div>
    	<div id="boxson2"></div>
    </div>
    <!--html部分-->
    

    clear:both是官方推荐的方法,在原本设置float元素的父元素里,所有子元素的最后,添加一个无内容的标签,对该标签设置clear:both进行清除浮动。

    效果:

    缺点:

    增加了无意义的冗余标签,影响页面代码的整洁。而且对于父元素中,依靠标签选择器设置样式时,难免会出现样式设置的麻烦。

    二、overflow:hidden

    #box{
    	overflow: hidden;
    	background-color: #333333;
    }
    #boxson{
    	float: left;
    	 50px;
    	height: 50px;
    	background-color: #999;
    }
    /*CSS代码*/
    
    <div id="box">
    	<div id="boxson">
    	</div>
    </div>
    <!--html代码-->
    

    通过在父元素中设置overflow:hidden,使父元素在计算实际宽高时会将float计算进去,所以同样能够清除float带来的浮动缺陷。

    效果:

    缺点:

    overflow:hidden设置起来着实方便,但对于子元素的size大于父元素时,就会影响到页面的显示效果了。

    三、使用:after伪元素标签

    #box{
    	background-color: #333333;
    }
    .clearfix:after {
    	content: '';
    	display: block;
    	visibility: hidden;
    	height: 0;
    	clear: both;
    }
    .clearfix{
    	zoom: 1;
    }
    #boxson{
    	float: left;
    	 50px;
    	height: 50px;
    	background-color: #999;
    }
    /*CSS Code*/
    
    <div id="box" class="clearfix">
    	<div id="boxson">
    	</div>
    </div>
    <!--html Code-->
    

    使用伪类选择器的方式是依据clear:both的写法,绕过dom树,解决直接使用clear:both带来的代码冗余的问题,同时设置为display:block能够使其宽高有意义,将高度height设置为0,visibility:hidden设置为不可见,创造一个无意义的元素。

    设置.clearfix{ zoom: 1;}解决IE6不兼容的问题。

    (京东页面商城清除浮动的写法就是如此)

    四、另一种伪类选择器写法

    #box{
    	background-color: #333333;
    }
    .clearfix:before,
    .clearfix:after {
    	content: '';
    	display: block;
    }
    .cearfix:after {
    	clear: both;
    }
    .clearfix{
    	zoom: 1;
    }		
    #boxson{
    	float: left;
    	 50px;
    	height: 50px;
    	background-color: #999;
    }
    /*CSS Code*/
    
    <div id="box" class="clearfix">
    	<div id="boxson"  >
    	</div>
    </div>
    <!--html Code-->
    

    通过前后伪类元素撑起父元素,省略了设置伪类元素的高度的步骤。

    五、将父元素进行浮动

    还有一种是将父元素也进行float属性设置,意味着将父元素也进行脱离文档流的操作。这种不太推荐。很可能会导致父元素的父元素也存在清除浮动需要解决的问题,这种解决方式应用的地方较少。

    清除浮动的方法就是这些。

    由清除浮动引发的一些待学习的问题:

    1. 为什么overflow:hidden就能简单快速的实现浮动,背后的原理机制是什么?
    2. 盒子模型里,元素宽高的实际值究竟是如何设置的?

    参考:

    阮一峰老师的博客:

    浮动元素容器的clearing问题

    离大侠再近一步!
  • 相关阅读:
    type( ) 和 isinstance( )
    el-input-number element计数器设置自定义小数位数
    Electron-Vue起步
    SmartGit破解使用的个人方法
    js 之 数组去重
    Vue动态class
    vue项目如何(友好的)刷新当前页
    Promise()与链式执行
    Vue过渡&循环切换&放大缩小动画
    css Margin塌陷问题(margin属性撑不开盒子)
  • 原文地址:https://www.cnblogs.com/Samo-Li/p/13915073.html
Copyright © 2020-2023  润新知