css 快速入门 系列 —— 浮动
浮动
以 mdn float 文档 为基础,逐一介绍浮动的本质、浮动的诸多特性、清除浮动以及块格式化上下文(bfc)。
概念
当一个元素浮动之后,它会被移出正常的文档流,然后向左或者向右平移,一直平移直到碰到了所处的容器的边框,或者碰到另外一个浮动的元素。
卡住
如果包含块太窄,无法容纳容纳水平排列的多个浮动元素,那么其他浮动元素会向下移。如果浮动元素高度不同,就会出现”卡住“的情况:
浮动与行框盒子
如果文字很长,需要两行显示,而且在长文字后面跟着一个向右浮动的元素,请问该浮动元素会显示在第一行还是第二行?
请看示例:
more
浮动元素会显示在第二行。因为浮动元素会根据行框盒子进行定位,这里有两行,也就是两个行框盒子,而 ”more“ 在第二行的行框盒子后面。
float 的本质
创建 float 或许是为了实现文字环绕图片的效果。就像这样:
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Porro vero aliquid nisi nobis omnis iste,
其中图片是左浮动 float:left;
float 从文档流中脱离
浮动元素虽然从文档流中脱离,但有时还是会影响不浮动的元素。
position:absolute 也会从文档流中脱离,但不会影响不浮动的元素。我们将 文字环绕图片 的例子用绝对定位重写一下:
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Porro vero aliquid nisi nobis omnis iste,
块布局
由于 float 意味着使用块布局,所以该浮动元素的 display 的计算值会发生变化。通常会变成 block。请看示例:
<span id="id1" style="float:left"></span>
let elem = document.getElementById('id1')
let display = window.getComputedStyle(elem).getPropertyValue('display')
// display: block
console.log('display: ', display);
所以不要再写如下代码:
span {
float: left;
display: block; /* 多余 */
}
Tip: float 元素的 display 变化值,对应关系表请看 mdn。
浮动使高度塌陷
如果一个元素里只有浮动元素,那它的高度会是 0。就像这样:
// 核心代码:
<div style="border:1px solid red;">
<img style="float:left">
</div>
浮动使父元素高度塌陷,是因为浮动元素不在文档流中。
clear
可以使用 clear 属性来处理浮动使父元素高度塌陷的问题。
clear: none | left | right | both
字面翻译为”清除左浮动“,或”清除右浮动“,其实这样理解有误。请看示例:
Lorem ipsum, dolor
// 核心代码:
<div style="border:1px solid red;">
<img style="float:left">
Lorem ipsum, dolor
<div style="border:1px solid blue;clear:both;"></div>
</div
虽然我们使用了 clear:both,却只解决了父元素高度塌陷问题,而浮动还是存在,因为文字仍旧环绕着图片,故浮动没有消除。
实际上,clear 表示框(或行框)的哪些边(左边或右边)不应该挨着浮动框。对于 clear 元素,浏览器在该元素顶部添加足够多的外边距,使元素垂直下降到浮动框下面。
更通俗的说法是”左侧抗浮动“、”右侧抗浮动“、”两侧抗浮动“。
clear:both
clear:both 不是两侧抗浮动,准确的理解应该是左侧抗浮动,或右侧抗浮动。
思考这么一个情况:如果有三个向左浮动的元素,同时在第二个元素上添加 clear:both,请问是变成两行还是三行?
答:是 2 行。
请看示例:
为什么会这样?因为在 mdn float 文档 中写着”清除之前”的浮动,也就是说不管后端的浮动
Tip:既然只管前面的浮动,而元素要么左浮动,要么右浮动,所以 clear:left、clear:right 就没什么用了,直接写 clear:both 就好。
clearfix
如果要让父元素包含浮动的子元素,有一种方法叫做 clearfix,即 clear 一个不浮动的 ::after 伪元素。请看效果:
// 核心代码
.f-clearfix::after{display:block;content:'';clear:both;}
<div class="f-clearfix">
<img style="float:left">
</div>
Tip: clear 属性只有块级元素才有效。故 display 也可以设置为 table、list-item。
一侧定宽的两栏自适应布局
效果如下:
// 核心代码
.f-clearfix::after{display:block;content:'';clear:both;}
<!-- f-clearfix 解决父元素高度塌陷,margin-left 解决文字环绕图片 -->
<div class="f-clearfix">
<img style="float:left;width:60px">
<div style="margin-left:70px;">Lorem ipsum dolor sit amet consectetur adipisicing elit. Perspiciatis, nobis.</div>
</div>
注:浮动图片与右侧盒子的间距,这里使用图片的宽度+间隙宽度(margin-left:60px + 10px),如果只在图片上使用 margin-right:10px,仍然会存在文字环绕图片的问题。
margin 不会合并
浮动元素的垂直 margin 不会合并。请看示例:
// 核心代码
<div class='float:left;margin:10px'></div>
<div class='float:left;margin:10px'></div>
由于没有发生合并,所以两个盒子的垂直外边距是 10px + 10px。
块格式化上下文(BFC)
如果一个元素具有 bfc,那么它的内部元素在怎么折腾,也不会影响外部元素,而且也不会被外部元素所影响。
浮动使高度塌陷,我们有时会在父元素上设置 overflow:hidden 来解决此问题。就像这样:
Lorem, ipsum dolor.
// 核心代码
<div class="overflow:hidden">
<img style="float:left">
</div>
<p>Lorem, ipsum dolor.</p>
创建 bfc 有很多方式,overflow:hidden 就是其中一种。如果不将浮动带来的高度塌陷这个问题解决,那么就会影响到后面元素的布局,这显然会违背 bfc 的特性。
overflow:hidden/auto 是创建 bfc 众多方式中为数不多的好方法。如果不考虑兼容性,display:flow-root 则是创建 fbc 最佳方式
Tip: 更多创建 bfc 的方式请看 mdn bfc。
bfc 与自适应布局
bfc 除了可以清除 float 的影响、去除 margin 重叠,还可以实现更健壮的自适应布局。
我们使用 bfc 重写上面的“一侧定宽的两栏自适应布局”:
// 核心代码
<!-- `overflow:hidden;` 解决父元素高度塌陷 -->
<div class="overflow:hidden;">
<!-- `margin-right:10px` 增加与右侧盒子的间距 -->
<img style="float:left;width:60px;margin-right:10px">
<!-- `overflow:hidden;` 解决文字环绕图片 -->
<div style="overflow:hidden;">Lorem ipsum dolor sit amet consectetur adipisicing elit. Perspiciatis, nobis.</div>
</div>
Tip: 如果你的产品只需要支持 firefox 53+、chrome 58+、edge 79+,你就可以使用 display:flow-root 来创建无副作用的 bfc。并且会变成块级元素。
css 快速入门 系列 —— 浮动的更多相关文章
- Html与CSS快速入门03-CSS基础应用
这部分是html细节知识的学习. 快速入门系列--HTML-01简介 快速入门系列--HTML-02基础元素 快速入门系列--HTML-03高级元素和布局 快速入门系列--HTML-04进阶概念 边框 ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- Html与CSS快速入门01-基础概念
Web前端技术一直是自己的薄弱环节,经常为了调节一个简单的样式花费大量的时间.最近趁着在做前端部分的开发,果断把这部分知识成体系的恶补一下.内容相对都比较简单,很类似工具手册的学习,但目标是熟练掌握. ...
- Html与CSS快速入门02-HTML基础应用
这部分是html细节知识的学习. 快速入门系列--HTML-01简介 快速入门系列--HTML-02基础元素 快速入门系列--HTML-03高级元素和布局 快速入门系列--HTML-04进阶概念 示例 ...
- Html与CSS快速入门04-进阶应用
这部分是html细节知识的学习. 快速入门系列--HTML-01简介 快速入门系列--HTML-02基础元素 快速入门系列--HTML-03高级元素和布局 快速入门系列--HTML-04进阶概念 之前 ...
- 前端学习 node 快速入门 系列 —— 简易版 Apache
其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...
- 前端学习 node 快速入门 系列 —— 报名系统 - [express]
其他章节请看: 前端学习 node 快速入门 系列 报名系统 - [express] 最简单的报名系统: 只有两个页面 人员信息列表页:展示已报名的人员信息列表.里面有一个报名按钮,点击按钮则会跳转到 ...
- vue 快速入门 系列 —— vue 的基础应用(上)
其他章节请看: vue 快速入门 系列 vue 的基础应用(上) Tip: vue 的基础应用分上下两篇,上篇是基础,下篇是应用. 在初步认识 vue一文中,我们已经写了一个 vue 的 hello- ...
随机推荐
- oralce 存储过程传入 record 类型的参数?
先定义一个 package , package中含有一个 record 类型的变量 create or replace package pkg_record is type emp_record is ...
- 【Linux卷管理】LVM创建与管理
安装LVM 首先确定系统中是否安装了lvm工具: [root@jetsen ~]# rpm -qa|grep lvm system-config-lvm-1.1.5-1.0.el5 lvm2-2.02 ...
- matplotlib画直线图的基本用法
一 figure使用 1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 # 从-3到中取50个数 5 x = np.linspac ...
- 可扩展标记语言XML(淅淅沥沥的小雨)
XML简述 XML用于描述数据,是当前处理结构化文档信息的有力工具.与操作系统编程语言的开发平台无关,可以实现不同系统之间的数据交互. xml文件结构: 1 <?xml version=&quo ...
- spring security oauth2 搭建认证中心demo
oauth2 介绍 oauth2 协议应该是开发者们耳熟能详的协议了,这里就不做过多的介绍了,具体介绍如何在spring security中搭建oauth2的认证服务.Spring-Securit ...
- Centos7源码部署Redis3.2.9
目录 一.环境准备 二.安装 三.测试 四.编写启动脚本 一.环境准备 [Redis-Server] 主机名 = host-1 系统 = centos-7.3 地址 = 1.1.1.1 软件 = re ...
- tableau绘制热力地图
一.右键国家地区和城市字段分别设置为地理角色-国家地区和城市 二.双击国家地区和城市添加到工作表 三.把订单id拖拽至标记卡的详细信息,标记改为密度显示,颜色设置为温度发散 四.最终整理结果如下图所示
- 从 CPython 源码角度看 Python 垃圾回收机制
环状双向链表 refchain 在 Python 程序中创建的任何对象都会被放到 refchain 链表中,当创建一个 Python 对象时,内部实际上创建了一些基本的数据: 上一个对象 下一个对象 ...
- 工厂为什么要进行计划排产,APS高级计划排程系统的优势作用是什么?
我们每个人的指挥中心是大脑,大脑对我们身体发出各种各样的指令,不停的告诉我们身体去干什么. 那么,一个制造企业的指挥中心是哪里?工厂每天都会接到各种各样的订单,通过几百上千的工人,使用各种设备来生产. ...
- CF793A Oleg and shares 题解
Content 有 \(n\) 支股票,第 \(i\) 支股票原价为 \(a_i\) 卢布.每秒钟可能会有任意一支股票的价格下降 \(k\) 卢布,以至于降到负数.求所有股票的价格均变得相同所要经过的 ...