浮动
传统网页布局的三种方式
CSS提供了三种传统布局方式(简单说, 就是盒子如何进行排列顺序)
- 普通流(标准流/文档流)
所谓的标准流: 就是标签按照规定好默认方式排列
- 块级元素会独占一行, 从上往下顺序排列
常用元素:div hr p h1~h6 ul ol dl form table
- 行内元素会按照顺序, 从左到右排列, 碰到父元素边界会自动换行
常用元素:span a i em
一. 标准流
标准流是最基本的布局方式
注意: 实际开发中, 一个页面基本都包含了这三种布局方式(后面移动端学习新的布局方式)
二. 浮动
1. 为什么需要浮动?
行内块元素不能控制缝隙
总结:
有很多布局效果, 标准流没有办法完成, 此时就可以利用浮动完成布局. 因为浮动可以改变元素标签默认的排列方式
浮动最典型的应用: 可以让多个块级元素一行内排列显示
网页布局第一准则: 多个块级元素纵向排列找标准流, 多个块级元素横向排列找浮动
2. 什么是浮动?
float属性用于创建浮动框, 将其移动到一边, 知道左边缘或右边缘触及包含块或另一个浮动框的边缘
语法:`选择器 {float: 属性值;}
属性值 | 描述 |
---|---|
none | 元素不浮动 |
left | 元素向左浮动 |
right | 元素向右浮动 |
3. 浮动特性(难重点)
加了浮动之后的元素, 会具有很多特性, 需要掌握
- 浮动元素会脱离标准流(脱标)
- 脱离标准普通流的控制(浮)移动到指定位置(动), (俗称脱标)
- 浮动的盒子不再保留原先的位置
- 浮动元素会一行内显示并且元素顶部对齐
- 浮动的元素会具有行内块元素的特性
- 如果块级盒子没有设置高度, 默认宽度和父级一样宽, 但是添加浮动后, 它的大小根据内容来决定
- 浮动的盒子中间是没有缝隙的, 是紧挨着一起的
- 行内元素同理(
- 可以把行内元素变为行内块元素(有类似特性), 比如
<span>
- 行内元素有了浮动, 则不需要转换块级\行内块元素就可以直接给高度和宽度(行内块元素如果不设置宽度, 则宽度为内容的大小))
- 可以把行内元素变为行内块元素(有类似特性), 比如
- 浮动的盒子不会有外边距合并/塌陷问题
4. 浮动元素经常和标准流父级搭配使用
为了约束浮动元素位置, 我们网页布局一般采取的策略是:
-
先用标准流的父元素排列上下位置, 之后内部子元素采取浮动排列左右位置, 符合网页布局第一准则
-
网页布局第二准则: 先设置盒子大小, 之后设置盒子的位置
5. 常见网页布局
6. 浮动布局注意点
- 浮动和标准流的父盒子搭配
先用标准流的父元素排列上下位置, 之后内部子元素采取浮动排列左右位置 - 一个元素浮动了, 理论上其余的兄弟元素也要浮动
一个盒子里面有多个子盒子, 如果其中一个盒子浮动了, 那么其他兄弟也应该浮动, 以防引起问题 - 浮动的盒子只会影响浮动盒子后面的标准流, 不会影响前面的标准流
浮动的盒子总是贴着前面的标准流
大毛是标准流,二毛浮动,三毛标准
7. 思考题
我们前面浮动元素有一个标准流的父元素, 他们有一个共同的特点, 都是有高度的.
但是, 所有的父盒子都必须有高度吗?
- 理想中, 让子盒子撑开父盒子, 有多少孩子, 父盒子就有多高
8. 清除浮动
- 为什么要清除浮动?
- 由于父级盒子在很多情况下, 不方便给高度, 但是子盒子浮动又不占有位置, 最后父级盒子高度为0时, 就会影响下面的标准流盒子
- 清除浮动的本质
- 清除浮动的本质是清除浮动元素造成的影响
- 如果父盒子本身有高度, 则不需要清除浮动
- 清除浮动后, 父级就会根据浮动的子盒子自动检测高度. 父级有了高度, 就不会影响下面的标准流了
- 语法:
选择器 {clear: 属性值;}
属性值 | 描述 |
---|---|
left | 不允许左侧有浮动元素(清除左侧浮动的影响) |
right | 不允许右侧有浮动元素(清除右侧浮动的影响) |
both | 同时清除左右两侧浮动的影响 |
-
实际工作中, 几乎只用
clear: both;
-
清除浮动的策略是: 闭合浮动
-
清除浮动方法:
- ** 额外标签法**也称为隔墙法, 是W3C推荐的做法
- 额外标签法会在浮动元素末尾添加一个空的块级元素标签. 例如
<div style="clear: both"></div>
, 或者其他标签(如<br/>
等) - 优点: 通俗易懂, 书写方便
- 缺点: 添加许多无意义的标签, 结构化较差
- .父级添加overflow属性
- 可以給父级添加
overflow
属性, 将其属性值设置为hidden
,auto
或scroll
- 优点: 代码简洁
- 缺点: 无法显示溢出的部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cvjJuRTr-1611563026479)(index_files/86c3920c-20bc-49d8-b58b-4f1289a08195.jpg)]
- 父级添加after伪元素(常用)
:after
方式是额外标签法的升级版. 也是给父元素添加- 固定代码:
.clearfix:after { content: ""; display: block; height: 0; clear: both; visibility: hidden; } .clearfix { /* IE6, 7专有 */ *zoom: 1; }
- 优点: 没有增加标签, 结构更简单
- 缺点: 照顾低版本浏览器
- 父级添加双伪元素(常用)
- 也是给父元素添加
- 代码
.clearfix:before, .clearfix:after { content: ""; display: table; } .clearfix:after { clear: both; } .clearfix { /* IE6, 7专有 */ *zoom: 1; }
- 优点: 代码更简洁
- 缺点: 照顾低版本浏览器
9. 清除浮动总结
为什么要清除浮动?
- 父级没高度
- 子盒子浮动了
- 影响下面布局了, 我们就应该清除浮动了
|清除浮动的方法|优点|缺点|
|额外标签法(隔墙法)|通读易懂,书写方便|添加许多无意义的标签, 结构化较差|
|父级overflow: hidden;|书写简单|溢出隐藏|
|父级after伪元素|结构语义化明确|由于IE6-7不支持:after, 兼容性问题|
|父级双伪元素|结构语义化明确|由于IE6-7不支持:after, 兼容性问题|