CSS学习笔记:浮动属性
一、浮动流是什么
在css中,最常见的两种流就是标准流和浮动了,其中标准流可以简单如下理解:
- 块级元素独占一行,且它们都可以设置对应的宽高(width和height),例如div,h标签等
- 行内元素可以在一行中排列多个,它们的大小(宽度和高度)由里面的内容所决定,常见的标签有span,a标签等
而浮动定位则是将元素排除在标准流之外,它的一些概念和特点如下:
- 将元素排除在普通流之外
- 元素将不在页面中占据空间
- 将浮动元素放置在包含框的左边或者右边
- 浮动元素依旧位于包含框之内
- 浮动的框可以向左或者向右移动,直到他的外边缘碰到包含框或另一个浮动框的边框为止
- 浮动元素的外边缘不会超过其父元素的内边缘
- 浮动元素不会互相重叠
- 浮动元素不会上下浮动【只能设置左右浮动】
- 任何元素一旦浮动,display 属性将完全失效均可以设置宽高,并且不会独占一行
浮动语法:
#elem {
float: none/left/right;
}
二、通过代码实例了解浮动特点
1. 搭建测试框架
首先新建一个html文件,body内容如下:
<div id="box">
<div></div>
<div></div>
<div></div>
</div>
对应的css:
#box {
width: 600px;
height: 600px;
background: deeppink;
}
#box>div:first-child {
width: 200px;
height: 200px;
background: green;
}
#box>div:nth-child(2) {
width: 200px;
height: 200px;
background: aqua;
}
#box>div:nth-child(3) {
width: 200px;
height: 200px;
background: red;
}
此时的运行效果:

2. 添加浮动
此时如果给第一个元素添加浮动效果:
#box>div:first-child {
...
float: left;
}

可以看到第二个和第三个元素都向上移动了,且第二个元素被第一个元素遮住了,然后将浮动改为右浮动:

此时可以发现浮动的元素移动到了父元素的右边界处。第2和第3个元素虽然都是独占一行的,但这并不会影响到浮动元素的排布。这里可以理解为标准流中的元素都排列在地面上,而浮动的元素则是排列在空中的一层,因此地面元素占用的位置不会影响空中元素的排列,此外浮动的元素会遮挡标准流中的元素,例如上面的蓝色元素就被绿色元素遮挡住了。
3. 浮动元素的排布
我们先调节第三个div(红色div)的大小:
#box>div:nth-child(3) {
width: 300px;
height: 300px;
...
}
然后为第二个元素也添加float: right的浮动属性,此时的效果为:

可以看到红色的元素被遮挡住了,此时我们再为红色元素也添加float: right的浮动属性:

可以看到红色元素移动到了右下角,这是因为蓝色元素左边的位置已经不足以放下红色元素了(剩余位置的宽度<红色元素的宽度),因此红色元素只能向下寻找第一个可以放下的位置放置。
但如果红色元素的宽高为200和400,即:
#box>div:nth-child(3) {
width: 200px;
height: 400px;
...
}
则它还是会被排布在蓝色元素的左边:

因此浮动元素是以宽度来判断是否可以排布在当前位置的。
4. 给行内元素添加浮动效果
这里先编写两个span元素:
<span class="floatSpan">我是span标签</span>
<span class="floatSpan">我是span标签</span>
对应的css:
.floatSpan {
background: red;
width: 100px;
height: 100px;
}
当前效果:

可以看到,当前设置的宽度和高度对它是无效的,因为行内元素的宽高只由它的内容大小决定。
然后为它添加float: left的浮动效果:
.floatSpan {
...
float: left;
}
效果如下:

可以看到,当添加了浮动效果后,行内元素也可以设置宽高了,而且不会独占一行(和行内块元素一样),这验证了【任何元素一旦浮动,display 属性将完全失效均可以设置宽高,并且不会独占一行】这个浮动属性的特点。
5. 子元素浮动后对父元素的影响
还是原来的#box元素以及它的3个子元素,但此时我们去掉父元素的宽高设定(子元素先不浮动):
#box {
/* width: 600px;
height: 600px; */
background: deeppink;
}
此时的效果为:

可以看到,虽然我们没有为父元素设置宽高,但默认情况下(标准流)父元素的高度会等于子元素的高度之和(也可以理解为子元素将父元素撑开)。
而如果此时我们为第一个元素添加右浮动,效果为:

这是因为绿色元素脱离了标准流,因此父元素就只能由剩下在标准流的子元素撑开了。依此类推,若三个元素均添加浮动,则不再有标准流中的元素将父元素撑开了,因此父元素的高度就会变为0,如下所示:

这也是我们使用浮动布局横向排列子元素经常会遇到的问题,有以下几个办法可以解决:
5.1 在父元素中添加overflow: hidden属性
即:
#box {
/* width: 600px;
height: 600px; */
background: deeppink;
/* 在不设置宽高的情况下,让父元素感知子元素的高度 */
overflow: hidden;
}
效果如下:

可以看到,父元素拥有了子元素的最大高度。
5.2 为父元素也添加浮动属性
例如添加float: right的浮动属性:
#box {
/* width: 600px;
height: 600px; */
background: deeppink;
float: right;
}

可以看到父元素也得到了子元素的最大高度。
6. 消除浮动
例如上面的#box可以看做是网页中的一个专栏部分,当前希望在它的下面编写一个新的专栏#new,但#new属于标准流,而#box添加了float: right的浮动属性,如果直接编写则#new会被#box覆盖,如下所示:
<div id="box">
...
</div>
<div id="new">
我是new专栏
</div>
#new {
height: 300px;
background: pink;
}

此时我们就需要消除上面div的浮动带来的影响了,消除浮动有以下三种常用的方法。
6.1 在结尾处加上空的div标签,添加clear: both属性
<div id="box">
...
</div>
<div style="clear: both;"></div> <!--空的div标签-->
<div id="new">
我是new专栏
</div>
效果如下:

同理,也可以在new中添加clear: both属性:
#new {
...
clear: both;
}
效果也是相同的。
6.2 浮动元素父级div添加overflow: hidden属性
上面5.1中也已经使用过了这个属性,即可以使标准流中的div获取浮动的子元素的高度,此时我们可以给#box元素套一个#fatherdiv,如下所示:
<div id="father">
<div id="box">...</div>
</div>
然后给father添加overflow: hidden属性:
#father {
overflow: hidden;
}
效果如下:

可以发现这两种方式的效果是一模一样的。
6.3 给父元素指定宽高
这个方法应该是最笨的方法了,相当于给上面的father标签指定它孩子的宽高,不过这个方法可以使用js进行实现。
CSS学习笔记:浮动属性的更多相关文章
- CSS学习笔记-背景属性
一.背景尺寸属性: 1.含义: 背景尺寸属性是CSS3中新增的一个属性,专门用于设置背景图片大小 2.格式: 1.1具体像素: backgro ...
- CSS学习笔记08 浮动
从CSS学习笔记05 display属性一文中,我们知道div是块元素,会独占一行,即使div的宽度很小,像下面这样 应用display属性的inline属性可以让div与div共享一行,除了这种方法 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- CSS学习笔记10 相对定位,绝对定位与固定定位
文档流中的元素的位置由元素在 (X)HTML 中的位置决定,这就是最原始的普通流,前面讲到的浮动CSS学习笔记08 浮动可以改变元素在文档流中的位置,除了这个我们还可以通过使用CSS的position ...
- CSS学习笔记09 简单理解BFC
引子 在讲BFC之前,先来看看一个例子 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 2022-07-10 第五小组 pan小堂 css学习笔记
css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...
- HTML+CSS学习笔记 (6) - 开始学习CSS
HTML+CSS学习笔记 (6) - 开始学习CSS 认识CSS样式 CSS全称为"层叠样式表 (Cascading Style Sheets)",它主要是用于定义HTML内容在浏 ...
- HTML+CSS学习笔记(5)- 与浏览者交互,表单标签
HTML+CSS学习笔记(5)- 与浏览者交互,表单标签 1.使用表单标签,与用户交互 网站怎样与用户进行交互?答案是使用HTML表单(form).表单是可以把浏览者输入的数据传送到服务器端,这样服务 ...
- HTML+CSS学习笔记(4) - 认识标签(3)
HTML+CSS学习笔记(4) - 认识标签(3) 1.使用<a>标签,链接到另一个页面 使用<a>标签可实现超链接,它在网页制作中可以说是无处不在,只要有链接的地方,就会有这 ...
- HTML+CSS学习笔记(3)- 认识标签(2)
HTML+CSS学习笔记(3)- 认识标签(2) 1.使用ul,添加新闻信息列表 在浏览网页时,你会发现网页上有很多信息的列表,如新闻列表.图片列表, 这些列表就可以使用ul-li标签来完成.ul-l ...
随机推荐
- 支付宝openssl_sign(): supplied key param cannot be coerced into a private key in
先说一下,生成rsa 私钥 公钥的方法,以ubuntu 为例sudo apt-get install openssl # 先装上这个库genrsa -out rsa_private_key.pem 1 ...
- Jmeter系列(28)- 性能指标(1) | 常见性能指标
TPS 概念 TPS (transaction per second):意思是每秒事务数,具体事务的定义,都是人为的,可以一个接口.多个接口.一个业务流程等等.一个事务是指事务内第一个请求发送到接收到 ...
- (数据科学学习手札128)在matplotlib中添加富文本的最佳方式
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 长久以来,在使用matplotlib进行绘 ...
- FormData上传文件 带进度条
* jQuery ajax FormData 上传文件 template $.ajax({ url: url, type: 'POST', data: new FormData(form), dat ...
- openEuler 20.03/21.03 - 华为欧拉开源版(CentOS 8 华为版开源版)下载
开始 openEuler 之旅吧 openEuler 通过社区合作,打造创新平台,构建支持多处理架构.统一和开放的操作系统,推动软硬件应用生态繁荣发展. 好玩的活动停不下来 openEuler 社区不 ...
- Vue插槽slot理解与初体验 ~
一.插槽的理解 1.官网介绍 Vue 实现了一套内容分发的 API,将 <slot> 元素作为承载分发内容的出口. 2.为什么使用插槽 Vue 中有一个重要的概念-组件,可以在开发中将子组 ...
- 使用 WPF + Chrome 内核实现 在线客服系统 的复合客服端程序
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 免费使用 & 私有化部署免费下载:https://docs.sh ...
- Edit Step Ladders - UVA 10029
题意 题目链接(Virtual Judge):Edit Step Ladders - UVA 10029 题意: 如果单词 \(x\) 能通过添加.删除或修改一个字母变换为单词 \(y\),则称单词 ...
- sql提示1055 不让你group by
是不是突然写好的sql语句 部署上去就 Expression #2 of SELECT list is not in GROUP BY clause and containsnonaggregated ...
- 北鲲云超算如何让仿真技术、HPC和人工智能之间的深度融合?
在CAE领域,随着仿真技术在多个行业的深度应用,也带来了仿真模型日益复杂.仿真过程数据倍增.仿真计算费用昂贵等问题,降阶模型.人工智能.云计算等多种技术和仿真技术的深度融合,成为了仿真技术的重要发展趋 ...