辨析relative与absolute
谈起它们,想必大家都不陌生。relative,相对定位嘛;absolute,绝对定位嘛。但是它们到底是个啥东东呢?
看看w3c的定义,见下表
定位 |
含义 |
relative |
元素框偏移某个距离。元素仍保持其未定位前的形状,它原本所占的空间仍保留。 |
absolute |
元素框从文档流完全删除,并相对于其包含块定位。包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。 |
我靠,说了这一啪啦,好像有点模糊啊。
不用怕,团结就是力量,让我们一起,一步一步来解析它们吧。
一、relative |
针对上面w3c对relative的定义,我们首先来写个demo。
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.ourRelative {
border:1px solid #FF0000;
position:relative;
left:-10px;
}
</style>
</head>
<body>
I'm <span class="ourRelative">relative</span>,I'm over!
</body>
</html>
效果图如下:
结合代码,不知道大家发没发现我将”relative”通过设置它的定位后,向左移动了10像素,但是呢?它居然右边空出来的空间,没有被右边的” ,I’m over! ”挤过来。说明什么?
1、 相对定位后的元素仍然是在普通流中的;
2、 相对定位后的元素通过left,right,top, bottom属性,相对它原有的位置,进行相对偏移的;
3、 相对定位后的元素发生偏移后,它原来所占的空间仍然保留。
在上述代码中,不知道大家注意没有,我用的是<span>这个元素包裹文本‘relative’的哦,<span>乃行内元素,那有说明什么了呢?
猜测:position:relative不会改变元素的display。
是不是这样,我们在写个demo就湿了。
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.ourRelative {
/*将宽高设置为100px*/
width:100px;
height:100px;
border:1px solid #FF0000;
position:relative;
left:-10px;
}
</style>
</head>
<body>
I'm <span class="ourRelative">relative</span>,I'm over!
</body>
</html>
我将上述代码中添加了span元素的宽高,但是表现出来的还是行内元素的效果。
不服?
我再将上述代码改改,将span的display改成了inline-block,宽高任然设置为100像素,那么它表现出来的,也就是这样咯。
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.ourRelative {
/*将元素的span变为inline-block*/
display:inline-block;
width:100px;
height:100px;
border:1px solid #FF0000;
position:relative;
left:-10px;
}
</style>
</head>
<body>
I'm <span class="ourRelative">relative</span>,I'm over!
</body>
</html>
说明position:relative是不会改变元素的display的哦。
二、absolute |
针对上面w3c对absolute的定义,我们也来写个demo。不过就是将图一中的<span>改为绝对定位,position:absolute。
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.ourRelative {
border:1px solid #FF0000;
/*将position改为absolute*/
position:absolute;
left:-10px;
}
</style>
</head>
<body>
I'm <span class="ourRelative">relative</span>,I'm over!
</body>
</html>
我靠,这是什么玩意。怎么会这样。稳住,我们拿标尺量一量,看看发生了什么。见下图:
图一
图二
图一为整个span元素的宽度,可以看出是80像素;图二为绝对定位后的裸露在页面的span元素的宽度,可以看出是70像素。
所以绝对定位,在这里是按着body的左上角进行的定位。
Why?
因为绝对定位是使用left,right,top, bottom属性相对于其最接近的一个最有定位设置的父级对象进行绝对定位,如果对象的父级没有设置定位属性,即还是遵循HTML定位规则的,则依据 body 对象左上角作为参考进行定位。
在这里因为就一个span元素嘛,它的父级元素就是body咯。所以才会呈现出这图案咯。
而且正如w3c所说的那样,绝对定位是脱离文档流的,所以绝对定位元素的右边文本” ,I’m over! ”就会当它不在了,占用它的位置。
咦,相对定位不会改变元素的display,那么绝对定位呢?
绝对定位是会改变元素的display的哦。将其统一变成block,块级元素的模式。
不信?那么我们一起将上述绝对定位的代码改进改进,给 span元素宽高各设100像素。
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.ourRelative {
border:1px solid #FF0000;
/*将position改为absolute*/
position:absolute;
/*为absolute添加width和height*/
width:100px;
height:100px;
left:-10px;
}
</style>
</head>
<body>
I'm <span class="ourRelative">relative</span>,I'm over!
</body>
</html>
效果图见下:
我靠,看来绝对定位是比较屌,直接改变了元素的display,将其统一变为了block。
小节:
1、 绝对定位后的元素,脱离了文档流了,原来所占的空间也随之不在;
2、 绝对定位后的元素,通过left,right,top, bottom属性,相对于其最接近的一个最有定位设置的父级对象进行绝对定位,如果对象的父级没有设置定位属性,即还是遵循HTML定位规则的,则依据 body 对象左上角作为参考进行定位;
3、 绝对定位后的元素,将改变元素的display为block。
另:
不管将元素设置为相对定位还是绝对定位,它们都将覆盖住其他的元素内容,什么意思呢?
以position:absolute为例
<!DOCTYPE html>
<head>
<title>ttt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style>
* {
margin:0;
padding:0;
}
.normal {
width:100px;
height:100px;
background:#FFC0CB;
}
.ourAbsolute {
width:70px;
height:70px;
position:absolute;
background:#008000;
left:0;
top:0;
}
</style>
</head>
<body>
<div class="normal"></div>
<div class="ourAbsolute"></div>
</body>
</html>
请见下图
我将绿色框设置的是绝对定位且top、left皆为0,那么它以body为起点,将覆盖粉红色的框。如果我想让粉红色的框,覆盖住绝对定位的绿色框呢?很简单,将绝对定位的z-index设置为0就欧克啦。
相对定位请自行修改代码,测试哦。
辨析relative与absolute的更多相关文章
- 关于relative和absolute的总结
对于定位这个性质我原理上来说自己是明白的,但是在实践的过程中,总会出现各种稀奇古怪的情况,加relative或是absolute就可以解决,但是遇到这些情况总是不明白为什么!!!难道是脑容量太小的原因 ...
- relative 和 absolute
relative总是相对于其最近的父层 absolute总是相对于其最近的定义为relative或absolute的父层
- position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别?
position中多次用到了relative和absolute,能不能具体介绍一下这两者的区别? 一个是相对定位,一个是绝对定位. absolute生成绝对定位的元素,相对于 static 定位以外的 ...
- relative和absolute的效果
我对这样几个效果不是特别理解: 1.float的效果: 就是搞不清楚我想要什么效果的时候可以将某个标签设置为float,一直没总结出什么规律. 2.relative和absolute的效果: 也是不清 ...
- [转]关于position 的 static、relative、absolute、fixed、inherit
本文转自:http://www.56770.com/faq/list/?id=410 position 有五个值:static.relative.absolute.fixed.inherit. sta ...
- relative、absolute和float
relative.absolute和float position:relative和position:absolute都可以改变元素在文档中的位置,都能激活元素的left.top.right.bo ...
- position relative和absolute区别
看这个博客 说的很详细http://blog.sina.com.cn/s/blog_647a022e0101b2gn.html 总的来说 这两个属性都是通过增加left和right偏离原来的位置 但 ...
- 细谈position属性:static、fixed、relative与absolute
学习WEB有些时日了,对DOM中的定位概念有些模糊,特地花了一个下午的时间搜资料.整理写下这篇随笔. 首先,我们要清楚一个概念:文档流. 简单的讲,就是窗体自上而下分成一行一行,并在每行中按照从左到右 ...
- relative 和 absolute 定位关系
问题: relative 和 absolute 之间的关系是什么?有什么区别? 那,答案呢? relative 相对定位, 以自己没有设置relative 属性之前的位置来定位,占用没有设置rela ...
随机推荐
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
- Smart3D系列教程3之 《论照片三维重建中Smart3D几个工作模块的功能意义》
[摘要] 近年来,倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术,利用照片进行三维重建成为一项关键性的技术.Smart3D软件,是照片三维重建主流软件之一,本文将就Smart3D建模软件 ...
- 【noip 2005】 采药
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:" ...
- Shell下突破安全狗远程桌面守护
首先在Shell下把安全狗的安装配置给下来 默认安装路径: C:\Program Files\SafedogServer\SafeDogGuardCenter 找到 ProGuardData.ini ...
- java并发编程(十三)经典问题生产者消费者问题
生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 这里实现如下情况的生产--消费模型: 生产者不断交替地生产两组数据&q ...
- MyEclipse新建web project和navicat110_mysql_en工具
首先注意几点: 1.eclipse web项目:项目名称不得超过五个字符,要求全部小写,不管变量名.类名.函数名.文件名,在没有特殊理由的时候,不要用下划线,同时表名和类名用两个单词,尽量不要用Stu ...
- Ruby 里的 %Q, %q, %W, %w, %x, %r, %s, %i (译)转
原文地址 转自 %Q 用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") >> %Q(Joe said: ...
- org.apache.jasper.JasperException:省略"/html/sysmaintain/authority/user/../../module/verify_login.jsp" not found
说明了JSP页面里引用安全登录页面的jsp路径代码:<%@ include file="../../module/verify_login.jsp"%>这句代码引用的路 ...
- [译] 给PHP开发者的PHP源码-第一部分-源码结构
文章来自:http://www.hoohack.me/2016/02/04/phps-source-code-for-php-developers-ch 原文:http://blog.ircmaxel ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...