HTML标签通常通过CSS的position属性进行定位设置,其中当值为absulute时是一种非常灵活的定位方式(性能较差?有待求证),可以这么说,搞清楚position属性基本上就能完成HTML的总体布局。
position属性的值主要有static、relative、absolute、fixed ( 不考虑initial和inherit )。
下面依次展开介绍
1.static
默认值,遵循正常文档流。
此时 top/right/bottom/left 属性均无效。
2.relative
相对定位,与absolute并不是相对关系。
|
|
如上图,此时 top/right/bottom/left 相对元素本应该在文档流中所处的位置定位,其层叠通过z-index属性定义。
注意:元素还在文档流中,并且仍占据原来位置(即wrap内的左上角),也就是说其他处于文档流中的元素也不会占据其位置。
3.absolute
绝对定位,具有和设置z-index相同的效果,完全脱离文档流,“ 最佳布局 ”
只设置 position:absolute 且没有任何 top/right/bottom/left 或 margin 属性,元素会表现为z-index: x ,即:“跳出”文档流。
如图,position:absolute后,此时 top/right/bottom/left 是相对 最靠近元素且 “ position不为static ” 的父容器的border 定位的,也就是说该父容器内的padding不会对定位造成任何影响,并且 完全脱离文档流,即文档流中的其他元素可以占据他的位置。
12345678910111213141516171819202122232425<style>.warp {position: relative;width:300px;height:200px;background-color: #ccc;}.box {/* 可以尝试去掉 absolute 看元素本来所处的位置 */position: absolute;top: 40px;left: 50px;width: 100px;height: 100px;background-color: yellow;/* 为直观显示,设置透明度 */opacity: 0.7;filter: Alpha(opacity=70);}</style><div class="wrap">wrap<br/><div class="box">box</div>此文字并不会占据位置relative元素本应该在文档流中的位置</div>
如图,若 position:absolute 后并没有 top/right/bottom/left ,只有 margin 属性,则元素表现 “跟随” 特性,即:处在本应该在文档流的位置,但是脱离了文档流,相当于relative 和 z-index 共同作用。利用“跟随”特性,可非常灵活的做突破一些区域的定位,如右上角角标。
12345678910111213141516171819202122232425<style>.warp {position: relative;width:300px;height:200px;background-color: #ccc;}.box {/* 可以尝试去掉 absolute 看元素本来所处的位置 */position: absolute;margin-top: 40px;margin-left: 50px;width: 100px;height: 100px;background-color: yellow;/* 为直观显示,设置透明度 */opacity: 0.7;filter: Alpha(opacity=70);}</style><div class="wrap">wrap<br/><div class="box">box</div>此文字并不会占据位置relative元素本应该在文档流中的位置</div>
注意
absolute 元素的 top/right/left/bottom 同时设置时,只有top/left 生效。
position: absolute 会隐式 display: inline-block;(float: left/right 也会执行此隐式操作)。
通常情况下,设置 positon: absolute 后不需要手动设置 z-index,遵循的规则为:后一个absolute元素的z-index等于前一个absolute的z-index+1,特殊情况下需手动设置”z-index: 999”或“z-index: -1”。
4.fixed
固定定位,相对于视口定位。
通常用来做在窗口中始终固定的button、bar。
注意:fixed相当于一种特殊的absolute,在移动浏览器对fixed支持很差,可以用absolute来解决。
PS:
文档流
在窗口中,每行按照自上而下,行内元素从左到右的排列规则,即文档流,正常的文档流应该是文档节点的加载顺序、渲染顺序和视觉上的呈现顺序结构一致。布局中,我们应该尽量不破坏文档流。
脱离文档流的两种方式:浮动和定位(特指absolute)