【CSS学习】--- float浮动属性

时间:2021-10-09 08:13:59

一、前言

  浮动元素以脱离标准流的方式来实现元素的向左或向右浮动,并且浮动元素还是在原来的行上进行浮动的。float浮动属性的四个参数:left:元素向左浮动;right:元素向右浮动;none:默认值,元素不浮动;inherit:继承父元素的float属性值。

举两个栗子

父元素是否注意到自己有个浮动的子div呢?

<div style="width: 400px; height: auto; border: 2px solid black;">
<div style="width: 50px; height: 100px; background-color: green; float: right;"></div>
我才不知道有没有浮动框,我只显示文字的高度
</div> 【CSS学习】--- float浮动属性

从中我们可以发现,处于标准流中的父div并不知道浮动元素的存在,而浮动元素却知道它父元素的边界,它一直向右浮动直到撞到了父框的右边界为止。

<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: right;">
框二
</div>
</div> 【CSS学习】--- float浮动属性

我们发现框二并没有跑到框一这一行的右侧去,而浮动到了原来这行的的右侧。

下面我们一起逐步学习CSS中的浮动属性float。

二、浮动之于文本

CSS参考手册上对float的说明:

  float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。

  如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。

1.实现文本环绕图像

  浮动框虽然脱离了标准流,但标准流中的文本依旧会做相应的移动,为浮动框留出空间。浮动框旁边的行框被缩短,从而给浮动框留出空间,行框围绕浮动框。

  因此,创建浮动框可以使文本围绕图像:

【CSS学习】--- float浮动属性

举两个小栗子

<div style="width: 350px; background-color: #33FFFF;">
<img src="http://h5ip.cn/ge0w" style="width: 100px; height: 100px; float: right;">
<span>
路飞性格积极乐观,爱憎分明,而且十分重视伙伴,不甘屈居于他人之下,对任何危险的事物都超感兴趣。和其他传统的海贼所不同的是,他并不会为了追求财富而杀戮,而是享受着身为海贼的冒险和*
</span>
</div> 【CSS学习】--- float浮动属性
<span>虽然我先写于浮动元素,但还是被挤到了右边。。。</span>
<div style="width: 100px; height: 100px; background: blue; float: left;"></div> 【CSS学习】--- float浮动属性

2.任何元素浮动后都将生成块级框

  首先应当注意块级框不等同于块状元素,块级元素会独占一行而块级框却不会,浮动元素产生的效果类似于行内块元素。对行内非替换元素设置width和height是无效的,但生成浮动元素之后width和height将有效,并且不会单独占一行,所以说它类似于行内块元素。

<span style="width: 100px; height: 50px; background-color: #6699FF;">
不浮动的span
</span>
<span style="width: 100px; height: 50px; background-color: #33FFFF; float: left;">
浮动的span
</span> 【CSS学习】--- float浮动属性

三、浮动之于块

  浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

不浮动的div为块级元素,各自独占一行

<!-- 不浮动 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div> 【CSS学习】--- float浮动属性
<!-- 框一右浮 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: right;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div> 【CSS学习】--- float浮动属性

当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。

<!-- 框一左浮,覆盖框二 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div> 【CSS学习】--- float浮动属性

如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框,这时父框的高度为0

<!-- 三框左浮 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div> 【CSS学习】--- float浮动属性 

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

<!-- 三框左浮,父框太窄 -->
<div style="width: 200px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div> 【CSS学习】--- float浮动属性

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

<!-- 三框左浮,框一卡框三 -->
<div style="width: 200px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 100px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div> 【CSS学习】--- float浮动属性

四、浮动的副作用及处理

  通过上面的介绍可以总结出浮动的两个副作用:1.页面塌陷,也就是子元素不能将父元素撑开;2.元素覆盖,浮动元素不在标准流中因此可能会覆盖标准流中的元素。四种解决方案如下:

1.手动给父元素添加高度

  这种方法用来解决父元素的页面塌陷问题,应当注意的是,为保证父框的高度等于最高浮动元素的高度应当充分考虑浮动元素的边框以及内外边距。

<!-- 对于有边框的浮动子元素,父元素的height = 子元素的height + 2*子元素的边框大小 -->
<div style="width: 300px; height: 52px; border: solid 1px black;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
</div> 【CSS学习】--- float浮动属性 

这种方式治标不治本,当浮动子元素增加时,页面塌陷问题重现

【CSS学习】--- float浮动属性

2.通过clear属性清除内部和外部浮动

  clear 属性规定元素的哪一侧不允许其他浮动元素。clear属性的四个参数:none(默认值)、left、right、both;如果声明为左边或右边清除,会使元素的上外边框边界刚好在该边上浮动元素的下外边距边界之下。

  none:允许两边都可以有浮动对象;left:不允许左边有浮动对象;right:不允许右边有浮动对象;both:不允许有浮动对象。

添加clear属性之前
【CSS学习】--- float浮动属性
<!-- 如果后一个div未添加clear属性,它将被红色div覆盖 -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; border: solid 1px #FFF; clear: left; "></div>
</div> 添加之后
【CSS学习】--- float浮动属性
添加clear前
【CSS学习】--- float浮动属性
<!-- 在最后增加一个具有clear属性的空div -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style=" clear: both;"></div>
</div> 添加之后
 【CSS学习】--- float浮动属性

3.给父元素添加overflow属性并结合zoom:1使用

<!-- 使用overfloat和zoom代替clear -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both; overflow: hidden; zoom: 1;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
</div> 【CSS学习】--- float浮动属性

overflow属性是用来修剪溢出的元素,所以使用此种方案会使溢出元素被截掉

使用overflow前
【CSS学习】--- float浮动属性
<div style="width: 300px; height: auto; border: solid 1px black; clear: both; padding: 5px; overflow: hidden;">
<div style="width: 500px; height: 50px; background-color: red; border: solid 1px #FFF; float: left;"></div>
</div>
使用后
【CSS学习】--- float浮动属性

zoom是IE浏览器专用的属性,通过子元素的高度来设置父元素的高度,添加该属性用来兼容IE浏览器

4.给父元素添加浮动

  这是一种”以毒攻毒“的方法,因为父元素浮动后虽然消除了浮动子元素对其的影响,但父元素下面的元素就可能就会受该浮动父元素的影响。

<div style="width: 300px; height: auto; border: solid 1px black; clear: both; float: left;">
  <div style="width: 100px; height: 50px; background-color: red; float: left;"></div>
</div>
<div style="width: 200px; height: 100px; background-color: blue;"></div> 【CSS学习】--- float浮动属性

这四种常用的清除浮动解决办法可以根据实际情况进行使用,当然还有一些也比较好的解决办法,例如使用before伪类清除浮动,等进一步学习之后再补充。

五、最后

  感谢博主谦行的博客:CSS布局 ——从display,position, float属性谈起以及W3School提供的学习资料!所学不深,如有错误或不足之处还望留言指出,十分感谢!

【CSS学习】--- float浮动属性的更多相关文章

  1. &lbrack;转&rsqb; CSS float 浮动属性

    http://www.cnblogs.com/polk6/p/3142187.html CSS float 浮动属性 本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式: ...

  2. 给li设置float浮动属性之后,无法撑开外层ul的问题。

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  3. 给li设置float浮动属性之后,无法撑开外层ul的问题。(原址:http&colon;&sol;&sol;www&period;cnblogs&period;com&sol;cielzhao&sol;p&sol;5781462&period;html)

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  4. CSS清除float浮动

    一.浮动产生原因   -   TOP 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 本来两个黑色对象盒子是在 ...

  5. &lbrack;Web前端&rsqb; 给li设置float浮动属性之后,无法撑开外层ul的问题。

    cp from : https://www.cnblogs.com/cielzhao/p/5781462.html 最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style ...

  6. CSS float 浮动属性

    本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...

  7. CSS基础之浮动属性float图文详解

      宏观地讲,我们的web页面的制作,是个“流”,必须从上而下,像“织毛衣”.   标准流里面的限制非常多,导致很多页面效果无法实现.如果我们现在就要并排.并且就要设置宽高,那该怎么办呢?办法是:超脱 ...

  8. css之float&lpar;浮动&rpar;的特性

    详解CSS float属性  float本身不脱离文档流,但是和 position:absolute;搭配使用会脱离文档流 阅读目录 基础知识 float的详细细节 float特殊情况 clear属性 ...

  9. CSS学习之浮动

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...

随机推荐

  1. SGU 410 Galaxy in danger --贪心,想法题

    题意:有n个星球,每个星球有Ai个人,每次有两种选择,第一是从每个星球上去掉1个人,第二个选择是选择一个星球放置一个科学家,将该星球的人数加倍,问最少多少次能够将所有星球上的人数同时变为0,并且如果步 ...

  2. 【Java TCP&sol;IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子——反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  3. &lbrack;Ext JS 4&rsqb;性能优化

    一般的优化技巧 1. 检查你定义的时间监听器 正确的设置事件监听器对性能会有很大的影响. 举例来说, 在定义一个store的时候,设置一个load 的事件去触发从后台读取数据,如果设置single 的 ...

  4. ASP&period;NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  5. if else 与switch case判断

    基础数据类型(四类八种 ) 不能为null. 整数型 byte 取值范围2的8次方 short 取值范围2的16次方 int 取值范围2的32次方 一般用int long 取值范围2的64次方 浮点型 ...

  6. C&num; 程序之间传参数,Args 接收参数的处理

    备忘,或者留给暂未接触但需要了解的人. C#在一个进程内传参数方法那是相当多,但是涉及到程序之间传参数就不是那么方便了(当然socket,内存共享等方式属于另一类,此处不讨论),我们的C或者C#,亦或 ...

  7. MAVEN简介之——settings&period;xml

    概述 Maven的settings.xml配置了Maven执行的方式,像pom.xml一样,但是它是一个通用的配置, 不能绑定到任何特殊的项目.它通常包括本地仓库地址,远程仓库服务,认证信息等. se ...

  8. 用input标签 文件,多文件上传

    单个文件,多个文件区别不大,只是需要把多个文件装在一个容器里面,循环遍历即可: 需要注意的 input 标签中name属性,一定要指定: 在这是  fileBase  需要确定method必须是pos ...

  9. Android ComponentName的用法

    ComponentName(组件名称)是用来打开其他应用程序中的Activity或服务的. 用法: Intent it=new Intent(); it.setComponent(new Compon ...

  10. Oracle创建WM&lowbar;CONCAT函数

    Oracle创建WM_CONCAT函数 WM_CONCAT这个函数会出错,所以从 11g开始.官方不认可 WM_CONCAT.然后就没这个函数了, 下面就是创建WM_CONCAT这个函数的步骤 第一步 ...