前言

接触html、和css时间也不短了,但每次用div+css布局的时候心里还是有点儿虚,有时候干脆就直接用table算了,很多时候用div会出现些不可预料的问题,虽然花费一定时间能够解决,但总不是个事,所以今天特地探索了下css+div的绝对定位和相对定位和文档流的关系。

文档流的概念

确切的说应该是文档文档流模型的机制,html的布局机制就是用文档流模型的,即块元素(block)独占一行,内联元素(inline)。不独占一行

如块级元素(block)

<div>div1</div>
<div>div2</div>

效果如下

ok,那么怎么知道这不是因为没有设置高和宽的样式而出现的情况呢,我们听邓爷爷的话,实践是检验真理的唯一标准

<div style=" width:100px; height:100px;">div1</div>
<div style=" width:100px; height:100px;">div2</div>

效果如下:额,没坑你吧...

又如内联元素(inline)

<img src="Image/close.gif" alt="图片" style=" height:100px; width:100px;"/>
<a href="http:">超链接1</a>
<a href="http:">超链接2</a>

效果如下:可以看到内联元素后跟内联元素不会另起一行

我们再试下inline 后加 block

<img src="Image/close.gif" alt="图片" style=" height:100px; width:100px;"/>
<a href="http:">超链接1</a>
<a href="http:">超链接2</a>
<div style=" width:100px; height:100px;">div1</div>

效果如下:可以看到div1(block)是另起一行独占的

相对定位 position:relative

故名思意,相对定位就应该是相对于一个东西来定位,而这个东西是什么呢?其实这个东西不是什么,就是元素自己本身,用left right top b0ttom进行定位后,元素会根据原来的位置进行移动,但由于position:relative这个属性并没有脱离文档流的,所以元素本身所占的位置会保留。

下面来做个实验,一看你就懂了- -

<div style=" width:100px; height:100px;">div1</div>
<div style=" width:100px; height:100px;">div2</div>
<div style=" width:100px; height:100px;">div3</div>

效果如下:这是没有加入position:relative文档流的默认排法

我们给div2加position:relative 并用top:-20px;left:50px进行相对移动

<div style=" width:100px; height:100px;">div1</div>
<div style=" width:100px; height:100px; position:relative; top:-20px; left:50px;">div2</div>
<div style=" width:100px; height:100px;">div3</div>

效果如下:额,为了给大家看到效果还有省了ps的劲直接截了ide的图...但我保证在浏览器里他也是这么排的。我们可以看到蓝色边框就是div2原来的位置,黑色边框就是通过position:relative相对于原来的位置左移50px; 上移20px得到的,而且我们看以看到,div3并没有因为div2的上移而上移了,原因就是position:relative这个属性是没有脱离文档流的,所以元素本身所占的位置会保留。

绝对定位 position:absolute

好吧终于有点戏肉了,文档流那复杂的玩意我们先不理,所谓绝对定位,其实也要找个东西来相对来绝对的,而这个东西就是元素的第一个有position,且positon不能为static的祖先元素,是不是有点拗口,换个说法吧,就是这个小鬼(element)的定位可以是他的老爸,他的爷爷,他的太公....(祖先要素)中而且第一个是是有钱的(position:absolute)或者是当官的(position:relative),就是不能是个程序猿(position:static 或者没有设position)的。而且值得注意的是position:absolute这个属性是脱离文档流的,所以重新定位后元素是不会占着原来的位置的

还是跟着程序来吧- -

  <div style=" border:1px solid Red; padding:10px; width: 340px; height: 400px"">
红色:太公
<div style="border:1px solid Green; padding:10px; width: 320px; height: 360px"">
绿色:爷爷
<div style="border:1px solid Yellow; padding:10px; width: 300px; height: 320px; ">
黄色:老爸
<div style="width: 100px; height: 100px;">
div1</div>
<div style="width: 100px; height: 100px;">
div2</div>
<div style="width: 100px; height: 100px;">
div3</div>
</div>
</div>
</div>

效果如下:首先给div1 div2 div3三个祖先div 黄色的老爸, 绿色的爷爷, 红色的太公,暂时对他们都不设position属性

好吧,现在给老爸div设position:relative(哟!当官的)给div2设position:absolute;left:120px; top:100px;

    <div style=" border:1px solid Red; padding:10px; width: 340px; height: 400px"">
红色:太公
<div style="border:1px solid Green; padding:10px; width: 320px; height: 360px"">
绿色:爷爷
<div style="border:1px solid Yellow; padding:10px; width: 300px; height: 320px; position:relative;">
黄色:老爸
<div style="width: 100px; height: 100px;">
div1</div>
<div style="width: 100px; height: 100px; position:absolute; left:120px; top:100px;">
div2</div>
<div style="width: 100px; height: 100px;">
div3</div>
</div>
</div>
</div>

效果如下:可以从蓝色线看出,div2以黄色(ide的蓝线和黄色混在一起变色了)div为参照距离老爸左边120px 上边100px而且有于position:absolute是脱离文档流的所以div2原来的位置不能保留div3向上填充

我们再用他爷爷来试试

<div style=" border:1px solid Red; padding:10px; width: 340px; height: 400px">
红色:太公
<div style="border:1px solid Green; padding:10px; width: 320px; height: 360px; position:relative;">
绿色:爷爷
<div style="border:1px solid Yellow; padding:10px; width: 300px; height: 320px; ">
黄色:老爸
<div style="width: 100px; height: 100px;">
div1</div>
<div style="width: 100px; height: 100px; position:absolute; left:120px; top:100px;">
div2</div>
<div style="width: 100px; height: 100px;">
div3</div>
</div>
</div>
</div>

效果如下:还是div2还是 position:absolute;left:120px;top:100px,可以冲蓝色线看出这次是以绿色爷爷为参照物做绝对定位的,而且div2同样脱离了文档流

至于他太公,一把年纪了,我们就放过他吧- -

先到这把,在下愚见,如有错误请及时指出。有空再总结下margin布局和float布局

copyright © Tim demo下载

同时感谢这三篇文章

http://apps.hi.baidu.com/share/detail/2284634

http://hi.baidu.com/lileding/item/ae30c31e43c09bfe86ad4e30

http://wenku.baidu.com/view/477959140b4e767f5acfce32.html

css绝对定位、相对定位和文档流的那些事的更多相关文章

  1. CSS布局之脱离文档流详解——浮动、绝对定位脱离文档流的区别

    1.代码 (1)示例代码1 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=& ...

  2. CSS和文档流

    1.  CSS的定位机制有3种:普通流.浮动和定位. 2.  文档流:从上到下,从左到右,一个挨一个的简单或者叫正常布局. 3.  定位:(position) Static:保持文档流. Relati ...

  3. html/css 关于脱离文档流的几种情况

    所谓的文档流 顾名思义就是按照顺序流下来,指的是html元素从上往下 从左往右的流式排列, 比如说写了5个Div,正常的文档流是依次显示这5个div块: 脱离文档流就是指它所显示的位置和文档代码就不一 ...

  4. 浅谈,html\css脱离标准文档流相关

    (个人知识有限,难免有误,请见谅) 标准文档流,顾名思义,是要按照一定规矩排列的,默认的就是元素会从左至右,从上至下排列,块级会独占一行,行内元素会和小伙伴们共享一行. 本来在标准文档流下,各个元素相 ...

  5. CSS中脱离文档流是什么意思?

    如果一个元素脱离文档流了,是不是只是显示上脱离而已?在html中是否也会脱离?我用js取这个元素的父节点的childNodes还能否取到这个元素:同时,这个元素的parentNode还是不是html中 ...

  6. css布局与文档流的关系之float(浮动)

    所谓文档流,指元素在排版布局的过程中,元素会自动从左到右,从上到下的流式排列.脱离文档流呢,就是元素打乱了这个排列,或是从排版中拿走. 说到文档流呢,我们先来说一下元素,每个元素呢,都有display ...

  7. css 盒模型 文档流 几种清除浮动的方法

    盒模型 1.box-sizing: content-box 是普通的默认的一种盒子表现模式 盒子大小为 width + padding + border   content-box:此值为其默认值,其 ...

  8. IE文档版本和文档流模式

    使用X-UA-Compatible来设置IE浏览器兼容模式 文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. < ...

  9. css盒子模型、文档流、相对与绝对定位、浮动与清除模型

    一.CSS中的盒子模型 标准模式和混杂模式(IE).在标准模式下浏览器按照规范呈现页面:在混杂模式下,页面以一种比较宽松的向后兼容的方式显示.混杂模式通常模拟老式浏览器的行为以防止老站点无法工作. h ...

随机推荐

  1. 用了 CSDN 的 markdown 编辑器吐槽下~~

    吐槽一下.. . 第一次用 CSDN 的这个 markdown 编辑器,首先感官上看起来还是非常大气相比曾经那个 HTML 编辑器实在时上了N个档次,但实际使用的体验实在是比較糟糕的.希望能改进下哦: ...

  2. 使用 Camtasia Recorder显示 “ camtasia an error occurred in the recorder: video codec open failed ”

    这是因为本机没有codec的缘故,可以下载一个:tscc解码器(TechSmith Screen Capture Codec) 2.0.3.0 安装版 http://www.cngr.cn/dir/2 ...

  3. dojo.declare

    参考:http://www.ibm.com/developerworks/cn/web/1203_xiejj_dojodeclare/

  4. Spring 注入数据源

    一.在项目中添加dataSource所用到的包 dbcp数据源所需包:     commons-dbcp.jar     commons-pool.jar C3P0数据源所需包:     c3p0-0 ...

  5. LInux系统及其文件系统

    Linux系统:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协 ...

  6. 写一个Windows上的守护进程(1)开篇

    写一个Windows上的守护进程(1)开篇 最近由于工作需要,要写一个守护进程,主要就是要在被守护进程挂了的时候再把它启起来.说起来这个功能是比较简单的,但是我前一阵子写了好多现在回头看起来比较糟糕的 ...

  7. Hadoop学习之常用命令

    HADOOP基本操作命令 在这篇文章中,我们默认认为Hadoop环境已经由运维人员配置好直接可以使用. 假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与 ...

  8. 2015.4.10-C#入门基础(三)

    今天,我们聊一聊一些基本问题: 1.修饰符有哪些?有什么区别呢? 首先大家想到的应该是 public:特点是所属类的成员和非所属类的成员都可以访问 private:只有所属类的成员才可以访问 prot ...

  9. win7使用右键导致死机、假死、explorer无法响应的解决方法

    右键引起explorer无法响应,奔溃,主要是由于COMCTL32.DLL和COMCTL21.OCX文件引起的 描述:comctl32.dll是Windows应用程序公用GUI图形用户界面模块.报告提 ...

  10. Android PorterDuff.Mode

    1.PorterDuff.Mode.CLEAR所绘制不会提交到画布上. 2.PorterDuff.Mode.SRC显示上层绘制图片 3.PorterDuff.Mode.DST显示下层绘制图片 4.Po ...