1.普通流(normal flow)
这个单词很多人翻译为 文档流 , 字面翻译 普通流 或者标准流都可以。
CSS的定位机制有3种:普通流(标准流)、浮动和定位。
普通流实际上就是一个网页内标签元素正常从上到下,从左到右排列顺序的意思,比如块级元素会独占一行,行内元素会按顺序依次前后排列;按照这种大前提的布局排列之下绝对不会出现例外的情况叫做普通流布局。
2.浮动(float)
元素的浮动是指设置了浮动属性的元素会脱离标准标准流的控制,移动到其父元素中指定位置的过程。
在CSS中,通过float属性来定义浮动,其基本语法格式如下:
选择器{float:属性值;}
属性值可选如下:
left:元素向左浮动
right:元素向右浮动
none:元素不浮动(默认值)
浮动脱离标准流,俗称脱标,不占位置,会影响标准流,导致塌陷问题。浮动只有左右浮动。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .dv1 { width: 100px; height: 100px; background-color: blue; float: left; } .dv2 { width: 120px; height: 120px; background-color: red; }style>head><body> <div class="dv1">div> <div class="dv2">div>body>html>
浮动首先创建包含块的概念(包裹)。就是说, 浮动的元素总是找理它最近的父级元素对齐。但是不会超出内边距的范围。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .dv1 { width: 150px; height: 150px; background-color: blue; } .dv2 { width: 100px; height: 100px; background-color: red; float: right; }style>head><body> <div class="dv1"> <div class="dv2">div> div>body>html>
一个父盒子里面的子盒子,如果其中一个子级有浮动的,则其他子级都需要浮动。这样才能一行对齐显示。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .dv1 { width: 250px; height: 250px; background-color: blue; } .dv2 { width: 100px; height: 100px; background-color: red; float: left; } .dv3 { width: 100px; height: 100px; background-color: pink; float: left; }style>head><body> <div class="dv1"> <div class="dv2">div> <div class="dv3">div> div>body>html>
总结:元素添加浮动后,元素会具有行内块元素的特性。元素的大小完全取决于定义的大小或者默认的内容多少,浮动根据元素书写的位置来显示相应的浮动。浮动的目的就是为了让多个块级元素同一行上显示。
3.清除浮动
由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响,为了解决这些问题,此时就需要在该元素中清除浮动。
准确地说,并不是清除浮动,而是清除浮动后造成的影响。
1)clear清除
在CSS中,clear属性用于清除浮动,其基本语法格式如下:
选择器{clear:属性值;}
属性值可选参数:
left:不允许左侧有浮动元素(清除左侧浮动的影响)
right:不允许右侧有浮动元素(清除右侧浮动的影响)
both:同时清除左右两侧浮动的影响
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .dv1 { width: 100px; height: 100px; background-color: red; } .dv2 { width: 100px; height: 100px; background-color: blue; float: left; } .dv3 { width: 100px; height: 100px; background-color: pink; clear: both; } .dv4 { width: 100px; height: 100px; background-color: green; }style>head><body> <div class="dv1">div> <div class="dv2">div> <div class="dv3">div> <div class="dv4">div>body>html>
2)额外标签法
优点:通俗易懂,书写方便
缺点:添加许多无意义的标签,结构化较差。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .dv1 { width: 100px; height: 100px; background-color: red; float: left; } .dv2 { width: 100px; height: 100px; background-color: blue; }style>head><body> <div class="dv1">div> <div style="clear: both">div> <div class="dv2">div>body>html>
3)父级添加overflow属性方法
可以给父级添加:overflow为 hidden|auto|scroll 都可以实现。
优点: 代码简洁
缺点: 内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .parent1 { width: 100px; background-color: blue; overflow: hidden; } .parent2 { width: 100px; height: 100px; background-color: red; } .child { width: 50px; height: 50px; background-color: pink; float: left; }style>head><body> <div class="parent1"> <div class="child">div> div> <div class="parent2">div>body>html>
4)使用after伪元素清除浮动
:after 方式为空元素的升级版,好处是不用单独加标签了
优点:符合闭合浮动思想 结构语义化正确
缺点:由于IE6-7不支持:after,使用 zoom:1触发 hasLayout。
<html lang="en"><head> <meta charset="UTF-8"> <title>Titletitle> <style> .parent1 { width: 100px; background-color: blue; } .parent2 { width: 100px; height: 100px; background-color: red; } .child { width: 50px; height: 50px; background-color: pink; float: left; } .clearfix:after { content: ""; display: block; clear: both; visibility: hidden; } .clearfix { *zoom: 1; }style>head><body> <div class="parent1 clearfix"> <div class="child">div> div> <div class="parent2">div>body>html>