文档流概念
文档流,是指盒子按照 HTML 标签编写的顺序依次从上到下,从左到右排列,块元素占一行,行内元素在一行之内从左到右排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置。
一. 定位
把某一个标签, 安置到某一个位置去, 这个过程称为定位
1. 定位分类:
我们可以使用 CSS 的 position 属性来设置元素的定位类型,position 的设置项如下:
static 默认值. 没有定位: 元素出现在正常的流中(忽略top, bottom, left, right 或者 z-index 声明)
relative 生成相对定位元素,一般是将父级设置相对定位,子级设置绝对定位,子级就以父级作为参照来定位,否则子级相对于body来定位。
absolute: 生成绝对定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于上一个设置了定位的父级元素来进行定位,如果找不到,则相对于body元素进行定位。
fixed: 生成固定定位的元素,相对于浏览器窗口进行定位。
元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。
定位元素的偏移
定位的元素还需要用left、right、top或者bottom来设置相对于参照元素的偏移值。
1. 相对定位:
相对定位是相对于该元素在文档流中的原始位置,即以自己原始位置为参照物. 有趣的是: 即使设置了元素的相对定位以及偏移值, 元素还占有原来的位置, 即占据文档流的空间.对象遵循正常文档流, 但依据 top, left, right, bottom等属性在正常文档流中偏移位置. 而其层叠通过 z-index 属性定义
注意: position: relative 的主要用法是: 方便绝对定位元素找到参照物.
1 | CSS部分: |
2. 绝对定位:
定义: 设置为绝对定位的元素框从文档流完全删除, 并相对于最近的已定位祖先元素定位, 如果元素没有已定位的祖先元素,那么他的位置相对于最初的包含块( 即body元素 ). 元素原先在正常文档流中所占的空间会关闭, 就好像该元素原来不存在一样. 元素定位后生成一个块级框, 而不论原来它在正常流中生成何种类型的框.
重点: 如果父级设置了 position 属性, 例如: position: relative, 那么子元素就会以父级的左上角为原点进行定位. 这样能很好的解决自适应网站的标签偏离问题, 即父级为自适应, 那我子元素就设置position:absolute; 父元素设置position: relative; 然后top, bottom, right, left 用百分比宽度表示.
总结: 参照物用相对定位, 子元素用绝对定位, 并且保证相对定位参照物不会偏移即可.
1 | <style> |
3. 固定定位
fixed: 对象脱离正常文档流, 使用 top, right, bottom, left等属性以窗口为参照点进行定位, 当出现滚动条时, 对象不会随着滚动.
而其层叠通过 z-index 属性定义.
注意点: 一个元素若设置了 position: absolute | fixed; 则该元素就不能设置 float. 这是一个常识性知识点, 因为这是两个不同的流, 一个是浮动流, 另一个是 定位流. 但是 relative 却可以. 因为它原本所占的空间仍然占据文档流.
理论上, 被设置为 fixed 的元素会被定位于浏览器敞口的一个指定坐标, 不论窗口是否滚动, 他都会固定在这个位置.
1 | <style> |
2. 元素层级
绝对定位元素是浮动在正常的文档流之上的,可以用 z-index 属性来设置元素的层级
例如:
伪代码如下:2
1 | .box01{ |
1 | CSS部分: |
3. 练习: 用固定定位创建弹窗
1 | <style> |
二. 页面嵌套
在一个页面中可以开一个局部的窗口,嵌入另外一个页面
制作这样的功能我们一般使用: iframe 标签来实现
1 | 使用方法: |
- src: 设置另一个网页的地址
- frameborder: 设置这个局部窗口边框的粗细
提升:
iframe
可以和 a
标签搭配使用, 呈现切换的效果:
我们知道
a
标签有 target 属性:target=”_blank” : 新开一个浏览器窗口显示链接的页面
如果 target 的值和 iframe 的 name 值保持相同, 则 a 标签切换后的 href 将作用到 iframe 的 src 上:
1 | <a href="001.html" target="name">001页面</a> |
三. 元素居中显示技巧
1. 居中显示:
想要使某个元素能够居中显示, 需要设置其 margin 属性为: 0px auto:
1 | CSS部分: |
总结:
- 如果想要某个元素居中, 则需要设置他的 margin : 0px auto;
- 多个元素想要居中, 则每个单独的元素都需要设置该属性.
- margin: 0px auto; =====> margin: 0px auto 0px auto; (上, 右, 下, 左)