css - CSS规则“清除:两者”有什么作用?

标签 css css-float

以下CSS规则有什么作用:

.clear { clear: both; }


为什么我们需要使用它?

最佳答案

我不会在这里详细解释浮点数的工作原理,因为这个问题通常集中在为什么使用clear: both;clear: both;的作用是什么...

我将使答案简单明了,并以图形方式向您说明为什么需要clear: both;或它的作用...

通常,设计人员将元素向左或向右浮动,从而在另一侧创建一个空白空间,以允许其他元素占用剩余空间。

为什么它们会浮动元素?

当设计人员并排需要2个块级元素时,元素将浮动。例如说我们要设计一个基本的网站,其布局如下图所示。



演示图像的Live Example

演示代码



/*  CSS:  */

* { /* Not related to floats / clear both, used it for demo purpose only */
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

header, footer {
    border: 5px solid #000;
    height: 100px;
}

aside {
    float: left;
    width: 30%;
    border: 5px solid #000;
    height: 300px;
}

section {
    float: left;
    width: 70%;
    border: 5px solid #000;
    height: 300px;
}

.clear {
    clear: both;
}

<!-- HTML -->
<header>
    Header
</header>
<aside>
    Aside (Floated Left)
</aside>
<section>
    Content (Floated Left, Can Be Floated To Right As Well)
</section>
<!-- Clearing Floating Elements-->
<div class="clear"></div>
<footer>
    Footer
</footer>





注意:您可能必须在样式表中将headerfooterasidesection(和其他HTML5元素)添加为display: block;,以明确提及这些元素是块级元素。

说明:

我有一个基本布局,1个标题,1个侧边栏,1个内容区域和1个页脚。

header没有浮点数,接下来是我将用于网站侧边栏的aside标记,因此我将元素向左浮起。


  注意:默认情况下,块级元素占用文档100%的宽度,
  但向左或向右浮动时,它将根据
  它拥有的内容。



Normal Behavior Of Block Level Element
Floated Behavior Of Block Level Element


因此,正如您所注意到的,向左浮动的div保留了未使用其右侧的空间,这将允许div移入剩余空间。


div's will render one after the other if they are NOT floated
div will shift beside each other if floated left or right


好的,这就是块级别元素向左或向右浮动时的行为,那么为什么现在需要clear: both;以及为什么?

因此,如果您在布局演示中注明-如果您忘记了,请here

我正在使用一个名为.clear的类,它包含一个值为clear的名为both的属性。因此,让我们看看为什么需要both

我已经将asidesection元素浮动到左侧,所以假设有一个场景,我们有一个池,其中header是坚实的土地,asidesection漂浮在池中,而页脚是再次坚实的土地,像这样。



因此,蓝色的水不知道浮动元素的面积是多少,它们可以大于池的面积,也可以小于池的面积,因此出现了一个使90%的CSS初学者感到困扰的常见问题:为什么容器元素的背景没有拉伸当它包含浮动元素时。这是因为容器元素在这里是一个POOL,而POOL不知道有多少对象在浮动,或者浮动元素的长度或宽度是多少,因此它根本不会拉伸。


Normal Flow Of The Document
Sections Floated To Left
Cleared Floated Elements To Stretch Background Color Of The Container


(请参阅此答案的[Clearfix]部分,以获取整洁的方法。我有意使用一个空的div示例进行说明)

我在上面提供了3个示例,第一个是正常的文档流,其中red背景将按预期显示,因为容器不包含任何浮动对象。

在第二个示例中,当对象向左浮动时,容器元素(POOL)将不知道浮动元素的尺寸,因此不会拉伸到浮动元素的高度。



使用clear: both;之后,容器元素将被拉伸到其浮动元素尺寸。



使用clear: both;的另一个原因是为了防止元素在剩余空间中向上移动。

假设您要并排放置2个元素,并在其下面放置另一个元素...因此,您将向左浮动2个元素,而您想在其下面放置另一个元素。


div Floated left resulting in section moving into remaining space
Floated div cleared so that the section tag will render below the floated divs




第一个例子





第二个例子



最后但并非最不重要的一点是,footer标签将在浮动元素之后呈现,因为在声明我的clear标签之前,我已经使用过footer类,这可以确保清除所有浮动元素(左/右)到这一点。



Clearfix

来到与浮点数有关的clearfix。正如@Elky已经指定的那样,清除这些浮点数的方法并不是一种干净的方法,因为我们正在使用一个空的div元素,而该元素不是div元素。因此,这里出现了clearfix。

将其视为虚拟元素,它将在父元素结束之前为您创建一个空元素。这将自动清除包含浮动元素的包装器元素。该元素实际上不会在您的DOM中存在,但可以完成此工作。

为了自清除任何具有浮动元素的包装器元素,我们可以使用

.wrapper_having_floated_elements:after {  /* Imaginary class name */
  content: "";
  clear: both;
  display: table;
}


注意我为该:after使用的class伪元素。这将在包装器元素自身关闭之前为其创建一个虚拟元素。如果我们查看dom,您会看到它在Document树中的显示方式。

Clearfix

因此,如果看到的话,它将在浮动子元素div之后呈现,在该子元素中我们清除了浮点数,这不过是等于有一个具有div属性的空clear: both;元素,我们也将其用于此目的。现在为什么display: table;content不在此答案范围内,但是您可以了解有关pseudo element here的更多信息。

请注意,这在IE8中也可以作为IE8 supports :after pseudo使用。



原始答案:

大多数开发人员在页面上左右浮动内容,可能是带有徽标,侧边栏,内容等的div,这些div则是左右浮动,剩下的空间未使用,因此,如果您放置其他容器,它将在剩余空间中也会浮动,因此为了防止使用clear: both;,它将清除所有向左或向右浮动的元素。

示范:

------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------


现在,如果要在div1下进行另一个div渲染,那么将使用clear: both;,这样可以确保清除所有浮动,无论是左侧还是右侧

------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------

关于css - CSS规则“清除:两者”有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32267927/

相关文章:

html - div 没有出现在 brother navbar div 下面?

html - 为什么 float-right 元素没有一直到顶部?

html - 在一行中 float DIV,没有固定宽度

css - float 两个相邻元素会影响第四个元素

CSS 未从样式表应用?

css - 选择 Safari Windows 上缺少的箭头

javascript - 在 <p> 标签中包装拉出的文本

html - 如何设置图片后面的文字滚动

javascript - 标记下拉菜单和复选框时如何链接到页面

css - div 在 td 中,但 td 被意外扩展