先来了解一下block元素和inline元素在文档流中的排列方式。
block元素通常被实现为独立的一块,独占一行,多个block元素会各自新起一行,默认block元素宽度自动填满其父元素宽度。block元素可以设置width、height、margin、padding属性;
inline元素不会独占一行,多个相邻的行内元素会排在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化。inline元素设置width、height属性无效。inline元素的margin、padding属性。水平方向的padding-left、padding-right、margin-left、margin-right都产生边距效果;但竖直方向的padding-top、padding-bottom、margin-top、margin-bottom不会产生边距效果。
常见的块级元素:div、form、table、p、pre、h1~h6、dl、ol、ul等;
常见 的内联元素:span、a、strong、em、label、input、select、textarea、img、br等;
所谓的文档流:指的是元素排版布局过程中,元素会自动从左向右,从上往下的流式排列。
脱离文档流:也就是将元素从普通的布局排版中拿走,其它盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位。
只有绝对定位absolute和浮动float才会脱离文档流
------**部分无视和完全无视的区别?**需要注意的是,使用float脱离文档流时,其他盒子会无视这个元素,但其它盒子内的文本依然会为这个元素让出位置,环绕在周围(可以说是部分无视)。而对于使用absolute position脱离文档流的元素,其他盒子与其他盒子内的文本都会无视他()可以说是完全无视。
浮动的表现
定义:浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的浮动框之后的块框表现得就象浮动框不存在一样。(注意这里是块框而不是内联元素;浮动框只对它后面的元素造成影响)
注意:当初float被设计的时候就是用来完成文本环绕的效果,所以文本不会被挡住,这是float的特性,即float是一种不彻底的脱离文档流方式。无论多么复杂的布局,其基本出发点均是:如何在一行显示多个div元素。
eg:举例
<html>
<head>
<title>title>
<style type="text/css">
.div1{
width: 100px;
height: 100px;
background-color: beige;
float: left;
}
.div2{
width: 200px;
height: 100px;
background-color: yellow;
float: left;
}
.div3{
width: 100px;
height: 200px;
background-color: blue;
float: left;
}
.div4{
width: 200px;
height: 200px;
background-color: green;
}
style>
head>
<body>
<div class="div1">div>
<div class="div2">div>
<div class="div3">div>
<div class="div4">div>
body>
html>
现象一:
假如某个div元素A是浮动的,如果A元素上一个元素也是浮动的,那么A元素会跟随在上一个元素的后边(如果一行放不下这两个元素,那么A会被挤到下一行);如果A元素上一个元素是标准流中的元素,那么A的相对垂直位置不会改变,也就是说A的顶部总是和上一个元素的底部对齐。此外,浮动的框之后的block元素会认为这个框不存在但其中的文本依然会为这个元素让出位置。浮动的框之后的inline元素,会为这个框空出位置,然后按顺序排序。
例一:
<html>
<head>
<title>浮动2title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
.container{
border: 1px solid red;
width: 300px;
}
#box1{
background-color: green;
float: left;
width: 100px;
height: 100px;
}
#box2{
background-color: deeppink;
float: right;
width: 100px;
height: 100px;
}
#box3{
background-color: pink;
height: 40px;
}
style>
head>
<body>
<div class="container">
<div id="box1">box1 向左浮动div>
<div id="box2">box2 向右浮动div>
div>
<div id="box3">box3div>
body>
html>
现象二:
(1)左右结构div盒子重叠现象,一般是由相邻两个div一个使用浮动一个没有使用浮动。如上面的例子:相邻的两个盒子box2向左浮动,box3未浮动。一个使用浮动一个没有导致div不是在同个“平面”上,但内容不会造成覆盖现象,只有div形成覆盖现象。
解决方法:要么都不使用浮动;要么都使用float浮动;要么对没有使用float浮动的div设置margin样式。
(2)上下结构div盒子重叠现象
例子如上:container和box3的布局是上下结构,上图发现box3跑到了上面,与container产生了重叠,但文本内容没有发生覆盖,只有div发生覆盖现象。这个原因是因为第一个大盒子里的子元素使用了浮动,脱离了文档流,导致container没有被撑开。box3认为container没有高度(未被撑开),因此跑上去了。
解决方法:
(1)要么给container设置固定高度,一般情况下文字内容不确定多少就不能设置固定高度,所以一般不能设置container高度。当能确定内容多高,这种情况下container是可以设置一个高度,即可解决问题。
(2)要么清除浮动。
在非IE浏览器下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高度,使得内容溢出到容器外面而影响(甚至破坏)布局的现象。这个现象叫浮动溢出,为了防止这个现象的出现而进行的css处理,就叫css清除浮动。
clear语法:
clear:none | left |right |both
取值:
none:默认值,允许两边都可以有浮动对象。
left:不允许左边有浮动对象。
right:不允许右边有浮动对象。
both:不允许有浮动对象。
但是需要注意的是:clear属性只会对自身起作用,而不会影响其他元素。如果一个元素的右侧有一浮动对象,而这个元素设置了不允许右边有浮动对象,即clear:right,则这个元素会自动下降一格,达到本元素右边没有浮动对象的目的。
<html>
<head>
<title>清除浮动title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
.container{
border: 1px solid red;
width: 300px;
}
#box1{
background-color: green;
float: left;
width: 100px;
height: 100px;
}
#box2{
background-color: deeppink;
float: right;
width: 100px;
height: 100px;
}
#box3{
background-color: pink;
height: 40px;
}
.clearfix:after{
content: "";
display: block;
clear: both;
}
style>
head>
<body>
<div class="container clearfix">
<div id="box1">box1 向左浮动div>
<div id="box2">box2 向右浮动div>
div>
<div id="box3">box3div>
body>
html>
清除浮动的方式一(推荐)
.clearfix:after{ <----在类名为“clearfix”的元素内最后面加入内容;
content: ""; <----内容为空;
display: block; <----加入的这个元素转换为块级元素
clear: both; <----清除左右两边浮动
visibility:hidden; <----可见度设置为隐藏。注意它和display:none的区别
line-height:0; <---行高为0
height:0; <---高度为0
font-size:0; <---字体大小为0
}
.clearfix{*zoom:1;} <----这是针对IE6的,因为其不支持after伪类,这个神奇的zoom:1让其的元素可以清除浮动来包裹内部元素。
整段代码就相当于在浮动元素后面跟了个宽度为0的空div,然后设定它clear: both来达到清除浮动的效果。之所以用它,是因为,你不必在html文件中写入大量无意义的空标签,又能清除浮动。
方式二:(有局限性)
overflow:hidden;
overflow:hidden的含义是超出的部分要裁切隐藏,float的元素虽然不在普通流中,但是他是浮在普通流之上的,可以把普通流元素+浮动元素想象成一个立方体,如果没有明确设定包含容器高度的情况下,它要计算内容全部高度才能确定在什么位置hidden,这样浮动元素的高度就要被计算进去。这样包含容器就会被撑开,清除浮动。
默认值,无定位;不能当作绝对定位的参照物,并且设置标签对象的left、top等值是不起作用的。
相对定位是相对于该元素在文档流中的原始位置,即以自己原始位置为参照物。有趣的是,即使设定了元素的相对定位以及偏移值,元素还占着原来的位置,即占据文档流空间。对象遵循正常文档流,但将依据left、top、right、bottom等属性在文档流中便宜位置。而其层叠通过z-index属性定义。
注意:position:relative的一个主要用法:方便绝对定位元素找到参照物。
定义:**设置为绝对定位的元素框从文档流完全删除,并且对于最近的已定位祖先元素定位,如果元素没有定位的祖先元素,那么它的位置相对于最初的包含块(即body元素)。**元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常文档流中生成何种类型的框。
**重点:**如果父级设置了position属性,如position:relative,那么子元素就会以父级的左上角为原始点进行定位。这样能很好的解决自适应网站的标签偏离问题,即父级为自适应的,那我子元素就设置position:absolute;父级元素设置position:relative,然后left、top、right、bottom用百分比宽度表示。
另外,对象脱离正常文档流,使用left、top、right、bottom等属性进行绝对定位。而其层叠通过z-index属性定义。
总结:参照物用相对定位,子元素用绝对定位,并且保证相对定位参照物不会偏移即可。
fixed:对象脱离正常文档流,使用left、top、right、bottom等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性定义。注意点:一个元素若设置了position:absolute | fixed;则该元素就不能设置float。只是一个常识性的知识,因为这是两个不同的流,一个时浮动流,一个是定位流。但是relative却可以,因为它原本所占的空间仍然占据文档流。
在理论上,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。
此情况,margin-bottom和margin-right的值不在会对文档流中的元素产生影响,因为该元素已经脱离了文档流。另外,不管它的祖先元素有没有定位,都是以文档流中原来所在的位置上偏移参照物。
<html>
<head>
<title>css的定位title>
<style type="text/css">
*{
margin: 0px;
}
.div1{
width: 100px;
height: 100px;
background-color: beige;
}
.div2{
width: 200px;
height: 200px;
background-color: yellow;
/*position: relative;*/
position: absolute;
left: 100px;
top: 100px;
}
.div3{
width: 300px;
height: 300px;
background-color: blue;
}
.div4{
width: 400px;
height: 400px;
background-color: green;
}
#a{
width: 80px;
height: 50px;
position: fixed;
bottom: 10px;
right: 10px;
background-color: yellow;
text-align: center;
line-height: 50px;
style>
head>
<body>
<div class="outer">
<div class="div1">div>
<div class="div2">div>
<div class="div3">div>
<div class="div4">div>
div>
<div style="background-color: red; height: 500px;">div>
<div id="a">返回顶部div>
body>
html>