position:absolute绝对定位解读
position:absolute绝对定位解读
摘要
用四段代码解释absolute的定位问题,进而从概念的角度切实解决html布局问题。
一、背景
常常遇到这样一些问题,很容易混淆。“浏览器屏幕”,html,body谁的范围大?如果一个html文档中没有relative元素,那么该absolute元素是相对于哪里进行定位的?左上角?浏览器?html?body?等等类似的问题,只要涉及到定位就总要花一些时间去调试。本文的目的在于当遇到问题时,能够以文中阐述的观点作为依据,快速定位和解决问题。
二、概念及原理
1、web页面最外层的约束为body,就是浏览器面板能看到的部分。
2、body即可理解为文档流,从上到下,从左向右。
3、文档流超过了浏览器面板(可视区域),就会出现滚动条。
4、absolute的定制,就会将元素脱离文档流,不占据文档流,元素将不出现在文档流中,当浏览器渲染时,不会出现滚动条。
5、在文档流“流动”时,浏览器屏幕(范围),会在文档流中截出一块区域。可以简记为“第一屏”。
6、当没有定制relative时,absolute(元素无论大小)即以此定位。
三、现象及解析
body文档流并非就是元素内容所占据的空间,它就像一段河流,元素是在其上的物体。这是为了解释当元素内容少于一屏幕时,body的边界线在哪里,答案是仍然是一个屏幕扣出的一圈边界线。
1、元素小于屏幕高度
在上述原理的基础上,可以很好的解释如下几种现象。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "keyword" content = "liao">
<meta name = "description" content = "lllll">
<title>^ <> ^</title>
<style>
body{
margin:0;
}
.c0{
background-color:red;
height:300px;
}
.c0 .cell{
background-color:blue;
position:absolute;
bottom:10px;
right:10px;
}
</style>
</head>
<body>
<div class="c0">aaa
<div class="cell">bbb</div>
</div>
</body>
</html>
小蓝盒子处于屏幕的右下角。证明在元素内容少于一屏幕时,absolute盒子按照body的屏幕边界线摆放。
2、元素大于屏幕高度
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "keyword" content = "liao">
<meta name = "description" content = "lllll">
<title>^ <> ^</title>
<style>
body{
margin:0;
}
.c0{
background-color:red;
height:3000px;
}
.c0 .cell{
background-color:blue;
position:absolute;
bottom:10px;
right:10px;
}
</style>
</head>
<body>
<div class="c0">aaa
<div class="cell">bbb</div>
</div>
</body>
</html>
这次尝试可以用前面原理合理的解释。即absolute盒子按照body的屏幕边界线摆放。因为滚动条移动时,框出的边界线向上移动了,所以小蓝盒子也随之移动。
3、哪里是absolute的参考线
用下面的例子再次证明哪里是absolute的参考线。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "keyword" content = "liao">
<meta name = "description" content = "lllll">
<title>^ <> ^</title>
<style>
body{
margin:0;
}
.pghead{
background-color:blue; height:50px;
color:white;
} .pgbody .menu{
position:absolute;
background-color:yellow;
left:0; width:180px;
color:white ;
} .pgbody .rtbody{
position:absolute;
background-color:pink;
top:50px;
bottom:20px; left:185px;
right:0;
color:black;
}
</style>
</head>
<body>
<div class="pghead">HHH
</div>
<div class="pgbody">
<div class="menu">
<h1>0123</h1><h1>123</h1><h1>123</h1><h1>123</h>
</div>
<div class="rtbody">
<h1>0123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1>
</div>
</div>
</body>
</html>
范例中,因为文字属于特殊的元素,当设定盒子absolute,bottom为10px时,原来被文字撑起的盒子只能到第一屏的边界线向上10px的位置,所以文字超出了盒子的范围,也超出了浏览器屏幕的范围,于是出现滚动条。而并不是像一些观点认为背景色会布满整个文档流,一直到距离最底部10px的位置。
下面的例子,使用了overflow:auto,并且absolute盒子,四面都定制了到body的边距。正是因为absolute以第一次浏览器框出body的边界线为基准,才能呈现出多于浏览器屏幕的内容辅助滚动条在一屏幕内显示的效果。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "keyword" content = "liao">
<meta name = "description" content = "lllll">
<title>^ <> ^</title>
<style>
body{
margin:0;
}
.pghead{
background-color:blue; height:50px;
color:white;
} .pgbody .menu{
position:absolute;
background-color:yellow;
left:0; width:180px;
color:white ;
} .pgbody .rtbody{
position:absolute;
background-color:pink;
top:50px;
bottom:20px;
overflow:auto;
left:185px;
right:0;
color:black;
}
</style>
</head>
<body>
<div class="pghead">HHH
</div>
<div class="pgbody">
<div class="menu">
<h1>0123</h1><h1>123</h1><h1>123</h1><h1>123</h>
</div>
<div class="rtbody">
<h1>0123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1><h1>123</h1>
</div>
</div>
</body>
</html>
4、图片的基准线
图片的基准线依然是上文说到的第一次浏览器框出body的边界线。请看下面的例子。
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "keyword" content = "liao">
<meta name = "description" content = "lllll">
<title>^ <> ^</title>
<style>
body{
margin:0;
} .c0{
background-color:blue;
position:absolute;
bottom:10px;
right:10px;
}
</style>
</head>
<body>
<div class="c0">
<img src="zhuomian.jpg" style = "width:3000px;height:3000px;">
<div class="cell">bbb</div>
</div>
</body>
</html>
四、小结
本次验证基于几种常见的网页元素如不同大小的盒子,图片等。最终得出absolute以body的最开始的浏览器边界线为基准的结论。
总结两种验证方法。方法一:1)先将常见的元素列出,2)将各种元素常见的状态列出,然后一一做实验验证。3)最后得出归一化的共性的结论。
方法二:1)先根据一到两个现象猜测出基本原理,2)然后根据原理推想出其他元素的结果,若符合预期则说明猜想的原理正确,3)最后归纳得出结论。
position:absolute绝对定位解读的更多相关文章
- position: absolute;绝对定位水平居中问题
position: absolute;绝对定位水平居中问题 用CSS让元素居中显示并不是件很简单的事情—同样的合法CSS居中设置在不同浏览器中的表现行为却各有千秋.让我们先来看一下CSS中常见的几种让 ...
- position absolute 绝对定位 设置问题
今天在做布局的时候,用到了绝对定位, 父级元素相对定位,子元素两个,一个元素正常文档流布局并且在前面,另一个元素绝对定位排在后面,但设置了好久,绝对定位的子元素都不会覆盖其上面的兄弟元素,最后,不知 ...
- 浅谈position: absolute和position:relative
一.在此先说一下文档流的概念: 1,文档流定义: 百度百科定义:文档流是文档中可显示对象在排列时所占用的位置. 大多网友的理解:元素的位置由元素在 (X)HTML 中的位置决定.将窗体自上而下分成一行 ...
- 通过案例理解position:relative和position:absolute
w3school过了HTML的知识之后,觉得要自己单纯地去啃知识点有点枯燥,然后自己也很容易忘记,所以便找具体的网站练手便补上不懂的知识点.position:relative和postion:abso ...
- CSS--position:relative和position:absolute
position:relative相对定位 1. 如何定位?每个元素在页面的普通流中会“占有”一个位置,这个位置可以理解为默认值,而相对定位就是将元素偏离元素的默认位置,但普通流中依然保持着原有的默认 ...
- 解决绝对定位div position: absolute 后面的<a> Link不能点击
今天布局的时候,遇到一个bug,当DIV设置为绝对定位时,这个div后面的相对定位的层里面的<a>Link标签无法点击. 网上的解决方案是在绝对定位层里面添加:pointer-events ...
- position之fixed固定定位、absolute绝对定位和relative相对定位
什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...
- CSS绝对定位和相对定位 position: absolute/relative
absolute(绝对定位): 会把对象拖离HTML文档流,并通过top, left, right, bottom确定对象的具体位置,这个四个位置属性至少要设置一个,否则无法激活对象的absolute ...
- 【CSS3】---层模型position之fixed固定定位、absolute绝对定位和relative相对定位
什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...
随机推荐
- CM给hive添加自定义jar包
使用的是cloudera manager管理的集群: hive添加自定义jar包 服务端:高级:Hive 辅助 JAR 目录 设置的的路径是影响所有服务端的设置,比如hue中使用到了hive查询编辑器 ...
- AX 2012 中代码控制用户可查询哪些公司的数据
关联table:UserDataAreaFilter, parm:dataareaid parm2:userid
- (转)C#调用默认浏览器打开网页的几种方法
转载,原文地址:http://blog.csdn.net/testcs_dn/article/details/42246969 CSharp调用默认浏览器打开网页的几种方法 示例界面: 方法一:从注册 ...
- JSON http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html
js: JSON.stringify(idinfo)//将对象转化为 JSON串 //查询后为将json串赋值给表单 function _form1_load() { AOS.a ...
- linux svn 提交文件时强制填写备注
很多程序员不爱写注释,特别是svn提交的时候,文件做了什么修改都没有一个简单的备注,往往都是直接提交,这样是非常不利于团队开发的.所以就有了svn提交的时候,强制修改文件的备注. 步骤如下: 1.先找 ...
- 从头开始学算法--NUM operation in MIX
从前往后,按照课本顺序刚刚看到MIX这部分.NUM是一个转换操作符,可以把字符编码转换为数字.它把registerA & registerX的值转换为数字并赋值给registerA.转换过程是 ...
- 不安装Oracle客户端情况下使用PL/SQL 远程连接数据库
附送PL/SQL Developer11中文版下载地址 1.先到Oracle网站下载Instant Client : http://www.oracle.com/technetwork/databas ...
- LR12.53—第3课:重播Vuser脚本
第3课:重播Vuser脚本 在前面的教训,你记录了一组典型的用户行为,并准备重播脚本. 重播脚本之前,您可以配置脚本的运行时设置,它定义了Vuser的行为. 注:记录与基于Web的协议的地方WebTo ...
- 前端mvc框架backbone.js入门[转]
原文地址:http://www.cnblogs.com/zhjh256/p/6083618.html 关于backbone.js的优缺点,这里就不详谈了,网上关于这方面的讨论很多了,而且各种框架之所以 ...
- linux系统的常用命令
linux系统中常用的命令如下(以后经常补充): cd .. 返回上一级 cd use 进入use目录