CSS定位是CSS布局只可以重要的一环。本篇文章带你解读定位属性,可让你更加深刻的理解定位带来的一些特性,熟练使用CSS布局。css
将窗体自上而下分红一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。
每一个非浮动块级元素都独占一行, 浮动元素则按规定浮在行的一端。 若当前行容不下, 则另起新行再浮动。
内联元素也不会独占一行。 几乎全部元素(包括块级,内联和列表元素)都可生成子行, 用于摆放子元素。
有三种状况将使得元素脱离文档流而存在,分别是 浮动,绝对定位, 固定定位。 可是在IE6中浮动元素也存在于文档流中。html
如上图所示,这就是正常的文档流布局。一个一个挨着的,到头了,另起一行,接着排布。segmentfault
(1)相对定位:相对定位的元素是在文档中的正常位置偏移给定的值,可是不影响其余元素的偏移。相对定位的元素并未脱离文档流。
(2)绝对定位:绝对定位的元素则脱离了文档流。在布置文档流中其它元素时,绝对定位元素不占据空间。绝对定位元素相对于最近的非static祖先元素定位。当这样的祖先元素不存在时,则相对于根级容器定位。
(3)固定定位:固定定位与绝对定位类似,也脱离了文档流,但元素的包含块为viewport视口。该定位方式经常使用于建立在滚动屏幕时仍固定在相同位置的元素。
(4)默认定位:文档中按照正常顺序出现的定位。浏览器
position:relative 布局
什么是相对定位?相对什么定位?这是重要的问题。个人回答是——相对本身文档流中的原始位置定位。它的特色是——不会脱离文档流。
也就是说,使用position:relative定位,其元素依旧在文档流中,他的位置可使用left、right、top、bottom、z-index等定位参数,可是,它的存在,仍是会影响文档中紧跟在他周围的元素的。
下面,咱们看一下实际效果。spa
如上图的演示,我给test3加上了position:relative定位效果。
代码以下:3d
position: relative; left: -20px; top: 20px;
能够清晰的从图上看出来,test3根据CSS参数left: -20px;top: 20px;发生了位移。
可是!可是!可是!重要的事情说三遍,它的位移并无对周围的元素有任何的影响!!它依然存在于文档流中。它的位移是根据它在文档流中的原始位置发生的!!这一点很是很是重要。code
position:fixed htm
相比而言,这个参数是最好理解的。它相对于浏览器的窗口进行定位。同时——它会脱离文档流。blog
代码以下:
position: fixed; right:20px; top: 20px;
这是初始状态,咱们能够看到它的特色:
它脱离了文档流,原来文档流中不存在它的位置,test4好像test3不存在同样的紧贴在了test2的后面。它的right:20px;top: 20px;参数是相对浏览器窗口定位的。
好,咱们再来看一下,当页面发生滚动的效果图:
当页面发生了滚动,咱们能够看到,页面的内容已经根据滚动条的位置发生了位移。可是咱们的test3 依旧是在相对于浏览器的位置。
position:absolute
绝对定位是一个很是牛逼的属性,牛逼到,你不知道会发生什么。注意,它的解释是什么——“生成绝对定位的元素,相对于 static 定位之外的第一个父元素进行定位。”
也就是说,它能够相对于各类各样的东西进行定位。除了 static 其余均可以!!!注意!注意!注意! 是除了 !
也正是由于这一牛逼特性,致使不少人对此概念混乱。其实,这个一点也不混乱,咱们能够将概念理顺了,分红几个状况来讲。
PS:position:absolute和position:fixed同样是会脱离文档流的。这里就不解释脱离文档流的问题,主要研究它的定位问题。
(1)它的全部父元素的属性都是 position:static
怎么理解这个标题?position:static 是全部html元素默认参数。就是说,这个元素的全部上级元素,你都没有使用过定位方式。
咱们经过以下代码模拟一个场景:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div {font-size: 15px;color: #fff;} .test1 {width: 500px;height: 500px;background: #123;} .test2 {width: 400px;height: 400px;background: #234;} .test3 {width: 300px;height: 300px;background: #345;position: absolute;right: 20px;top: 20px;} </style> </head> <body> <div class="test1"> test1 <div class="test2"> test2 <div class="test3">test3</div> </div> </div> </body> </html>
如上,test3是test2的子元素,test1的孙元素。咱们来看一下效果图:
如上图所示。咱们能够看到,test3既没有相对于父元素定位,也没有相对于爷元素定位。它竟然和position:fixed同样!相对于浏览器定位了!!
!!!这是一个错觉!!!
咱们来看一下浏览器发生滚动以后的效果,以下图所示:
如上图所示,它并不是是相对于浏览器定位,而是相对于文档定位。
若是你有一点js基础的话,那么应该很容易理解。$(document)和$(window)的差异(为了看得清楚,用了JQ写法)
相对于文档,就是相对于整个页面来进行布局,而相对于窗口,则是相对于浏览器的可视区域进行定位,这两者有本质的区别的。
这种状况在实际应用中有,可是很少。
(2)它的父元素的属性是 position:relative
上面,咱们已经说过了,position:relative是相对于自身原始位置定位,其自身并无脱离文档流。而它的子元素,使用position:absolute参数是什么效果呢?咱们来作个试验。下面是代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div {font-size: 15px;color: #fff;} .test1 {width: 500px;height: 500px;background: #123;} .test2 {width: 400px;height: 400px;background: #234;position: relative;left: 50px;top: 50px;} .test3 {width: 300px;height: 300px;background: #345;position: absolute;right: -20px;top: -20px;} </style> </head> <body> <div class="test1"> test1 <div class="test2"> test2 <div class="test3">test3</div> </div> </div> </body> </html>
咱们给test2加上了position:relative属性,并给出了偏移值,而后,再给test3使用绝对定位,使用了为负数的偏移值,咱们来看一下效果图,以下:
从上图咱们能够看到,test2如咱们所愿的,相对于自身的位置发生了偏移,而test3则相对于test2发生了偏移。
从这个试验咱们能够看出,当一个元素设置了position:absolute属性以后,而它的父元素的属性为position:relative则,它再也不是相对于文档定位,而是相对于父元素定位。
这一点很是重要。最最重要的是--父元素设置为position:relative并不会脱离文档流,也就是说——利用给父元素设置position:relative属性,再将子元素设置为position:absolute就能够在文档流中实现须要的定位。这一点异常重要,也是很是经常使用的方法!(PS:基本上焦点图等常见应用,都是使用了这种方式)。
(3)它的父元素的属性是 position:fixed
上面,咱们说了父元素为position:relative的状况,这种状况比较常见,那么它的父元素为position:fixed 又是什么状况呢?若是你聪明的话,应该有了答案。咱们来作一个试验,来印证一下你的想法。代码以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div {font-size: 15px;color: #fff;} .test1 {width: 500px;height: 500px;background: #123;} .test2 {width: 400px;height: 400px;background: #234;position: fixed;right: 20px;top: 20px;} .test3 {width: 300px;height: 300px;background: #345;position: absolute;left: -40px;top: 40px;} </style> </head> <body> <div class="test1"> test1 <div class="test2"> test2 <div class="test3">test3</div> </div> </div> </body> </html>
好,咱们能够看到我给test2加上了position: fixed;right: 20px;top: 20px; 它会相对于浏览器窗口定位,而test3做为test2的子元素,咱们加上了position: absolute;left: -40px;top: 40px;那么,根据咱们的想象,它应该相对于test2做出偏移。那么是否是这个状况呢?咱们来看一下效果图:
如上图所示,看到了具体的效果了吧!是否是和你想象的是同样的呢?
(4)它的父元素的属性是 position:absolute
好,咱们来看一下,若是position:absolute嵌套position:absolute元素将会出现什么状况呢?
写了这么多,其实你应该有了必定的预见性了吧?好,咱们来作试验,代码以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> div {font-size: 15px;color: #fff;} .test1 {width: 500px;height: 500px;background: #123;} .test2 {width: 400px;height: 400px;background: #234;position: absolute;right: 20px;top: 20px;} .test3 {width: 300px;height: 300px;background: #345;position: absolute;right: 20px;top: 20px;} </style> </head> <body> <div class="test1"> test1 <div class="test2"> test2 <div class="test3">test3</div> </div> </div> </body> </html>
如上所示,test2咱们使用了position: absolute;right: 20px;top: 20px;参数,那么,它会相对于文档做出设定的偏移值。而咱们给test3使用了一样的css样式。若是test3也是相对于文档定位的话,那么它和test2应该是重叠的。
可是,咱们根据上面的解释,test3应该相对于test2定位才对,那么是否是呢?咱们看效果
如上图所示,果真,test2相对于文档偏移,而test3相对于test2偏移。
position: relative;不会脱离文档流,position: fixed;position: absolute;会脱离文档流
position: relative; 相对于本身在文档流中的初始位置偏移定位。
position: fixed; 相对于浏览器窗口定位。
position: absolute; 是相对于父级非position:static 浏览器定位。
若是没有任何一个父级元素是非position:static属性,则会相对于文档定位。
这里它的父级元素是包含爷爷级元素、祖爷爷级元素、祖宗十八代级元素的。任意一级均可以。
若是它的父级元素和爷爷级元素都是非position:static 属性,则,它会选择距离最近的父元素。
参考资料:
1.MDN:https://developer.mozilla.org...
相关文章推荐:CSS进阶指南