文章目录
今天来谈谈网页设计中的float定位和position定位,这两个在网页排版中是必不可少的操作,当然float其实用得更多。
一、float浮动
1、文档流
指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。脱离文档流也就是不遵循普通的布局排版,采用自己设定的规则来排版。能够脱离文档流的两个方法是使用float和position中的absolute。
2、块级元素与内联元素
前几篇文章中都提到了块级(block)标签和内联(inline)标签,其实这些标签就是所谓的块级元素和内联元素。常见的都有以下几种,
- 块级元素有 div、form、table、p、pre、h1~h5、dl、ol、ul 等。
- 内联元素有span、a、strong、em、label、input、select、textarea、img、br等
块级元素通常被现实为独立的一块,独占一行,多个块级就是占多行;
block元素可以设置width、height属性,但内联元素不行;
内联元素可以多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行。
3、浮动的定义
浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的浮动框之后的块框表现得就像浮动框不存在一样。
浮动最有效的作用就是能够让原本无法摆放在同一行的块级标签摆放在同一行。
4、float浮动的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.div1{
width:100px;
height: 100px;
background-color: pink;
float:left;
}
.div2{
width:200px;
height: 100px;
background-color: deeppink;
/*float:left;*/
}
.div3{
width:100px;
height: 200px;
background-color: red;
float:left;
}
.div4{
width:200px;
height: 200px;
background-color: darkred;
/*float:left;*/
}
</style>
</head>
<body>
<div class="div1"></div>
<div class="div2"></div>
<div class="div3"></div>
<div class="div4"></div>
</body>
</html>
(1)初始状态,即将所有float浮动效果注释掉,原本的效果是这样的:
在图里,div1的颜色最浅,div2、div3、div4的颜色依次加深。
(2)当我们把div1,div2,div3都添加向左浮动时(div4不加),就出现了这样的效果:
这种效果的产生,是因为div1(粉)、div2(深粉)、div3(红)这三个个块级标签都是浮动状态的,就好像是飘着的,而div4不是飘着的,是在地上的,所以就补充上位,占了第一行的位置。而对于div1(粉)、div2(深粉)、div3(红)都是飘着的,飘着也是有次序的,因此从左到右依次飘在第一行的“空中”,此时div4(深红)是在第一行的“地上”。
(3)当我们仅将div1和div3设置成向左浮动,就出现了这样的效果:
首先div1(粉)飘在第一行的空中,div2(深粉)补充上位,div1仅占div2的一半大小,因此只能在“空中”盖住div2的一半。由于div3(红)也是飘着的,div4(深红)补充上位,因为div3只占div4的一半大小,所以也只在空中覆盖div4的一半。
4、float浮动的清除
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
* {
margin:0;
padding:0;
}
.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;
}
.container:after{
content:"";
display:block;
clear:both;
}
</style>
</head>
<body>
<div class="container">
<div id="box1">box1 向左浮动</div>
<div id="box2">box2 向右浮动</div>
<!-- 清除浮动-->
<!-- <div style="clear:both"></div>-->
</div>
<div id="box3">box3</div>
</body>
</body>
</html>
不添加浮动的状态是这样:
对box1(绿色)和box2(深粉)添加浮动后效果是这样:
假如我们并不想要这种效果,而是想要把粉色长条移到box1和box2的底下,有以下两种常用的方法可以做到,
一是在box1和box2的下面再添加一个块级div标签,设置风格为clear:both,即:
<div style="clear:both"></div>
二是使用伪类操作(更加灵活),即:
.container:after{
content:"";
display:block;
clear:both;
}
最终达到的效果是这样:
5、clear语法补充
clear : none | left | right | both
取值:
- none : 默认值。允许两边都可以有浮动对象
- left : 不允许左边有浮动对象
- right : 不允许右边有浮动对象
- both : 不允许有浮动对象
二、position定位
1、static静态
position的默认参数是static,即无定位。此时即使设置了left、top等参数也没有效果,因为它没有参照物。
假如我们将没有定位作为初始状态,它的效果是这样的:
图中,div1(粉)、div2(深粉)、div3(红),div4(深红)。
2、relative相对定位
相对定位是相对于该元素在文档流中的原始位置,即以自己原始位置为参照物。有趣的是,即使设定了元素的相对定位以及偏移值,元素还占有着原来的位置,即占据文档流空间。对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。
将div2(深粉)设置了相对定位的效果是这样的:
3、absolute绝对定位
置为绝对定位的元素框从文档流完全删除,并相对于最近的已定位祖先元素定位,如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块(即body元素)。元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。
重点:如果父级设置了position属性,例如position:relative;,那么子元素就会以父级的左上角为原始点进行定位。这样能很好的解决自适应网站的标签偏离问题,即父级为自适应的,那我子元素就设置position:absolute;父元素设置position:relative;,然后Top、Right、Bottom、Left用百分比宽度表示。
对div2(粉)设置了绝对定位的效果是这样的:
很显然,div2的位置直接被div3给占了。
4、fixed固定坐标
对象脱离正常文档流,使用top,right,bottom,left等属性以窗口为参考点进行定位,当出现滚动条时,对象不会随着滚动。而其层叠通过z-index属性 定义。
注意点: 一个元素若设置了 position:absolute | fixed; 则该元素就不能设置float。这
是一个常识性的知识点,因为这是两个不同的流,一个是浮动流,另一个是“定位流”。但是 relative
却可以。因为它原本所占的空间仍然占据文档流。
也就是说,被设置为fixed的元素会被定位于浏览器窗口的一个指定坐标,不论窗口是否滚动,它都会固定在这个位置。
给div2加了fixed固定定位后,同时将原来的div1、div3、div4都复制一遍,以出现滚动条,效果是这样的:
可以很清楚得看到,div2固定在网页的一个位置不会变化。
5、测试代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
*{
margin:0;
}
.div1{
width:200px;
height: 100px;
background-color: pink;
}
.div2{
width:200px;
height: 100px;
background-color: deeppink;
/*position:relative;*/
/*left:100px;*/
/*top:100px;*/
/*position:absolute;*/
/*left:100px;*/
/*top:100px;*/
position:fixed;
left:100px;
top:100px;
}
.div3{
width:200px;
height: 200px;
background-color: red;
}
.div4{
width:200px;
height: 200px;
background-color: darkred;
}
</style>
</head>
<body>
<div class="div1"></div>
<div class="div2"></div>
<div class="div3"></div>
<div class="div4"></div>
<div class="div1"></div>
<div class="div3"></div>
<div class="div4"></div>
</body>
</html>