css之position与文档流

html-css018

css之position与文档流,第1张

     Css的定位机制分为普通流(文档流)、浮动(float)、定位(position)其中普通流就是文档流,在Html中的写法是从上到下,从左到右的排版布局,其中块级元素独占一行,而内联元素不独占一行。对于文档流来说它的默认position是static就是没有定位。

      position规定元素的定位类型,任何元素都可以定位,不过绝对或固定元素会生成一个块级框,而不管该元素本身是个什么类型,相对元素会相对与它的正常流的默认位置作出偏移。具体:static,position的默认值,表示没有定位,忽略top,left,bottom,right和z-index的影响;absolute,生成绝对定位元素,相对于static定位之外的第一个父元素进行定位,元素位置通过left,top,bottom,right设置;fixed,生成绝对定位元素,相对于浏览器窗口进行定位,通过left,top,bottom,right设置;relative,生成相对定位元素,相对于其正常文档流中的位置进行定位,通过left,top,botton,right设置(注意相对正常位置);inherit规定应该从父元素处继承position属性。

       浮动模型是一种可视化格式模型,浮动的框可以左右移动,直到它的外边缘碰到包含框或者另一个浮动元素的边框,如果包含的框中没有足够的宽度容纳浮动元素那么多余的就会下移。浮动元素不在文档的普通流中,就好比浮动元素在文档流中不存在似的。

       从上面我们知道,被设置了absolute的元素或者float的元素都会脱离文档流,虽然正常的显示还在,但是它其实不占文档流中的空间位置。在float脱离文档流的时候虽然其他盒子无视他,但盒子中的文本围绕它,而absolute脱离文档流会造成其他盒子和盒子的文本都会无视他。

前面学习过CSS 的FlexBox布局,很大一部分页面基本都能实现了。不过昨天在练习封装一个Banner组件(虽然小程序提供了swiper)的时候,发现FlexBox无法满足需求,了解了一下可以用position来解决。效果如下:

对于一般块级元素,拿div来讲,在页面中独占一行,自上而下排列,也就是传说中的流。而即使是flex布局,也只是在横轴或纵轴上流式布局,而上图中一个div在另一个div上是没有办法满足的。

对于 Position ,其有四个属性值:

CSS有三种基本的定位机制:普通流,浮动和决定定位

多个浮动存在时,会按照流的方式规则排列

行框和清理:

前面说浮动元素会脱离文档流,不会影响不浮动的元素。不过如果浮动的元素后面有一个文档流中元素,那么这个元素的框会表现的像浮动元素不存在,但是框的文本内容会受到浮动元素的影响,会移动以留出空间。

使用clear属性,可以组织行框围绕在浮动元素外边,属性的left、right、both、none表示框的哪些边不挨着浮动框。

CSS 有三种基本的定位机制:普通流、浮动和绝对定位。

除非专门指定,否则所有框都在普通流中定位。也就是说,普通流中的元素的位置由元素在 X(HTML) 中的位置决定。

块级框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来。

行内框在一行中水平布置。可以使用水平内边距、边框和外边距调整它们的间距。但是,垂直内边距、边框和外边距不影响行内框的高度。由一行形成的水平框称为行框(Line Box),行框的高度总是足以容纳它包含的所有行内框。不过,设置行高可以增加这个框的高度。