css的定位是很重要的一个知识点,要学会网页布局,一定要先把定位弄清楚,今天抽空整理一下这方面的知识。

1.块级元素和行内元素(内联元素)

块级元素:display值为block的元素就是块级元素,比如div,h,p,table,块级元素会占据一定的矩形空间,通过设置width,height,padding,margin等来调整这个矩形框(也就是盒模型)的大小。

行内元素(内联元素):display的值为inline的元素为内联元素,这些元素本身不占据矩形空间,必须依附于块级元素而存在,所以给他们设置width等参数是没有意义的。

2.四种定位方式

css中有四种定位方式,static,relative,absolute,fixed.接下来我将一个一个叙述。

static:

static是默认的定位方式,它的规则是:块级元素一行一行排列,每个块级元素占据一定的空间。行内元素依附与块级元素。不能使用top,bottom,left,right和z-index来描述。比如,下面的代码。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>盒模型研究</title>
<style>
* {
margin: 0;
padding: 0;
} #box1 {
background-color: #C6F08C;
padding: 5px;
color: white;
margin: 5px;
width: 100px;
height: 100px;
} .box2 {
background-color: red;
width: 50px;
height: 50px;
} #box3 {
background-color: blue;
width: 100px;
height: 100px;
padding: 5px;
} </style>
<script> </script>
</head>
<body>
<div id="box1">
<a href="#">跳转链接</a>,<a href="#">跳转链接</a><!--默认形成一个行框-->
<div class="box2">Hello World</div>
</div>
<div id="box3">
<div class="box2">Hello World</div>
<h2>another box</h2>
</div>
</body>
</html>

其形成的样式如下:

可以看到,div这些块级元素会垂直排列下来,而行内元素如a则依附于块级元素在水平方向排列,直到它的宽度不够容纳,就会自动换行下来。

relative:

relative翻译过来是相对的意思,所以理解相对什么最关键,相对的是父块级元素,不管父元素是哪种定位方式。一旦我们将一个元素的position设置为relative,它的显示位置就会相对于它在父元素中自己本来的位置进行移动,而具体移动到什么地方,可以通过left,right,top,bottom等值来设置。但是需要注意的是,它在文档中还是占据了它原本应该有的位置,也就是说他原来的位置依然不能放其他元素,尽管它已经不在那边了。

这样说有点抽象,我们来举个例子。再上面例子的情况下,我们将box2设为relative,并且设置其left和top。如下所示。

.box2 {
position:relative;
left:20px;
top:20px;
background-color: red;
width: 50px;
height: 50px;
}

这样以后,上述的页面变成这样显示。

可以看到,两个box2相对于其在父div中自己原来的位置向左和向下移动了20px.而通过观察box3中的another box这个元素我们可以发现,尽管box2移动走了,它并没有占据掉box2原来的位置,可见,box2原本的位置依然没有释放。这一点十分重要。同时我们发现,box2遮挡住了部分原来another box的位置。

可以这样理解,如果把每个块级元素比喻成相框,relative标记的元素就好像我们把相框中的相片拿出来,相对于相框原来的位置移动到了一个新的位置显示,有可能凌驾于其他的相框之上(box2遮挡了部分another box),但是因为它的相框还占据着原来的位置,所以其他的相框(元素)不能放置在它初始的位置。

absolute

absolute翻译过来叫做绝对,这是跟relative相对对应的,relative是相对于自己原来在父容器中的位置的偏移量。而absolute则是相对于父容器的偏移量,并且标记为absolute的元素已经脱离了文档流,它原本的位置可以被其他的元素侵占。

还有一个重要的条件是,标记为absolute的元素所相对的父元素指的是它的第一个非static父元素,如果他所有的父级元素都是static,则它的父容器为整个文档流。

先看如下例子,在box1和bo,3中均放置着box2,我们把box2设置为absolute,而box1和box2均为默认的static。则根据上述理论,box2的父级容器当属整个文档流。我们设置box2的偏移量则是相对于最外层的文档流的偏移量。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>盒模型研究</title>
<style>
* {
margin: 0;
padding: 0;
} #box1 {
background-color: #C6F08C;
//position:relative;
padding: 5px;
color: white;
margin: 5px;
width: 100px;
height: 100px;
} .box2 {
position:absolute;
left:20px;
top:20px;
background-color: red;
width: 50px;
height: 50px;
} #box3 {
background-color: blue;
//position:relative;
width: 100px;
height: 100px;
padding: 5px;
}
h2{
position:relative;
} </style>
<script> </script>
</head>
<body>
<div id="box1">
<a href="#">跳转链接</a>,<a href="#">跳转链接</a><!--默认形成一个行框-->
<div class="box2">Hello World</div>
</div>
<div id="box3">
<div class="box2">Hello World</div>
<h2>another box</h2>
</div>
</body>
</html>

可以看到两个box2都跳到了同一个地方,这是因为它们都是相对于最外层文档流进行了偏移。而且我们看到在box3中原来的box2的位置被another box这个h2占据了,说明absolute标记的元素已经从原来的位置删除了,就好像连整个相框都拿走了,放置到其他的相框上面。所以放原来相框的位置可以放置其他相框。(事实上就好像从来没有放置过这个相框一样,其他元素会重新占据它的位置并重新布局)

现在我们把box3的position改为relative,观察会出现什么情况。

我们发现其中一个box2改变位置了,变成了相对于box3的原点向右和向下偏移20px.这是因为此时这个box2的父级元素是box3.(第一个非static元素)。

总结一下:标记为absolute的元素,它会相对于自己的第一个非static父级元素(如果都是static,则是相对于最外层文档流),偏移指定的位移。并且它原本所占的位置可以被其他的元素抢占,就好像它从来没有出现过一样。

fixed

fixed基本与absolute类似,但是它的父元素是整个body,即它是相对于整个body来偏移;所以它不会随着其他元素的滚动而滚动,不像absolute,会随着父级元素的滚动而滚动。这也是它叫fixed的原因。我们常常看到有些网站,顶部那条菜单栏是固定的,就是用fixed实现的。

4.z-index.

我们在介绍relative或者absolute或者fixed的时候,发现被偏移的元素会跑到别的元素上面,遮挡住其他元素。就好像一张相框遮住了另外一张相框一样,其实我们可以通过Z-index来设置各个相框的排列顺序,z-index越大表示放在越上面。

不过值得注意的是,参与比较的元素都必须是非static元素,否则比较就没有意义。因为非static始终是覆盖在static元素上的。

css定位研究的更多相关文章

  1. CSS彻底研究(3) - 浮动,定位

    Github pages 博文 CSS彻底研究(3)-浮动,定位 一 . 浮动float I . 定义及规则 float默认为none,对应标准流的情况.当float : left;时,元素就会向其父 ...

  2. selenium之css定位小结

    前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...

  3. 自动化测试-6.selenium的css定位

    前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...

  4. 2.4 CSS定位

    前言 大部分人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css ...

  5. Selenium2+python自动化-CSS定位语法

    前言 一些人在使用selenium定位元素时,用的是xpath定位,因为xpath基本能解决定位的需求.css定位往往被忽略掉了,其实css定位也有它的价值,css定位更快,语法更简洁.这一篇css的 ...

  6. selenium - css 定位

    前言: CSS(Cascading Style Sheets)是一种语言,它被用来描述 HTML 和 XML 文档的表现. CSS 使用选择器来为页面元素绑定属性.这些选择器可以被 selenium ...

  7. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  8. selenium3 + python - css定位

    一.css:属性定位 1.css可以通过元素的id.class.标签这三个常规属性直接定位到 2.如下是百度输入框的的html代码: <input id="kw" class ...

  9. css定位

    文档流 所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版 ...

随机推荐

  1. CSS3 之转动的风车

    js 可以做动画,但是需要写很多代码:其实css也是可以做动画的,而且比js写的代码还少,理解也相对简单. 这里用到css3 的animation 属性,它配合着 @keyframes 规则来使用,可 ...

  2. 3.SLB 回话保持功能分析

    参考文档: 七层会话保持 配置服务器Cookie会话保持常见问题四层监听  

  3. codes often WA

    枚举: 1.完美立方 #include<iostream> #include <cstdio> using namespace std; int main() { int N; ...

  4. linux下mysql开启远程访问权限 防火墙开放3306端口

    linux下mysql开启远程访问权限 防火墙开放3306端口 转载  2017-01-21   作者:JAVA-ANDROID 这篇文章主要为大家详细介绍了linux下mysql开启远程访问权限,防 ...

  5. 吴裕雄 01-mysql管理

    SHOW DATABASES; update user set authentication_string = password("123456") where user='roo ...

  6. win10虚拟桌面;一不小心按错了突然只剩下桌面,启动的程序都没了

    先说如何关闭虚拟桌面:ctrl+win+F4(万一你还没看到怎么关闭虚拟桌面,就创建并调整到虚拟桌面,会很懵的,因为你启动的所有程序全部都突然消失了,只剩下开机的桌面了): win10有个功能,虚拟桌 ...

  7. C 中的typedef应用

    1. typedef  声明的新的类型名在变量名的位置出现. example: typedef unsigned int UINT 则 unsigned int a; 相当于 UINT A; 2. t ...

  8. 通过网址request到response经历的过程

    前言当我们在浏览器中输入一个网址,比如www.google.cn,浏览器就会加载出百度的主页.那么浏览器背后完成的具体是怎么样的呢? 总结起来大概的流程是这样的: (1)浏览器本身是一个客户端,当你输 ...

  9. css 书目录相关css+html代码

    css: <style type="text/css"> #list{width:500px;position:absolute;left:50%;margin-lef ...

  10. 微擎框架下拉分页(使用js模板引擎)

    1.需要分页的页面,引入一下文件 <script language="javascript" src="\addons\{$_GPC['m']}\template\ ...