一.为什么需要定位
要让盒子在某个盒子内自由的移动或者固定到屏幕中的某个位置,浮动是无法实现的,浮动只能让多个块级盒子在一行中没有缝隙的排列,那么这时我们就要用到定位。
二.定位的定义和组成
定位是指将盒子定在某个位置,所以定位也是在摆放盒子,按照定位的方式移动。
定位=定位模式+边偏移
定位模式用于指定一个元素在文档中的定位方式,边偏移则决定了该元素的最终位置。
三.定位模式
1.静态定位
元素的默认定位方式,无定位
语法:选择器{position:static;}
- 静态定位按照标准流特性摆放位置,没有边偏移
- 在布局中很少用到
2.相对定位
在元素移动位置时,是相对于该元素原来的位置计算
语法:选择器{position:relative;}
- 元素是相对于自己原来的位置移动的(移动位置的时候参照点是自己原来的位置)
- 原来在标准流的位置继续占有,后面的盒子仍然以标准流的形式对待它(不脱标,继续保留原来的位置,最典型的应用是给绝对定位当父元素)
3.绝对定位
元素在移动时是相对于它祖先元素来说的
语法:选择器{position:absolute;}
- 如果没有祖先元素或祖先元素没有定位,则以浏览器为准定位(Document文档)
- 如果祖先元素有定位(相对、绝对、固定),则以最近一级的有定位的祖先元素为参照点移动位置
- 绝对定位不再占有原先的位置(脱标)
拓展:“父相子绝”的由来
顾名思义:子元素是绝对定位,则父元素要用相对定位。
- 子元素绝对定位,不会占有位置,可以放到父元素盒子的任何一个地方,不会影响到兄弟元素
- 父盒子需要加定位限制子盒子在其内的显示
- 父盒子布局时需要占有位置,因此要是相对定位
4.固定定位
元素固定于浏览器可视区的位置
应用:可以在页面浏览器页面滚动时元素的位置不发生改变
语法:选择器{position:fixed;}
- 以浏览器的可视窗口为参考点移动元素,跟父元素没有关系,不随滚动条而滚动
- 固定定位不再占有原先的位置(脱标,其实也可以看作是一种特殊的绝对定位)
拓展:固定定位小技巧--固定在版心右侧位置
- 让固定定位的盒子left:50%,走到浏览器可视区(版心)的一半位置
- 让固定定位的盒子margin-left:版心宽度的一半距离
5.粘性定位
可以认为是相对定位和固定定位的混合
语法:选择器{position:sticky;top:10px;}
- 以浏览器的可视窗口为参考点移动元素(固定定位特点)
- 占有原先位置(相对定位特点)
- 必须添加top、left、right、bottem其中一个才有效
四.定位叠放次序
使用定位布局时,可能会出现盒子层叠的情况,此时,可以使用z-index来控制盒子的前后次序(z轴)
语法:选择器{z-index:1;}
- 数值可以是正整数、负整数或0,默认是auto,数值越大盒子越靠上
- 如果属性相同,则按照书写顺序,后来居上
- 数字后面不能加单位
- 有定位的盒子才有z-index属性
五.定位拓展
1. 绝对定位的盒子居中
加了绝对定位的盒子不能用margin:0 auto;实现水平居中,可用以下方式:
- left:50%; 让盒子的左侧移动到父元素水平中心位置
- margin-left:-100px; 让盒子向左移动自身宽度的一半
2.定位特殊特性
- 绝对定位和固定定位也和浮动类似
- 行内元素添加绝对或固定定位,可以设置高度和宽度
- 块级元素添加绝对或固定定位,如果不加高度和宽度,默认大小是内容大小
3.脱标的盒子不会触发外边距塌陷
浮动元素、固定定位、绝对定位的元素都不会触发外边距合并的问题
4.绝对定位、固定定位会完全压住盒子
浮动元素不同,只会压住它下面标准流的盒子,但是不会压住标准流盒子中的文字(图片),因为浮动最初目的就是为了做文字环绕效果,但是绝对定位和固定定位会压住下面标准流盒子的所有内容