CSS第七篇:CSS属性-定位
标准流(Normal Flow)
- 默认情况下,元素都是按照normal flow进行定位的
- 从上到下,从左到右按顺序摆放好
- 相互之间不存在层叠现象
- margin、padding定位
- 在标准流中,可以使用margin、padding对元素进行定位
- 其中margin还可以设置负数
- 比较明显的缺点是:
- 设置一个元素的margin或者padding,通常会影响到标注流中其他元素的定位效果
- 不便于实现元素的层叠效果
- 也就是说一个元素位置移动了,其他元素就会侵入他移动的位置
- 在标准流中,可以使用margin、padding对元素进行定位
CSS属性-Position
- 利用position可以对元素进行定位,常用取值有4个
- static:静态定位
- relative:相对定位
- absolute:绝对定位
- fixed:固定定位
relative-相对定位
- 元素按照normal flow布局
- 可以通过left、right、top、bottom进行定位
- 定位参照的对象是元素自己原来的位置
- 也就是说尽管元素的位置移动了,他原来的的位置还占据这,不允许其他元素侵入
-
left、right、top、bottom用来设置元素的具体位置,对元素的作用如下图所示:
- 相对定位一般用于对元素位置微调
- 在不影响其他元素位置的前提,对当前元素位置进行微调
- 相对定位与margin定位效果如下
- 给元素设置
position: relative;
- 给元素设置left、right、top、bottom值
-
代码举例:
div { width: 100px; height: 100px; } .div1 { background-color: #ff0; } .div2 { background-color: #f00; /* margin定位 */ /* margin-top: -50px; */ /* .div2 可以进行相对定位 */ position: relative; top: -50px; } .div3 { background-color: #0f0; } <div class="div1">div1</div> <div class="div2">div2</div> <div class="div3">div3</div>
- 给元素设置
- 通过relative实现屏幕缩放,背景图片居中效果(重要!!!)
- 场景:div尺寸不管如何变化,总是显示图片的最中间的地方
- 默认不做处理,img的左上角与div的左上角重合,只能显示图片的左上角
- 处理后,div尺寸不断变化,总是能够显示img的最中间部分
- 条件:img的中线总是与div的中线重合
- 步骤:
- img先向左移动图片宽度的一半,用left
- img再向右移动div宽度的一半,用margin
<style> body { margin: 0; } div { overflow: hidden; } /* 效果:无论怎样缩放屏幕,背景图片始终居中 图片在div居中计算方法:(img宽度-div宽度)*0.5 图片固定宽度为1920px,一半为960px 解决方案: 往左边移动图片宽度的一半 往右边移动div元素宽度的一半 */ img { position: relative; /* 父元素div的宽度 * 50% */ /* left: -50%; */ /* 往左边移动图片宽度的一半 */ left: -960px; /* 往右边移动div元素宽度的一半*/ margin-left: 50%; } </style> <div> <img src="./images/mhxy.jpg" alt=""> </div>
- 场景:div尺寸不管如何变化,总是显示图片的最中间的地方
static- 静态定位
- position属性的默认值
- 元素按照normal flow布局
- left、right、top、bottom没有任何作用
fixed-固定定位
- 元素脱离normal flow布局(脱离标准流、脱标)
- 可以通过left、right、top、bottom进行定位
- 定位参考对象是视口(viewport),可以简单理解为浏览器窗口
- 当画布滚动时,固定不动
- 悬浮框的场景
-
脱离标准流效果如下:
div { width: 100px; height: 100px; } .div1 { background-color: #ff0; } .div2 { background-color: rgba(255,0, 0, 0.5); /* .div2 固定定位 */ position: fixed; left: 0; top: 0; } .div3 { background-color: #0f0; }
画布和视口
- 视口
- 文档的可视区域
- 画布(canvas)
- 用于渲染文档的区域
- 文档内容超出视口范围,可以通过滚动查看
- 宽高对比
- 画布>=视口
- 总结:
- 视口就是浏览器的窗口
- 画布就是这个窗口显示的所有内容,包括滚动显示的那部分
脱标元素的特点
- 既然已经脱标,就不再受标准流约束,也不在区分它是块级元素、行内级元素、行内块级元素(注意理解)
- 脱标元素特点:
- 可以随意设置宽高
- 宽高默认由内容决定
- 不再受标准流的约束
- 不再严格按照从上到下、从左到右排布
- 不再严格区分块级、行内级,块级、行内级的很多特性都会消失
- 不再给父元素汇报宽高数据
- 脱标元素内部默认还是按标准流布局
- 脱标的元素不会占据标准流的位置,其他标准流元素会占据当前位置
absolute-绝对定位
- 元素脱离标准流normal flow
- 可以通过left、right、top、bottom进行定位
- 定位参照对象是最邻近的定位祖先元素
- 如果找不到这样的祖先元素,参照对象是视口,此时就等价于 fixed固定定位
- 什么是定位元素?
- position值不为static的元素
- 也就是position值为relative、absolute、fixed的元素
- 定位祖先元素就是当前元素的祖先元素中某个元素的position值不为static
-
举例:
<!-- di、d2、d3都是d4的祖先元素 --> <!-- 默认为static 非定位元素 --> <div class="d1" > <!-- 这个是定位元素,而且离d4最近,那么d2就是d4的参照物 --> <div class="d2" style="position: relative;"> <!-- 默认为static 非定位元素 --> <div class="d3"> <!-- 设置绝对定位 --> <div class="d4" style="position: absolute;"></div> </div> </div> </div>
子绝父相
- 在绝大多数情况下,子元素都是需要相对于父元素进行定位
- 如果希望子元素相对于父元素进行定位,又不希望父元素脱标,常用解决办法是:
- 父元素设置:
position:relative
- 子元素设置:
position:absolute
- 简称:子绝父相
- 父元素设置:
绝对定位技巧(重要!!!)
- 绝对定位元素概念
- position值为absolute或者fixed的元素
- 对于绝对定位元素来说:
- 定位参照对象的宽度 = left+right+margin-left+margin-right+绝对定位元素的实际占用宽度
- 定位参照对象的高度 = top+bottom+margin-top+margin-bottom+绝对定位元素的实际占用高度
- 通过2的结论,可以总结出下面的结论:
- 如果希望绝对定位元素的宽高和定位参照对象一样,可以给绝对定位元素设置以下属性
left:0/right:0/top:0/bottom:0/margin:0
- 如果希望绝对定位元素在定位参照对象中居中显示,可以给绝对定位元素设置以下属性
left:0/right:0/top:0/bottom:0/margin:auto
- 另外还得设置具体的宽高值(宽高小于定位参照对象的宽高)
- 如果希望绝对定位元素的宽高和定位参照对象一样,可以给绝对定位元素设置以下属性
-
父控件在子控件内部居中代码举例:
<style> .div1 { position: relative; width: 200px; height: 200px; background-color: #f00; } /* 子控件尺寸等于父控件尺寸 */ .div21 { position: absolute; background-color: #ff0; /* width: 50px; */ /* height: 50px; */ left: 0; right: 0; top: 0; bottom: 0; margin: 0; } /* 子控件在父控件内部水平、垂直居中 */ .div2 { position: absolute; background-color: #ff0; width: 50px; height: 50px; /* 水平居中方法1:重要 */ /* 向左距离父控件宽度的一半 */ /* left: 50%; */ /* 向左偏移 -(当前控件宽度的一半) */ /* margin-left: -25px; */ /* 水平居中方法2:重要 */ left: 0; right: 0; margin-left: auto; margin-right: auto; /* 垂直居中 */ top: 0; bottom: 0; margin-top: auto; margin-bottom: auto; /* margin: auto; */ } </style>
position总结
Z-index
-
元素的层叠
- 都是定位元素的情况,哪个元素写在后面默认就在最上面
- Z-index属性
- Z-index属性用来设置定位元素的层叠顺序(仅对定位元素有效)
- 取值可以是:正整数、负整数、0
- 比较原则
- 如果是兄弟关系
- z-index越大,层叠在越上面
- z-index相等,写在后面的那个元素层叠在上面
- 如果不是兄弟关系
- 各自从元素自己以及祖先元素中,找出最邻近的2个定位元素进行比较
- 而且这2个定位元素必须有设置z-index的具体数值
- 如果是兄弟关系
- Z-index属性用来设置定位元素的层叠顺序(仅对定位元素有效)
- 举例:
-
css部分:
<style> .div1,.div2 { width: 300px; height: 300px; } .div1 { background-color: #f00; } .div2 { background-color: #0f0; } .div111,.div222 { width: 100px; height: 100px; position: absolute; } .div11{ position: relative; z-index: 5; } .div22 { } .div111 { background-color: #ff0; top: 100px; z-index: 21; } .div222 { background-color: #0ff; top: 150px; left: 50px; z-index: 10; } </style>
-
标签
-
div222与div11比较,这两个定位元素最近
<div class="div1"> <!-- relative; 5 --> <div class="div11"> <!--absolute;21 --> <div class="div111"></div> </div> </div> <div class="div2"> <div class="div22"> <!--absolute; 10 --> <div class="div222"></div> </div> </div>
-
div222与div11比较(div11没有设置Z-index具体值)
<div class="div1"> <!-- relative; --> <div class="div11"> <!--absolute;21 --> <div class="div111"></div> </div> </div> <div class="div2"> <div class="div22"> <!-- absolute;10 --> <div class="div222"></div> </div> </div>
-
-