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中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...
 
随机推荐
- 解决VML遭遇IE8和XHTML DOCTYPE时不能运行的问题(转)
			
原文网址:http://blog.csdn.net/cuixiping/article/details/4227283 以下代码在IE运行正常 <!DOCTYPE HTML PUBLIC &q ...
 - 【cocos2d-js官方文档】一、搭建 Cocos2d-JS 开发环境
			
http://blog.csdn.net/qinning199/article/details/40395085
 - chrome livestyle插件
			
1.sublime 安装 >step1: ctrl+shift+p >step2:ip >step3:livestyle >step4:配置ho ...
 - 优化servlet
			
在最开始的时候我们写一个servlet(LoginServlet)对应一个请求(Login.jsp),这样的话就会产生很多的servlet,使其以后维护变得麻烦,所以我们可以考虑将同一类型(Login ...
 - js中join函数的使用方法(js输出html标签)
			
var arr = ['item 1', 'item 2', 'item 3', ...]; var list = '<ul><li>' + arr.join('</li ...
 - JS中offsetTop、clientTop、scrollTop、offsetTop各属性介绍
			
这里是javascript中制作滚动代码的常用属性 页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见 ...
 - 8、SQL Server 表分区
			
什么是表分区?表分区其实就是将一个大表分成若干个小表.表分区可以从物理上将一个大表分成几个小表,但是逻辑上还是一个表.所以当执行插入.更新等操作的时候,不需要我们去判断应该插入或更新到哪个表中.只需要 ...
 - lua学习笔记(一)
			
lua是一种嵌入式的语言,首先安装. lua安装依赖于readline库,下载readline tar -zxvf readline-6.2.tar.gz cd readline-6.2 ./conf ...
 - pdo 整套类的封装,保存修改查询
			
<?php /** * */ class Db{ private $host = ''; private $port = ''; private $user = ''; private $pas ...
 - [JS]Ext最新GPL版
			
https://www.sencha.com/legal/gpl/ Sencha Ext JS.Sencha Touch.Sencha GXT http://cdn.sencha.com/ext/gp ...