CSS学习八:浮动
一、页面布局方式
页面布局方式,主要包含:文档流(常规流)、浮动流
文档流:
- 文档流中元素框的位置,由元素在HTML中的位置决定。
- 块级元素从上到下依次排列,框之间垂直距离由框的垂直margin计算得到。块与块之间的margin取较大的margin值。
- 行内元素在一行中布置。行内元素之间的margin间,取它们之和。
浮动流:元素从正常的排列顺序抽离
- 浮动可以使元素向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
- 由于浮动框不在正常文档流中,所以标准文档流中的块框表现得像浮动框不存在一样。即浮动框的位置,会被文档流的框占据。
浮动是由css的一个属性来决定的。语法:{float:....}
{float: left向左浮动,right向右浮动,none默认值}
float属性,定义元素浮动,在朝上浮动时靠哪个方向停靠。
往上浮动时,上到什么地方呢?上升到第一个浮动块后面。如果当前元素是第一个浮动块,那就在当前行的位置浮动。
通俗的说,文档流是一层纸,浮动层是另外一层低,浮动层在前面。
如果没有任何元素浮动则没有浮动层;第一个浮动的元素的位置(行)所在的位置,认为是浮动层的顶部地方(但它已经移动到浮动层了,相当于它创建了浮动层);第二个元素浮动时,以第一个浮动元素所在的位置作为顶部的地方,移动到此行,然后在此行往左边或往右边靠;依次类推。当然任何元素浮动以后,它所在的位置就空出来了,文档流所在的层的元素会占据它的位置。
浮动的时侯,都是贴着它的垂直方向的上一个元素框,左右移动。当本行放不下的时侯,被挤到下一行。
通过float属性实现元素的浮动,以往这个属性总应用于图像,使文本围绕在它周围。不过在css中,任何元素都可以浮动。
浮动元素,会生成一个块级框,而不论这本身是何种元素。
通过CSS设定了浮动(float属性,可向左浮动或向右浮动)以及设定显示(display)属性为“block”或“list-item”的元素都是块级元素,无论此元素本身是何种元素。
通过display:'inline'设置以后都会变成行内元素;通过display:'block'设置以后都会变成块级元素;通过display:'inline-block'设置以后都会变成行内块级元素。
如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可以地窄。比如,span。
元素是文档结构的基础,在css里面,每个元素生成了包含内容的框(box),大家都叫“盒子”。
但是不同的元素显示方式是不同的,有占据一整行的,有水平一个挨着一个的。
HTML中的<img>、<input>、<textarea>、<select>、<object>都是替换元素,这些元素都没有实际的内容。
HTML 的大多数元素是不可替换元素,他们将内容直接告诉浏览器,将其显示出来。
显示元素,分为两种情况,一种是‘块级元素’ ‘block’,还有一种是“行内元素”inline,也叫“内联元素”。
示例,依次浮动div2,div3,div4,往左或往右浮动,观察效果:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <style type="text/css"> #div1 { width: 200px; height: 50px; background-color: #0000FF; } #div2 { width: 100px; height: 100px; background-color: yellow; float: left; } #div3 { width: 280px; height: 130px; background-color: green; /* float: left; */ } #div4 { width: 60px; height: 60px; background-color: orange; /* float: left; */ } </style> </head> <body> <div id="div1"> </div> <div id="div2"> </div> <div id="div3"> </div> <div id="div4"> </div> </body> </html>
浮动产生的副作用:
- 背景不能显示:如果对父级设置了CSS背景或者背景图片,而父级不能被撑开时,导致背景不能显示。当然,如果父级元素被撑开,背景将正常显示。
- 边框不能被撑开
- margin padding不能正确显示,特别是上下边的margin跟padding不能正确显示
在此示例中,背景被撑开:
<body> <div style="background-color: #666666;"> <p>abc</p> </body>
在以上示例中,如果将唯一能撑开div的元素p,变成浮动元素。则div不能被撑开,背景不能显示:
<body> <div style="background-color: #666666;"> <p style="float: left;">abc</p> </body>
解决办法之一:给父级元素设置高度,让它将背景撑开。或者清除浮动。
特殊情况:图像浮动后,文字围绕图片:
文字并没有占据图像浮动后的位置,而是围绕图像。
<img src="img/2.jpg" style="float: left; width: 100px; height: 100px;"/> <p>aaaaaaaaaaaaaaaasdfxcvvvvvvvvvvvvvvvvvvvvvvvdddddcccccccddddddddddddddddddsssss</p>
浮动带来的margin问题示例:
在此示例中,box2,box的margin都设置为20px;3个box并排,在同一行的方向上,块与块之间的margin等于两个块的margin之和;box1和box2的margin为20px,box2和box3的margin之和为40px,没有问题:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> * { margin: 0; padding: 0; } #box { width: 800px; height: 400px; background-color: #DEB887; } #box1,#box2,#box3 { width: 200px; height: 100px; } #box1 { background-color: yellow; float: left; } #box2 { background-color: blue; float: left; margin: 20px; } #box3 { background-color: red; float: left; margin: 20px; /* width: 600px; */ } </style> </head> <body> <div id="box"> <div id="box1"></div> <div id="box2"></div> <div id="box3"></div> </div> </body> </html>
如果将box3的宽度设置为600px,那么一行将放不下box1,box2,box3;box3将被挤到下一行。
box3挤到下一行后,box1和box2之间的横向margin为20px,是正确的。
但是box2和box3之间垂直margin之和,应该取它们中较大的margin,因此它们垂直之间的margin应该为20;
实际上box2和box3之间的垂直margin之和,变为了box2 + box3,共40px。这是浮动带来的margin问题情况之一。
解决办法:试以几种方法,未解决。
二、清除浮动
语法:{clear: left/right/both/none;}
- clear属性,规定元素在哪一侧不允许其它浮动元素。
- left:在左侧不允许浮动元素
- right:在右侧不允许浮动元素
- both:在左右两侧均不允许浮动元素
- none:默认值,允许浮动元素出现在两侧。
其它清除浮动的方法:
- 在父级元素添加最后一个子元素时,子元素设置样式clear:both
- 给父级元素设置高度
- 设置:after伪元素,如div:after{display:block;clear:both;content:""}
- 父级div定义overflow:hidden和zoom:1
清除浮动示例:
posted on 2018-11-16 22:23 myworldworld 阅读(150) 评论(0) 收藏 举报