一. CSS浮动

先看一个例子

<html !DOCTYPE>
<head>
<title>HTML2</title>
<style>
.div-outer {
border: solid 2px #223344;
}
.div1 {
width: 200px;
height: 100px;
border: solid 2px #667788;
}
.div2 {
width: 200px;
height: 100px;
border: solid 2px #667788;
}
.div3 {
width: 200px;
height: 100px;
border: solid 2px #667788;
}
</style>
</head>
<body>
<div class="div-outer">
<div class="div1">div1</div>
<div class="div2">div2</div>
<div class="div3">div3</div>
</div>
</body>
</html>

页面如图所示

在div-outer内部的三个div默认每个div会占一行,所以三个div会成列显示。

现在对div1设置float: left,页面如图所示

可以看到div2和div3重合了。
对div1设置float: left属性,div1脱离文档流,但是仍占据位置,div2和div3重合是因为div2位置不变,div3也在div2的位置。但是发现这样理解是不对的,正确的理解是div2被div1挤到了现在div3的位置。
因为如果对div1设置float: right,页面如图所示

所以如果对div1设置float: left时,div2会被div1挤到现在div3的位置。

二. CSS浮动塌陷

如果对div1,div2,div3都设置float: left,但是父元素div-outer没有设置宽度和高度,页面如图所示

如果没有设置父元素高度,父元素的高度默认是auto,会随子元素的高度而改变,如果对div1,div2,div3都设置float: left,那么此时父元素高度为0,这就是浮动塌陷。

三. 解决方法

1. 添加一个新的div

在div3下面添加一个宽度为0,高度为0,并且设置clear: both属性的空div。

.div4 {
clear: both;
} <div class="div4"></div>

页面如图所示

父元素的高度可以显示了。

2. 设置父元素属性

对父元素设置属性overflow: hidden或overflow: auto,

.div-outer {
border: solid 2px #223344;
overflow: hidden;
}

设置overflow: hidden的意思是,overflow规定当内容溢出元素框时发生的事情,

因为父元素没有指定高度,默认是auto,所以需要计算父元素包含的内容的高度,这样子元素浮动的高度就被计算进去,解决了浮动塌陷。

页面如图所示,

或者对父元素设置属性display: table,

.div-outer {
border: solid 2px #223344;
display: table;

设置display: table的意思是,使父元素形成了BFC(Block Form Content),
BFC有三个特性:

  1. 防止上下margin重叠
  2. 防止浮动元素重叠
  3. 防止浮动塌陷

overflow: hidden也形成了BFC,BFC会将子元素的浮动高度计算进去,解决浮动塌陷。

页面如图所示,

不同之处在于设置属性overflow: hidden,父元素宽度会是100%,而设置属性display: table,父元素的宽度会随子元素变化,。

3. 内墙法

在父元素后面使用伪元素:after,

.div-outer:after{
display: block;
content: "";
height: 0;
clear: both;
}

这种方法的作用和第一种方法是相同的,只不过没有在div3后面再添加一个空的div,因为添加div会影响性能。

display: block;
content: "";
height: 0;

这就类似添加了一个空的div,然后设置属性clear: both。

总之,清除浮动塌陷就是对父元素设置属性使其形成BFC(第二种方法),或者添加一个空的div(第一种方法和第三种方法)。

[CSS]CSS浮动塌陷及解决办法的更多相关文章

  1. CSS常见兼容问题以及解决办法

    浏览器的兼容性问题,通常是因为不同的浏览器对同一段代码有不同的解析,造成页面显示不统一的情况. 这里谈到的浏览器,主要指IE6/IE7/IE... FireFox Chrome Opera Safar ...

  2. css 浏览兼容问题及解决办法 (2)

    1.div的垂直居中问题 vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了.缺点是要控制内容不要换行 2. ...

  3. CSS高度坍塌原因及解决办法

    在文档流中,父元素的高度默认是被子元素撑开的,也就是子元素多高,父元素就多高. 但是当为子元素设置浮动以后,子元素会完全脱离文档流,此时将会导致子元素无法撑起父元素的高度,导致父元素的高度塌陷.由于父 ...

  4. css之高度塌陷及其解决方法

    浅谈 清除浮动 的多种方式(clearfix) 1.什么是浮动 ? 是否脱离文档流? 1.普通流定位 static(默认方式) 普通流定位,又称为文档流定位,是页面元素的默认定位方式 页面中的块级元素 ...

  5. float浮动造成高度塌陷的解决办法

    Float是我们在页面布局中常用的,也是非常重要的一个属性,可以让页面布局变得更加灵活. 但是在继续学习之后,尤其是掌握了宽高自适应之后,我们常常会发现一个奇怪的现象:如果父元素没有设置高度,而子元素 ...

  6. Chrome不支持css字体小于12px的解决办法

    我们先来看个效果图(chrome下): 从上面的图可以很明显地看出Chrome下css设置字体大小为12px及以下时,显示的都是一样大小,都是默认12px: 那么网上有一个方法就是给当前样式添加Chr ...

  7. css 浏览兼容问题及解决办法 (1)

    主流浏览器css兼容问题的总结 最近又搞了一波网站的兼容,由于要求ie浏览器还是要兼容到ie8,所以调起来还是各种蛋疼. 现在就post一些做兼容的总结,可能不够全面,但是可以告诉大家如何避过一些坑. ...

  8. Chrome谷歌浏览器下不支持css字体小于12px的解决办法

    先来看下 ie.火狐.谷歌浏览器下各个字体显示情况 ie下: 火狐下: 谷歌下: 从上面的图可以很明显看出谷歌下 css设置字体大小为12px及以下时,显示都是一样大小,都是默认12px; 那么网上一 ...

  9. SpringMVC配置了拦截器(interceptors)却显示不出css、js样式的解决办法

    首先因为在web.xml里面配置了 <filter-mapping> <filter-name>characterEncodingFilter</filter-name& ...

随机推荐

  1. axios 获取不到数据错误

    1.问题: 打算学习下vue,但是vue-resource作者已经不更新了,并且大家都建议用axios来进行前后端交互,所以就从学习axios开始. 但是在使用 axios 的过程中,自己写的接口竟然 ...

  2. linux上搭建nginx+ftp,实现文件的上传与访问

    ftp服务器搭建 1.新建用户ftpuser并指定主目录为/home/ftpuser (注意:这个目录是后面存储和读取文件的目录) <!--创建用户并指定主目录--> useradd -d ...

  3. vue中的provide/inject讲解

    最近在看element-ui的源码,发现了一个这样的属性:inject.遂查看官网provider/inject provider/inject:简单的来说就是在父组件中通过provider来提供变量 ...

  4. Linux基础:Linux环境下安装JDK

    title: Linux基础:JDK的及环境变量配置 author: Enjoyitlife.top date: 2019-10-09 20:50:36 tags: Linux JDK categor ...

  5. PHP 登陆失效之后,重新登陆,跳转到失效前界面

    登陆失效之后,需要重新进行登陆,登陆之后,进入到默认首页,如果需要继续之前的进行操作,必须重新点击菜单进行跳转,体验不太好 登陆的时候,将之前的url,拼接到登陆界面的url上作为一个redirect ...

  6. PHP foreach &$ 引发的bug

    在使用foreach &$来更新数据的时候,造成数据被更新掉了 $arr = array(1,2,3,4,5); foreach ($arr as &$row) { $row += 1 ...

  7. 如何在CentOS 7上安装Node.js和npm

    Node.js是一个跨平台的JavaScript运行时环境,允许在服务器端执行JavaScript代码.Node.js主要用于后端,但也作为全栈和前端解决方案而流行. npm,Node软件包管理器的缩 ...

  8. C# 中常见的控件以及功能

    1.StatusBar控件——显示各种状态信息. StatusBar控件可以有状态栏面板(用于显示图标以指示状态)或一系列动画图标(用于指示某个进程正在工作,例如,表示正在保存文档的 Microsof ...

  9. (转)Centos7下杀毒软件clamav的安装和使用

    本文转载自:https://www.cnblogs.com/bingo1024/p/9018212.html#_label1_0 目录 一.yum安装 二.编译安装 2.1:下载软件包 2.2:创建c ...

  10. Taro -- 微信小程序密码弹窗

    记录一个类似支付密码的弹窗写法,实现是否免密功能.如图: index.js   import Taro, { Component } from '@tarojs/taro'   import { Vi ...