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中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...
随机推荐
- STM32F407第一步之点亮LED
STM32F407第一步之点亮LED. 要点亮LED,首先了解一下F4的GPIO模块.首先看一下STM32F4数据手册,GPIO模块的内部结构图 看上去有点复杂,不要怕,慢慢理解就可以了.对外引脚那里 ...
- vim学习
vim编辑器的工作模式分为3种 1.Command Mode 命令模式 2.Insert Mode 插入模式 3.Lastline Mode 底行模式 vim 打开文件时处于命令模式,i 可以切换到插 ...
- CacheManager COUNTER
CacheClient.AddOrUpdate("COUNTER", 0, v => Convert.ToInt32(v) + 1);
- 转(Response.WriteFile 无法下载大文件解决方法)
以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ...
- Shogun网站上的关于主流机器学习工具包的比较
Shogun网站上的关于主流机器学习工具包的比较: http://www.shogun-toolbox.org/page/features/ created last updated main l ...
- ldap实现用户认证
LDAP的用户认证类. public class LDAPHelper { private DirectoryEntry _objDirectoryEntry; /// <summary> ...
- 批量Clip
没有建立对应dataset,直接生成featureclass,主要是工作中没几个dataset. # -*- coding: utf-8 -*-__author__ = 'tanshuai' impo ...
- SVN外链
1 外链使用场景 使用Subversion进行版本管理时,有时需要将一些公共库或者开源库链接到自己项目中,为了同时做到与外部库实时更新,使用Subversion的外链功能,从而将外部的库当做本地项目的 ...
- 你还记得windows workflow foundation吗
很多年前,windows workflow foundation还叫WWF,而直译过来的名称让很多人以为它就是用来开发工作流或者干脆就是审批流的. 博主当年还是个懵懂的少年,却也知道微软不会大力推一个 ...
- 怎么在win7的64位旗舰版上配置coocs2d-x 3.2的android环境并且打包APK
我这用的操作系统是64位win7旗舰版打包成功. 希望有急用的能看到这篇文章,毕竟大家都是从菜鸟到大神的. 也以此证明自己的成长历程. 需要的东西有: 1.JAVA-JDK 2.Python 2.7. ...