css 标准流/浮动流/定位流

550 阅读4分钟

传统流布局

  1. 标准流
  2. 浮动流
  3. 定位流

1. 标准流

也叫 正常流,文档流。

包含两种元素,块元素和行内元素。块元素依次从上到下,行内元素从左到右依次排列。

块级元素

h1,p,ul,ol div, table,form,footer

排版方式:从上到下,每一个都独占一行,垂直排版。

对应的css, display:block;

行内元素

a,i (倾斜),b(加粗),em(倾斜,强调语义),span(定义文档中的节),mark(标记加背景色)code,

排版方式:从左到右,依次紧挨,放不下换行,水平排版。

对应的css, display:inline; display:inline-block;

2. 浮动流

  • 脱离标准流的向左,或向右边浮动,直到碰到父元素或者另一个浮动元素。
  • 跟行内元素布局类似,水平排版。
  • 触发条件:float:left或者float:right 起初是为了实现文字环绕效果而设定。

注意点

1.元素遮挡问题

<!DOCTYPE html>
<html>
<head> 
    <style>  
    .outer {
        border: 1px solid black;
    }
    .box { 
        width: 200px; 
        height: 200px;  
        background-color: pink;
        font-size: 30px;
        margin: 50px;
    } 
    .div1 { 
         
    } 
    .div2 { 
         
    }
    </style>
</head>
<body> 
  <div class="outer">
    <div class="box div1">div1</div>
    <div class="box">div2</div>
    <div class="box">div3</div>
  </div>
</body>
</html>

image.png 当设置 float: left;

 .div1 { 
         float: left; 
    } 

div1 脱离标准流,于是div2 正常流式布局,从上到下,div2左上对齐,浮动的div1会遮挡 div2 显示。

当设置 float: right;

 .div1 { 
         float: right; 
    } 

div1 脱离标准流,于是div2 正常流式布局,从上到下,div2左上对齐,div1右对齐。

image.png

当div2 float:left ,div1当前行保留,div3上移动div2的位置,div2遮挡了div3

    .div2{
        float: left;
    } 

image.png

2.父容器坍塌问题

由于脱离的标准流,对于父容器无法获取子元素高度。

<!DOCTYPE html>
<html>
<head> 
    <style>  
    .outer {
        border: 1px solid black;
    }
    .box { 
        width: 200px; 
        height: 200px;  
        background-color: pink;
        font-size: 30px;
        margin: 50px;
        float: left;
    }  
    </style>
</head>
<body> 
  <div class="outer">
    <div class="box">div1</div>
    <div class="box">div2</div>
    <div class="box">div3</div>
  </div>
</body>
</html>

image.png

解决方案

1. 父元素直接设置height高度

不能确定子元素的实际高度。

2. 父元素添加 overflow:hidden
    .outer {
        border: 1px solid black;
        overflow:hidden
    }

会自动清除里面box的float对页面的影响,但缺点如果内容超出限定的高度会被隐藏

如左绝对定位的右侧弹出菜单时,就会被父容器“切除”

image.png

3.子元素最后添加元素 clear:both

clear会消除设置浮动给他带来的影响,把left,right元素当作普通文档流处理,所以占用空间

  <div class="outer">
   <div class="box">div1</div>
   <div class="box">div2</div>
   <div class="box">div3</div>
   <div style="clear:both;"></div> 
 </div>
注意 不能直接加载float浮动元素上,因为float已经脱离了文档流,所以不能找到同一父级下的所有浮动元素
4. 父容器添加伪元素清除(常用)

相当于在父级容器里添加了 隐藏的子元素<div style="clear:both;"></div>

.outer:after {
    display: block;
    content: " ";
    clear: both;
} 
<div class="outer">
    <div class="box">div1</div>
    <div class="box">div2</div>
    <div class="box">div3</div> 
</div> 

最优的写法

.outer:after {
    display: table;
    height:0; /*部分浏览器需要指定table高度*/
    content: "";
    clear: both;
}

3. 定位流

  • 效果有点像层叠的。

  • 凡是设置定位,除了默认的static,都可以通过left、right、top、bottom进行定位

<html>
<head>
    <style>
        .box {
            width: 100px;
            height: 100px;
        }
        .box1 {
            border: 5px solid black;
            /* position: relative; */
            /* left: 50px;
            top: 50px; */
            margin-bottom: 20px;
        } 
        .box2 {
            border: 5px solid red;
        }
        
    </style>
</head>
<body>
    <div class="box box1"></div>
    <div class="box box2"></div>
</body>
</html>

image.png

1.静态定位static

  • 浏览器默认 定位方式 position:static,无特殊定位。
  • 遵循保持标准流
  • 占位。
  • 不能使用left、right、top、bottom进行定位。

2.相对定位relative

  • 保持标准流
  • 占位
  • 相对于当前自己做定位调整
  • 设置left top等定位不影响原来的占地空间,box2不受影响
  • margin/padding跟static保持一致效果。
.box1 {
    border: 5px solid black;
    position: relative;
    left: 50px;
    top: 50px; 
} 

image.png 设置left top等定位不影响原来的占地空间,box2不受影响

image.png margin 依然生效,影响box2布局

3.绝对定位absolute

  • 脱了标准流
  • 不占位
  • 以当前元素往上找父元素,是定位(relative,absolute,fixed)的节点为定位的参考标准。
  • 当left、right、top、bottom都不设置,默认为auto,就会还原为reltaive
  • 同时设置left right,left失效 同理top bottom同时设置,top失效
.box1 {
    border: 5px solid black;
    position: absolute;  
    left: 30px;
    top: 30px; 
} 
.box2 { 
    border: 5px solid red; 
}

image.png box1的定位和 margin-bottom 都不影响正常流box2的布局。由于box1脱离文档流,box2上移。

4.固定定位fixed

  • 脱了标准流,以浏览器窗口节点为定位的参考标准。
  • 不占位

5.粘性定位 - sticky

  • css 新特性, 可以看做是相对定位和固定(绝对)定位的结合体。
  • 当内容临界的位置 如顶部或底部,就会固定。否则就保持相对布局的效果。

z-index

  • 绝对比相对优先显示
  • 相同的定位类型元素,写在后面的那个元素会层叠在写在前面的那个元素上
  • z-index 越大越在最上面。
  • 可以是有负数
  • 大小的比较必须在同一个级下比较