什么是浮动?

CSS中的一些元素是块级元素,表示它们会自动另起一行。

举个例子,如果你创建了两个段落,每个段落都只有一个单词。这两个单词不会靠在一起,而是会各自占据一行。

另一些元素是行内元素,表示它们和前面的内容位于相同的一行。

举个例子,<a>可以出现在另一个元素中,比如<p>,这不会产生多余的空格或者出现换行。

欺骗这种布局模型的一种方式是使用浮动,浮动可以让一个元素移到它所在行的某一边,使得其他内容沿着该元素的边缘向下流。

一个典型的例子是你想要一张图片和一个段落并排出现,而不是一上一下排列。首先我们先来创建HTML:

<img src="http://lorempixum.com/200/200/" />
<p>Lorem ipsum...</p>

单独这段代码并不能实现我们想要的效果。<p>是一个块级元素,它会独占一行,所以图片和段落是一上一下展现的。 

通过让图片向右浮动可以改变这种行为,如下:

img {float: right;margin: 20px;
}

  

这样,图片就跑到右边去了,而段落则沿着图片的左边向下流式布局。

现在发生了一件有趣的事,当这张图片浮动后,其他的内容就会想办法尽可能的包围它。如果我们resize容器或者浏览器窗口,让它更窄,这段文本就会发生重排(reflow),这样它就永远不可能接触到图片。

盒模型如何工作

也许你已经对上面所讲的知识有了深刻的理解。但是,为了完全掌握浮动,你需要更加深刻的理解两个元素如何互相作用。举个例子,如果我们在段落和图片之间加一个边距会发生什么?

p {margin: 20px;}

但是呢,这么写并不会在图片和段落之间产生额外的空间。实际上,我们需要给图片加margin:

img {margin: 20px;}

也许你会问为什么呢?为什么增加<p>的margin不会增加图片和段落的间距呢?

原因是我们没有理解<p>的盒模型。

  
如果现在你对布局产生了一些疑虑,可以试着加一个或者两个border,看看会发生什么。下面给<p>加border:

p {border: solid 1px black;
}

如你所见,图片实际上位于<p>盒模型的内部!这就可以解释刚才的margin问题。我们加到<p>上的margin其实是作用于图片的右侧,这就是为什么它不能增加图片和段落之间的距离!

如果我们想改变这种行为,使得段落不会包围图片,我们应该让段落向左浮动,并设置一个宽度(如果不设置,<p>的宽度默认是100%,这样就不会和图片紧挨着了,因为如果段落很长,它会跑到下一行)。

img {float: right;margin: 20px;
}p {float: left;width: 220px;margin: 20px;
}

疯狂的浮动规则

现在你知道什么是浮动了,并且知道浮动如何影响相关元素的盒模型。接下来要说的也许很多人都不了解:如何调整浮动元素的位置

web开发中很多人会给<li>使用浮动。下面来看一个例子:

<ul><li><img src=""/>1</li><li><img src=""/>2</li><li><img src=""/>3</li><li><img src=""/>4</li><li><img src=""/>5</li><li><img src=""/>6</li><li><img src=""/>7</li>
</ul>

所有<li>默认应该是垂直方向上排列的,这就表示<li>是块级元素。即使图片是行内元素,它也会被它的父级块级元素管理。为了解决这个问题,我们让<li>向左浮动。当一行内的多个<li>被浮动后,它们会产生类似行内元素的流式布局。然而,正如你即将看到的,它们有一些关键的不同。

li {float: left;margin: 4px;
}

现在,如果所有图片的高度相同,就会产生下面的效果。

但是,我们的图片高度不是一样的,一些是100px,另一些是150px。这就引起了一些严重的问题!

当我第一次看到这个效果,我蛋疼了。为什么图片4跑到右边去了?它不是应该尽可能的向左浮动么?如果我们放弃浮动而使用display:inline,结果会大不一样。

li {display: inline;
}

这个例子中,图片默认是垂直居底(bottom)对齐。这和我们之前的例子不同,为了解决对齐问题,我们添加一行CSS。

img {  vertical-align: top;
}

由此可知,使用display:inline 可以更容易猜到<li>的排列结果。当水平方向没有多余的空间时,下个元素就会另起一行。

浮动为什么不能实现这种效果呢?

CSS规范对于浮动行为概括了9个规则。但问题是,只有规范的作者和那些无聊的人才能理解这些规则。下面摘录了其中一个规则:

“If the current box is left-floating, and there are any left-floating boxes generated by elements earlier in the source document, then for each such earlier box, either the left outer edge of the current box must be to the right of the right outer edge of the earlier box, or its top must be lower than the bottom of the earlier box. Analogous rules hold for right-floating boxes.”

对于这些规则,也许你比我理解的更深,但说实话,这些规则让我非常蛋疼。为了简化它,Josh Johnson给出了他的9条规则(注:我觉得这位仁兄的9条规则依然很啰嗦,我再给精简一下):

1. 浮动元素的活动区域

  仅限于它的父容器元素,不会超出父容器

2. 浮动元素的位置

  水平方向:尽可能居左或居右,如果它前面还有浮动元素,会跟在它后面,如果超出该行就会换行

  垂直方向:尽可能的居顶

关于水平方向的位置,需要注意以下几点:

1) 向左浮动的元素不会出现在向右浮动的元素的右侧

关于垂直方向的位置,需要注意以下几点:

1) 浮动元素不会比容器的顶部还高

2) 浮动元素不会比前一个块级元素或浮动元素更高

3) 浮动元素不会比前一个行内元素更高

在布局时,垂直方向的规则比水平方向的优先级更高

总的来说就是,浮动元素会移到左侧或右侧。除非该元素前面还有一个浮动元素,这时它就会紧挨着前面的元素。

真正让人迷惑的是:浮动元素会尽可能的居顶,并且垂直定位规则比水平浮动规则的优先级更高。

在前面的例子中,图片2撑高了该行的高度,所以在放完图片3后,仍然有足够的垂直空间放置图片4。

记住,当你有一个浮动元素(不位于尾行)时,它后面的浮动元素占用的垂直空间必须大于或等于它才会触发换行

浮动顺序

举个例子,我们有6张图片的一个列表。

<ul><li><img src="http://placehold.it/100x100&text=1"/></li><li><img src="http://placehold.it/100x100&text=2"/></li><li><img src="http://placehold.it/100x100&text=3"/></li><li><img src="http://placehold.it/100x100&text=4"/></li><li><img src="http://placehold.it/100x100&text=5"/></li><li><img src="http://placehold.it/100x100&text=6"/></li>
</ul>

如果我们向左浮动图片,它们就会按照原来的顺序排列。但如果向右浮动呢?

可以发现,第一张图片占据了最右的位置。类似的,换行后,第四张图也占据了最右的位置。这就是为什么你很少看到导航栏的列表项会向右浮动的原因。

清除浮动

使用浮动可以方便的实现一些布局,比如创建n栏内容。但是呢,一旦使用浮动就会影响文档正常的流式布局。比如,刚才那个例子中,我们想在列表下方加上一个段落。

这个结果也许不是你想要的。这里的解决方法是使用 clear 属性,它的作用是清除该元素某侧的浮动。比如,我们对第二个列表项使用clear:left

ul li:nth-child(2) {   clear: left;
}

这段代码告诉浏览器第二项的顶部必须比它前面的浮动元素的底部更低。如果所有列表项是向右浮动的,则需要使用clear: right

加上段落文本再看

很明显这依然不是我们想要的效果,解决方法是给段落使用clear,这会使得段落出现在浮动元素的下方而不是与它们相邻。

p {clear: both;
}

其实这里我们只需要清除左侧的浮动即可,但是当一个开发者为了确保清除了所有浮动,clear:both是很常用的一种方法。

浮动的问题和clearfix

当一个元素只包含浮动元素时,该容器元素会出现高度重叠(和高度为0的效果一样,即高度的顶边和底边重叠)。为了演示这个现象,我们还是使用刚才的例子,只是给列表加一个背景色。

ul {background: gray;}

  

如果列表项没有浮动,可以看到整个列表都是灰色的,而列表项则是从上到下排列。

现在我们浮动所有列表项,这时<ul>只包含浮动的元素,所以它的高度重叠了,新手肯定会好奇背景色到底哪去了.

解决这个问题有好几种方法,最简单的一种是直接给容器元素设置高度。

ul {height: 300px;
}

这样背景色又回来了。但是,这种方法常常不能让我们满意,因为当我们需要容器的高度和内容自适应时,这种方法完全无效。如果我们再加上三个列表项,这个高度又不够了。

召唤clearfix

现在该轮到clearfix登场了,它通过clear属性解决了高度重叠的问题。

我们常常会创建一个空元素(通常是div),它和浮动元素同级,然后给它设置class为“clearfix”。回到CSS,我们加上这样一行样式:

.clearfix {clear: both;
}

这样就解决了高度的问题。

说下原理:我们知道当元素只包含浮动元素时,高度发生重叠(效果和高度为0一样),这时该元素有了一个子元素,即使它是个空元素,但它没有浮动,而且还清除了所有浮动,所以这个空元素会出现在所有元素的下方,从而撑起了容器的高度,于是height:auto恢复正常了。

这种方法的缺点是,HTML中多了一个额外的元素,不符合语义化的思想。

新的解决方法是使用 overflow 属性,如果你设值为hidden 或 auto,也可以解决高度重叠的问题。

ul {overflow: auto;
}

这种方法更简单也更优雅,但是还有个问题要说下,如果容器元素必须设置为overflow: visible,你又该怎么办呢?

方法是首先使用 :before 和 :after 在元素内创建一些不浮动的东西,但实际上你并不希望出现任何多余的东西,所以我们设置一个空字符串,但是要设置display:table,这样就创建了一个匿名单元格(是不是想起了<td></td>?),最后使用老办法,清除浮动。

为了兼容老版本的IE,使用它特有的zoom:1清除浮动。

/* For modern browsers */
.cf:before,
.cf:after {content:"";display:table;
}.cf:after {clear:both;
}/* For IE 6/7 (trigger hasLayout) */
.cf {zoom:1;
}

转载于:https://www.cnblogs.com/sapho/p/5305113.html

关于css的float相关推荐

  1. CSS中Float概念相关文章

    float 是 css 的定位属性. 在传统的印刷布局中,文本可以按照需要围绕图片.一般把这种方式称为"文本环绕".在网页设计中,应用了CSS的float属性的页面元素就像在印刷布 ...

  2. CSS中float属性详解

    首先我们了解到,CSS网页布局的原理,就是按照HTML代码中对象声明的顺序,以流布局的方式来显示它,而流布局就不得不说到float浮动技术..在HTML中的所有对象,默认分为两种:块元素(block ...

  3. 用CSS的float属性创建三栏布局网页的方法

    三栏布局是最常见的网页布局,主要页内容放在中间一栏,边上的两栏放置导航链接之类的内容.基本布局一般是标题之下放置三栏,三栏占据整个页面的宽度,最后在页的底端放置页脚,页脚也占据整个页面宽度.本文介绍一 ...

  4. css浮动(float)及清除浮动的几种实用方法

    CSS浮动是现在网页布局中使用最频繁的效果之一,而浮动可以帮我们解决很多问题,那么就让我们一起来看一看如何使用浮动. 一.css浮动(float) (1)html文档流 自窗体自上而下分成一行一行,并 ...

  5. [css] 为什么float会导致父元素塌陷

    [css] 为什么float会导致父元素塌陷 "当元素设置浮动后,会自动脱离文档流", 翻译成白话就是说,元素浮动后,就不在整个文档流的管辖范围,那么它之前存在在父元素内的高度就随 ...

  6. 关于CSS浮动(float,clear)的通俗讲解(经验分享)

    很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...

  7. 用CSS的float和clear创建三栏液态布局的方法(转载)

    三栏布局是目前最常见的网页布局,主要页内容放在中间一栏,边上的两栏放置导航链接之类的内容.基本布局一般是标题之下放置三栏,三栏占据整个页面的宽度,最后在页的底端放置页脚,页脚也占据整个页面宽度.   ...

  8. css样式float造成的浮动“塌陷”问题的解决办法

    css样式float造成的浮动"塌陷"问题的解决办法 参考文章: (1)css样式float造成的浮动"塌陷"问题的解决办法 (2)https://www.cn ...

  9. css中float left与float right的使用说明

    css中float left与float right的使用说明 转自:http://www.jb51.net/css/33740.html   脚本之家 No! 要注意以下几点: 1. 浮动元素会被自 ...

  10. (图文详细)最通俗易懂的CSS 浮动float属性详解

    (图文详细)最通俗易懂的CSS 浮动float属性详解 声明:本文属于搬砖大神的文章到自己的博客上,原文地址为:https://www.cnblogs.com/iyangyuan/archive/20 ...

最新文章

  1. 修改IDEA运行jsp文件的时候浏览器地址栏的虚拟访问路径网址
  2. Office 如何下载网页的视频 JWPlayer的内嵌视频
  3. RTX软件用友OA冲突解决
  4. Android 拉伸四周空白,中间内容不变的9Patch
  5. iOS 实现加载转圈效果
  6. 【杂谈】有三AI知识星球指导手册出炉!和公众号相比又有哪些内容?
  7. Chrome——我的Chrome插件
  8. java + selenium 种WebElement 定位到父元素 跟子元素
  9. 利用obfuscar对.NET应用进行混淆
  10. java流上传文档把磁盘撑满_BOOT目录磁盘占用满处理
  11. 简历职称 计算机,简历中专业职称是什么
  12. iOS-屏幕适配-UI布局
  13. 查看linux操作系统版本信息
  14. VS2015下安装Visual_Assist_x破解版
  15. 我读过关于面试最好的一篇文章
  16. C语言实现模拟银行存取款管理系统课程设计(纯C语言版)
  17. 正面管教php_我就这样走进正面管教
  18. 沐风:微信小程序火了,小心掉入陷井!
  19. 渗透测试:XSS实验集合
  20. edge microsoff 连不上网_网站还原错误怎么办

热门文章

  1. 【转】Spring mvc 统一异常处理和静态文件的配置
  2. win10系统80端口被System (PID=4)占用的解决
  3. python编写登录接口与三级菜单小程序
  4. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
  5. Kafka监控工具KafkaOffsetMonitor配置及使用
  6. mysql 服务器监控系列-黄杉 mysqldba
  7. 运用js动态操作table(新增,删除相关列信息)
  8. 配置Groovy开发运行环境
  9. 【程序员跳槽】学弟被高薪挖走不到一年就后悔的无奈经历,到底是老板的水深?还是学弟太年轻?
  10. 算法------Pow(x, n)