css清除浮动

什么是CSS清除浮动?

在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(floatleftright)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出,为了防止这个现象的出现而进行的CSS处理,就叫CSS清除浮动。

引用W3C的例子,news容器没有包围浮动的元素

.news {

 background-color: gray;

 border: solid 1px black;

  }

.news img {

 float: left;

  }

 

.news p {

 float: right;

  }

 

<div class="news">

<img src="news-pic.jpg" />

<p>some text</p>

</div>

 

清除浮动方法

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

在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性即可清理浮动。亦可使用<brclass="clear" /><hr class="clear" />来进行清理。

.news {

 background-color: gray;

 border: solid 1px black;

  }

 

.news img {

 float: left;

  }

 

.news p {

 float: right;

  }

 

.clear {

 clear: both;

  }

 

<div class="news">

<img src="news-pic.jpg" />

<p>some text</p>

<divclass="clear"></div>

</div>

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

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

方法二:使用CSSoverflow属性

给浮动元素的容器添加overflow:hidden;overflow:auto;可以清除浮动,另外在 IE6 中还需要触发 hasLayout ,例如为父元素设置容器宽高或设置 zoom:1

在添加overflow属性后,浮动元素又回到了容器层,把容器高度撑起,达到了清理浮动的效果。

.news {

 background-color: gray;

 border: solid 1px black;

 overflow: hidden;
  *zoom: 1;

  }

 

.news img {

 float: left;

  }

 

.news p {

 float: right;

  }

<div class="news">

<img src="news-pic.jpg" />

<p>some text</p>

</div>

 

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

给浮动元素的容器也添加上浮动属性即可清除内部浮动,但是这样会使其整体浮动,影响布局,不推荐使用。

方法四:使用邻接元素处理

什么都不做,给浮动元素后面的元素添加clear属性。

.news {

 background-color: gray;

 border: solid 1px black;

  }

 

.news img {

 float: left;

  }

 

.news p {

 float: right;

  }

 

.content{

 clear:both;

  }

 

<div class="news">

<img src="news-pic.jpg" />

<p>some text</p>

<divclass="content"></div>

</div>

方法五:使用CSS:after伪元素

结合 :after 伪元素(注意这不是伪类,而是伪元素,代表一个元素之后最近的元素)和 IEhack ,可以完美兼容当前主流的各大浏览器,这里的 IEhack 指的是触发 hasLayout

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

.news {

 background-color: gray;

 border: solid 1px black;

  }

 

.news img {

 float: left;

  }

 

.news p {

 float: right;

  }

 

.clearfix:after{

 content: "020";

 display: block;

 height: 0;

 clear: both;

 visibility: hidden; 

  }

 

.clearfix {

  /* 触发 hasLayout*/

 zoom: 1;

  }

 

<div class="news clearfix">

<img src="news-pic.jpg" />

<p>some text</p>

</div>

通过CSS伪元素在容器的内部元素最后添加了一个看不见的空格"020"或点".",并且赋予clear属性来清除浮动。需要注意的是为了IE6IE7浏览器,要给clearfix这个class添加一条zoom:1;触发haslayout

 

总结

通过上面的例子,我们不难发现清除浮动的方法可以分成两类:

一是利用 clear 属性,包括在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素,其实利用 :after 伪元素的方法也是在元素末尾添加一个内容为一个点并带有 clear: both 属性的元素实现的。

二是触发浮动元素父元素的 BFC (Block Formatting Contexts, 块级格式化上下文),使到该父元素可以包含浮动元素,关于这一点。

 

推荐

在网页主要布局时使用:after伪元素方法并作为主要清理浮动方式;在小模块如ul里使用overflow:hidden;(留意可能产生的隐藏溢出元素问题);如果本身就是浮动元素则可自动清除内部浮动,无需格外处理;正文中使用邻接元素清理之前的浮动。

最后可以使用相对完美的:after伪元素方法清理浮动,文档结构更加清晰。

 

 

SS里常见的块级元素和行内元素

根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为块级元素(block-level);而span元素的默认display属性值为“inline”,称为行内元素。
div
这样的块级元素,就会自动占据一定矩形空间,可以通过设置高度、宽度、内外边距等属性,来调整的这个矩形的样子;与之相反,像“span”“a”这样的行内元素,则没有自己的独立空间,它是依附于其他块级元素存在的,因此,对行内元素设置高度、宽度、内外边距等属性,都是无效的。

内联元素(行内元素)内联元素(inline element)

* a - 锚点
* abbr -
缩写
* acronym -
首字
* b -
粗体(不推荐)
* bdo - bidi override
* big -
大字体
* br -
换行
* cite -
引用
* code -
计算机代码(在引用源码的时候需要)
* dfn -
定义字段
* em -
强调
* font -
字体设定(不推荐)
* i -
斜体
* img -
图片
* input -
输入框
* kbd -
定义键盘文本
* label -
表格标签
* q -
短引用
* s -
中划线(不推荐)
* samp -
定义范例计算机代码
* select -
项目选择
* small -
小字体文本
* span -
常用内联容器,定义文本内区块
* strike -
中划线
* strong -
粗体强调
* sub -
下标
* sup -
上标
* textarea -
多行文本输入框
* tt -
电传文本
* u -
下划线
* var -
定义变量

块元素(block element)
* address -
地址
* blockquote -
块引用
* center -
举中对齐块
* dir -
目录列表
* div -
常用块级容易,也是css layout的主要标签
* dl -
定义列表
* fieldset - form
控制组
* form -
交互表单
* h1 -
大标题
* h2 -
副标题
* h3 - 3
级标题
* h4 - 4
级标题
* h5 - 5
级标题
* h6 - 6
级标题
* hr -
水平分隔线
* isindex - input prompt
* menu -
菜单列表
* noframes - frames
可选内容,(对于不支持frame的浏览器显示此区块内容
* noscript -
)可选脚本内容(对于不支持script的浏览器显示此内容)
* ol -
排序表单
* p -
段落
* pre -
格式化文本
* table -
表格
* ul -
非排序列表

可变元素
可变元素为根据上下文语境决定该元素为块元素或者内联元素。

* applet - java applet
* button -
按钮
* del -
删除文本
* iframe - inline frame
* ins -
插入的文本
* map -
图片区块(map)
* object - object
对象
* script -
客户端脚本

层级关系为:
<div ——————————— position:relative;
不是最近的祖先定位元素,不是参照物
<div—————————-
没有设置为定位元素,不是参照物
<div———————- position:relative
参照物
<div box1
<div box2 ——–position:absolute; top:50px; left:120px;
<div box3
效果图:

为改变参照物(橘色框)后的效果
层级关系为:
<div ——————————— position:relative;
最近的祖先定位元素,参照物
<div—————————-
没有设置为定位元素,不是参照物
<div———————-
没有设置为定位元素,不是参照物
<div box1
<div box2 ——–position:absolute; top:50px; left:120px;
<div box3
效果图:

参照物为最顶级的元素情况
层级关系为:
<div ———————————
没有设置为定位元素,不是参照物
<div—————————-
没有设置为定位元素,不是参照物
<div———————-
没有设置为定位元素,不是参照物
<div box1
<div box2 ——–position:absolute; top:50px; left:120px;
<div box3
效果图:

 

仅使用margin属性布局绝对定位元素的情况
此情况,margin-bottom margin-right的值不再对文档流中的元素产生影响,因为该元素已经脱离了文档流。另外,不管它的祖先元素有没有定位,都是以文档流中原来所在的位置上偏移参照物。  
9中,使用margin属性布局相对定位元素。
层级关系为:
<div ——————————— position:relative;
不是参照物
<div—————————-
没有设置为定位元素,不是参照物
<div———————-
没有设置为定位元素,不是参照物
<div box1
<div box2 ——–position:absolute; margin-top:50px; margin-left:120px;
<div box3
效果图:

IE6的情况下,box2前面没有兄弟节点,则margin-left的值会出现双倍边距,见图10
层级关系为:
<div ——————————— position:relative;
不是参照物
<div—————————-
没有设置为定位元素,不是参照物
<div———————-
没有设置为定位元素,不是参照物
<div box1
<div box2 ——–position:absolute; margin-top:50px; margin-left:60px;
<div box3
效果图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值