浮动模型和清除浮动

什么是浮动模型

先用代码来展示一下float会出现什么样的效果

<div class="box">
    <div class="demo">1</div>
    <div class="demo">2</div>
    <div class="demo">3</div>
</div>
.box{
    border: 1px solid #ccc;
    width: 400px;
    height: 100px;
}
.demo{
    width: 98px;
    height: 98px;
    background-color: black;
    color: #fff;
    border: 1px solid #fff;
}

正常情况下,这三个div的布局应该是这样的:

正常的块布局.png

当给box下面的demo加上float:left; 之后的布局:
float之后的布局.png

可以看到这里的效果就是float的效果了。

浮动属性

float可以去两个属性值:right , left

  • 这里的float属性的作用,就是让操作的这一系列或者一个元素站队,比如上面的,当我们设置了float:left; 之后,设置了float属性的元素就会按照先后属性,自左向右的站队,当然==当一行站不下去的时候会换行==,同理当我们使用float:right; 的时候,元素会按照先后顺序自右向左的排序。这的先后顺序指的是html结构当中的先后顺序。
  • 在浮动的过程当中,可以通过添加margin来调节距离。
  • 父级的边界能够多站一个就多站一个,但是站不下的就换行
语法
  • 浮动元素产生了浮动流,浮动流对不同的元素的影响是不同的
  • 所有产生了浮动流的元素,==块级元素看不到它==
  • 产生了bfc的元素和文本类属性inline-block的元素以及文本元素能够看到它

这两种效果展示一下

<div class="box"></div>
<div class="demo"></div>
.box{
    float: left;
    background-color: red;
    width: 100px;
    height: 100px;
}
.demo{
    opacity: 1;
    width: 100px;
    height: 200px;
    background-color: black;
}

浮动元素遇见了块级元素.png

很显然,黑色的长方形,好像和红色的不在同一个层面上,想前面移动占位了,所以块级元素看不到浮动元素
当我们给黑色的方块加上display:inline-block 的时候
inline-block的元素对应的浮动.png

我们会发现,这里的黑色方块能够看到红色方块
当我们使用文字的时候 在浮动元素的后面加上文字
文字对应的浮动元素.png

同样也能看到
当我们在块级元素当中加上文字呢?
浮动元素遇见了块级元素.png

这里还是不行的!!!

浮动流的影响

浮动流有时候会带来一些很不理想的结果,例如下面的,当子元素都设置浮动之后,本来是有子元素撑开的父级元素受到浮动流的影响,撑不开了!

<div class="box">
    <div class="demo">1</div>
    <div class="demo">2</div>
    <div class="demo">3</div>
</div>
.box{
    border: 5px solid red;
    width: 500px;
}
.demo{
    /*float: left;*/
    background-color: green;    
    width: 98px;
    height: 98px;
    border: 1px solid #fff;
}

当我们注释掉float:left的时候:

正常的.png

但是当我们去掉注释的时候:
受到浮动流影响之后.png

可以看到父级元素看不到子元素了,成了一个没有内容的盒子

清除浮动流

  1. 在盒子的末尾加上一个<p></p> 清楚浮动流,使用一个专门用来清楚浮动流的属性clear:both 该属性还有left right 的属性值,但是一般不用
<div class="box">
    <div class="demo">1</div>
    <div class="demo">2</div>
    <div class="demo">3</div>
    <p></p>
</div>
p {
    margin: 0;
    /*去除p标签默认的margin*/
    width: 500px;
    height: 5px;
    /*这里的p可以height为0的,只有逻辑上它在这里就行了!*/
    background-color: orange;
    clear: both;
}
image.png

这种额外添加结构的方法是很不理想的,所以这种方法知识理论上面可行的,或者在某种情况下刚好就有一个p标签在它的最后面

  1. 使用伪元素来实现清除浮动
  • 伪元素,确实存在的结构,但是没有结构的元素,权重值是1和tag一样。

伪元素是在元素当中,天生就存在的元素,我们可以通过css选择器选中他们,然后对他们进行一些操作,比较常见的有::after ::before 这两个表示在元素逻辑的最后面和最前面!!!

<span>sheep</span>
span {
    color: green;
}
span::before{
    content: "so cool sheep";
    color: red;
}
span::after {
    content: "cool sheep";
    color: blue;
}
image.png

可以看到这里的span元素的前面和后面都加上了内容!!!这就是伪元素的效果,当然我们可以通过一些css样式来让伪元素有跟更加好的效果!

这里的::after 刚好可以避免p标签添加无用html结构的缺点了!!! ==这是我们最常用的方法==

.box::after {
    content: "";  // 伪元素独有的属性,这里将伪元素的内容设置为空
    display: block;  // 伪元素天生就是行级元素,在清楚浮动的时候要改变该属性
    clear: both;
}
但是我们的ie6 ie7当中没有伪元素这样的概念怎么办呢?

可以适用触发bfc的方式来清除浮动流,但是这里先介绍一下ie6和ie7当中特有的一个东西--hasLayout,触发hasLayout和触发bfc的效果是很相似的,同样能触发它的方式有很多,这里介绍一种对页面影响较小的一个zoom 属性, ie6 和 ie7当中就可以适用该属性来清除浮动了。

.wrapper {
      zoom:1; //视口同比例放大还是缩小,1就是不变
}

但是其他的浏览器并不需要zoom这个属性,这个属性只是为了ie6和ie7准备的,所以这个时候我们需要一点点css hack,我们在zoom前面加一个号, zoom: 1; 这个符号只有ie6和ie7能够识别,其他的浏览器都不识别,这样就可以让只有ie6和ie7去读这一行属性,其他浏览器直接忽略。顺便一提属性前面加上’_**‘之后,就只有ie6可以识别了。_zoom: 1;

  1. 下面来介绍适用bfc来清楚浮动流
  • overflow:hidden
  • display: inline-blocl
  • position: absolute

其实当我们给父级元素.box 设置了float属性之后,同样可以清楚浮动流,这是为什么呢?

==原因是设置了position: absolute; float: left / right 的元素,它们会自动变成inline-block 元素。

<span>我本来是一个行级元素,不能设置宽高</span>
span{
    position: absolute;
    width: 100px;
    height: 100px;
    background-color: green;
}
image.png

这里的span能够设置宽高了!

浮动的应用场景

  • 报纸类的布局,图片环绕文字的处理(默认情况下,图片和文字是底部对齐)
img {
    float: left;
}
  • 很多导航栏的样式都是适用ul>li + 浮动实现的 比如淘宝头顶的一个
<ul class = 'nav'>
    <li class = "list-item">
        <a href = "#">天猫</a>
    </li>
    <li class = "list-item">
        <a href = "#">聚划算</a>
    </li>
    <li class = "list-item">
        <a href = "#">天猫超市</a>
    </li>
</ul>
* {
    margin: 0;
    padding: 0;
    list-style: none;
    text-decoration: none;
    font-family: arial;
}
/*这样的结构我们清除一下浮动流比较好*/
.nav::after{
    content: "";
    display: block;
    clear: both;
}
.nav .list-item{
    float: left;
    margin: 0 10px;
    height: 30px;
    line-height: 30px;
}
.nav .list-item a {
    color: #f40;
    height: 30px;
    line-height: 30px;
    font-weight: bold;
    padding: 10px;
    border-radius: 15px; // 圆角属性
}
.nav .list-item a:hover {
    color: #fff;
    background-color: #f40;
}
image.png
  • 使用浮动来实现三栏布局, 两栏布局的原理相同
<div class="left"></div>
<div class="right"></div>
<div class="mid"></div>
<!-- 这里的mid必须在最下面,因为mid是块级元素,独占一行,如果不在最下面的话会把其他的元素挤下去 -->
*{
    margin: 0;
    padding: 0;
}
.left{
    float: left;
    width: 100px;
    height: 100px;
    background-color: red;
}
.right{
    float: right;
    width: 100px;
    height: 100px;
    background-color: blue;
}
.mid{
    /*空出10px让我们更容易的观察到它*/
    margin-left: 110px;
    margin-right: 110px;
    height: 100px;
    background-color: green;
}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,734评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,428评论 5 15
  • CSS布局解决方案(终结版) 前端布局非常重要的一环就是页面框架的搭建,也是最基础的一环。在页面框架的搭建之中,又...
    杀个程序猿祭天阅读 586评论 0 2
  • 测试IE6及IE6+推荐:良心总结 IE8中input[button|submit]不能用margin:0 aut...
    Miss____Du阅读 944评论 0 9
  • 今天要谈的这个,我觉没有新意,没有任何产品案例,但每个人都应该反思自己。 无论是在生活还是在工作上,我们都会去怀念...
    1ku阅读 426评论 0 1