CSS中的浮动、高度塌陷以及清楚浮动

一、CSS浮动

浮动(float)的框可以左右移动,直至它的外边缘碰到包含框或另一个浮动框的外边缘。浮动框不属于文档中的普通流,当一个元素浮动之后,不会影响到块级元素的布局而只会影响内联元素(通常是文本)的排列,文档中的普通流就表现得如同浮动框不存在一样。当浮动框高度超出包含框的时候,就会出现包含框不会自动升高来闭合浮动元素(“高度塌陷”现象)。

<!DOCTYPE html>
<html>
<head>
   <style type="text/css">
   * {
           margin:0;
           padding:0;
   }
       .container {
           width:300px;
           height:156px;
           border:1px solid blue;
           margin:100px;
       }
       .block1 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
       .block2 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
       .block3 {
           width:50px;
           height:50px;
           border:1px solid red;
       }
   </style>
</head>
<body>
    <div class="container">
        <div class="block1"><span>块1</span></div>
        <div class="block2"><span>块2</span></div>
        <div class="block3"><span>块3</span></div>
    </div>
</body>
</html

以上代码是三块div均未加float时在浏览器显示效果如下图。块元素各自独占一行。

以下是块1向右浮动,开始脱离文档普通流向右移动,知道块1的右边缘碰到包含它的块(父块)的右边缘。由于我们给包含块设置了padding,所以块1与父块之间有该内边距。可知,所谓边缘相碰,应该是包含了内边距在内的。

因为浮动块不在文档的普通流中,所以文档的普通流中的块框就表现得像浮动块不存在一样排列(浮动不影响块级元素排列)。所以块2、块3就按照没有块1存在那样排列。

以下是块1向左移动。在代码中我将块三width变宽,块3文字靠右。可以发现,当块1向左浮动时,它脱离文档流并且向左移动,知道它的左边缘碰到父块的左边缘。因为它不再处于文档流中,所以它不占据空间,而因为又不影响块框的排列,所以实际上块1覆盖住了块2,使块2从视图中消失。但是据图可知,块2的内容却显示在块1未浮动时块2所处的位置了。所以:浮动元素不影响块框元级元素布局,但是可以影响内联元素(主要是文本)布局。所以可以使用浮动来达到文字环绕图片的效果。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4    <style type="text/css">
 5    * {
 6            margin:0;
 7            padding:0;
 8    }
 9        .container {
10            width:300px;
11            height:156px;
12            border:1px solid blue;
13            margin:100px;
14            padding-right:5px;
15        }
16        .block1 {
17            width:50px;
18            height:50px;
19            border:1px solid red;
20            float:left;
21        }
22        .block2 {
23            width:50px;
24            height:50px;
25            border:1px solid red;
26        }
27        .block3 {
28            width:100px;
29            height:50px;
30            border:1px solid red;
31            text-align: right;
32        }
33
34    </style>
35 </head>
36 <body>
37     <div class="container">
38         <div class="block1"><span>块1</span></div>
39         <div class="block2"><span>块2</span></div>
40         <div class="block3"><span>块3</span></div>
41     </div>
42 </body>
43 </html>

浮动不影响块框元素

如果把三个框都向左浮动,那么块1向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框。

如果包含框太窄,无法容纳水平排列的三个浮动框,那么其他浮动框向下移动,直到有足够的空间。

如果浮动元素的高度不同,那么当它们向下移动时可能被其他元素"卡住"。

二、浮动“”塌陷“”:

如果父元素只包含浮动元素,且父元素未设置高度和宽度的时候,那么它的高度就会踏缩为零。这是因为浮动元素脱离了文档流,包围它们的父块中没有内容了,所以“”塌陷“”了。

解决“塌陷”有以下几种方法:

方法一、使用带clear属性的空元素

在父块中、浮动元素后使用一个空元素,如<div class="clear"></div>,并在css中赋予 .clear{clear:both}属性即可清除浮动。也可使用<br class="clear"/>或<hr class="clear"/>来进行清除。

给空元素设置clear后,因为它的左右两边不能有任何浮动元素,所以空元素下移到浮动元素下方。而空元素又包含在父块中,相当于把父块撑开了,视觉上起到了父块包含浮动元素的效果。

优点:简单,代码少,浏览器兼容性好。

缺点:需要添加大量无语义的html元素,代码不够优雅,后期不容易维护。不推荐使用。

方法二:使用CSS的overflow属性

给浮动元素的容器添加overflow:hidden;或overflow:aoto;可以使浮动元素回到容器层内,清除浮动。

方法三:给浮动元素的容器添加浮动

给浮动元素的容器(父元素)也添加上浮动属性即可清除浮动,但是这样会使下一个元素收到这个浮动元素的影响,影响整体布局,不推荐使用。

方法四:使用CSS的:after伪元素

:after伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)。

给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素清理浮动。

<!DOCTYPE html>
<html>
<head>
   <style type="text/css">
   * {
           margin:0;
           padding:0;
   }
       .container {

           border:1px solid blue;
           margin:100px;
           padding-right:5px;
       }
       .block1 {
           width:50px;
           height:50px;
           border:1px solid red;
           float:left;
       }
       .block2 {
           width:50px;
           height:50px;
           border:1px solid red;
           float:left;
       }
       .block3 {
           width:50px;
           height:50px;
           border:1px solid red;
           text-align: right;
           float:left;
       }
    .clearfix:after{
        content:".";
        display:block;
        height:0;
        clear:left;
        visibility:hidden;
    }
   </style>
</head>
<body>
    <div class="container clearfix">
        <div class="block1"><span>块1</span></div>
        <div class="block2"><span>块2</span></div>
        <div class="block3"><span>块3</span></div>
    </div>

</body>
</html>

通过CSS伪元素在容器内部元素最后添加了一个看不见的点“.”,并且赋予clear属性来清除浮动。

参考文章列表:

  1. CSS浮动
  2. CSS技巧(一):清除浮动
  3. 浮动布局float带来的高度塌陷——清除浮动
时间: 2024-08-03 10:16:55

CSS中的浮动、高度塌陷以及清楚浮动的相关文章

css float父元素高度塌陷

css float父元素高度塌陷 float 使父元素高度塌陷不是BUG,反而是标准. float 原本是为了解决文字环绕才出现的. 当然有的时候要解决高度塌陷的问题 以下几个方法可以解决float 父元素高度消失/塌陷的问题 .clearfix:after{content:'';display:block;height:0;overflow:hidden;clear:both;} .clearfix {*zoom:1} 更好的方法是 .clearfix:after{content:'';dis

认识CSS中布局之文档流、浮动、定位以及叠放次序

前端之HTML,CSS(七) CSS CSS布局的核心就是盒子的摆放,即CSS定位.而CSS中定位机制分为:普通流(nomal flow).浮动(float).定位(position). 普通流 普通流又被称为文档流或者标准流,普通流是指网页内标签元素正常情况下会按照自上而下,自左向右按顺序排列.即块级元素独占一行,多个块级元素存在会自上而下顺序排列,多个行内元素会共占一行,自左向右排列. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 &l

浮动 高度塌陷

## 浮动 - 使用float设置元素浮动 - 可选值 - none 默认值. 元素不浮动 - left 元素向左浮动 - right 元素向右浮动 - 浮动的特点: - 当元素设置浮动后,元素会向页面左上或右上浮动 - 当浮动元素遇到父元素边框后, 会停止浮动 - 当浮动元素遇到其他浮动元素时,会停止浮动 - 如果浮动元素上是一个没有浮动的块元素,浮动元素不会超过它 - 浮动元素不会超过它上边浮动的兄弟元素 - 浮动元素不会覆盖文字. 文字会环绕在浮动元素周围 - **浮动元素会完全脱离文档流

是的,是你的BFC - CSS中常用

是的,是你的BFC - CSS中常用 CFC 全称:(Block Formatting Contexts)含义是块级格式化上下文),就是一个块级元素的渲染显示规则 一.简易理解.定义 可以把 BFC 理解为一个封闭的大箱子,容器里面的子元素不会影响到外面的元素,同时外面的元素也不会影响我们容器内的子元素. 二.BFC布局规则 内部的盒子会在垂直方向,一个个地放置: 属于同一个BFC的 两个相邻Box的 上下margin会发生重叠 : 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此

css关于浮动的高度塌陷

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>BFC</title> 6 <style type="text/css"> 7 .div1 {background-color: #FCE38A; width: 200px; height: 100px;}

css中的浮动与三种清除浮动的方法

说到浮动之前,先说一下CSS中margin属性的两种特殊现象 1, 外边距的合并现象: 如果两个div上下排序,给上面一个div设置margin-bottom,给下面一个div设置margin-top,那么两个margin会发生合并现象,合并以后的值较大的那个. 对于这种现象一般不用处理. 2,margin塌陷现象: 如果一个大盒子中包含一个小盒子给小盒子设置margin-top大盒子会一起向下平移. 解决方案: 1.0给大盒子加一个边框border属性. 2.0给大盒子设置一个overflow

CSS中清除浮动的两种方式

在CSS中,父元素中的子元素如果使用了float,会导致父元素塌陷,高度为0. 对于这种情况,常见的解决方式有两种. 一.增加新的div,应用clear:both属性 html: 1 <div class="father"> 2 <div class="div1">1</div> 3 <div class="div2">2</div> 4 <div class="div3

CSS高度塌陷

问题描述:当父元素只包含浮动的元素的时候,且父元素没有设置高度,如果父元素设置了边框border,那么看起来子元素不在父元素之内. 比如这样: html: <div id="parent"> <div class="left"></div> <div class="right"></div> </div> CSS: div { border: 2px solid #000;

[转]CSS: inline-block的应用和float块高度塌陷

普通流高度塌陷: 当块float浮动时,不会对块布局产生影响,块仍然会按照左右或者上下的顺序排列.但是会影响文档的排列,当文档的高度超过块的高度时,块的高度会产生塌陷现象. 高度塌陷解决方法: 闭合浮动: 1.在浮动元素末尾添加一个空的标签例如 <div style=”clear:both”> 2.<br clear="all" />原理类似上面 3.父元素设置 overflow:hidden; 在IE6中需要出发hasLayout,例如zoom:1.缺点: 会