zoukankan      html  css  js  c++  java
  • 探讨那些是与非,一个冒牌的脱离标准流浮动

    注意:本篇仅供参考,当时写这篇的时候还存在很多的问题。本文于2016-11-14编写

    7.1 一个冒牌的脱离标准流,浮动

    浮动大家都很熟悉了,但我要说的是,它并不是真正的脱离标准流,请允许我慢慢道来。

    一个常规的脱离标准流必须满足以下条件:

    • 不占据任何位置
    • 不属于任何元素
    • 父元素无法自适应脱离标准流的元素(元素都脱标了,还能自适应那可能吗,可能的话那就不是真正的脱标)

    如果是这样的话,下面的种种现象足够证明。另外也可以说明它真的不是用来布局的,而是用来实现文字环绕的。

    现象1:浮动盖不住文字
    <style>
      body,div{
        margin:0;
        padding:0;
      }
      div{
        100px;
        height:100px;
        background-color:red;
      }
      .item1{
        float:left;
      }
    </style>
    <div class="item1">item1</div>
    <div class="item2">item2</div>
    

    文字被掉下来了,这一点能够说明浮动和文字有着不可密切的关系,也就是文字环绕。

    现象2:浮动并不是真正的不占位置
    <style>
      body,div{
        margin:0;
        padding:0;
      }
      div{
        100px;
        height:100px;
      }
      .item1{
        float:left;
        background-color:red;
      }
      .item2{
        display:inline-block;
        background-color:pink;
      }
    </style>
    <div class="item1">item1</div>
    <div class="item2">item2</div>
    

    可以看到它其实还是占了位置的,实际上它只对后一个元素是块级元素的时候才会盖住它,之所以它会占不是块级元素的位置是因为不是块级元素,它是允许并排的,允许并排那么文字正好在它的右边,另外你会可以发现,如果是用inline-block和inline中间会有几像素的间距,但是用了浮动以后间距就没了。这说明了文字和它的亲密度。

    现象3:浮动不允许我们手动调整层级
    <style>
      body,div{
        margin:0;
        padding:0;
      }
      div{
        100px;
        height:100px;
      }
      .item1{
        float:left;
        z-index:-999;
        background-color:red;
      }
      .item2{
        background-color:pink;
      }
    </style>
    <div class="item1">item1</div>
    <div class="item2">item2</div>
    

    可以看到我们设置的z-index根本就没有用,因为它和定位有着天然的区别,一个是用来脱离标准流的,一个是用来实现文字环绕的。

    现象4:父元素还是可以自适应浮动的元素的
    <style>
      body,div{
        margin:0;
        padding:0;
      }
      .box{
        200px;
        overflow:hidden;
        border:1px solid #dedede;
      }
      .item{
        100px;
        height:100px;
        float:left;
        background-color:pink;
      }
    </style>
    <div class="box">
      <div class="item"></div>
    </div>
    

    加上一个overflow:hidden;完美自适应浮动元素高度。

    为什么它只会盖住块级元素,并且不会盖住文字?如果我们不给块级元素设置宽度,你就会发现它的秘密。

    <style>
      body,div{
        margin:0;
        padding:0;
      }
      .item1{
        100px;
        height:100px;
        float:left;
        background-color:red;
      }
      .item2{
        background-color:pink;
      }
    </style>
    <div class="item1">item1</div>
    <div class="item2">item2</div>
    

    可以看到它把文字往左边移动了,并且移动的距离正是浮动元素的宽度,另外这也可以解释为什么浮动不能手动创建层级,如果真的允许创建层级那问题就大了,那么没有浮动的那个元素将在上面,那么文字究竟是放在哪里呢?放在浮动元素的右边?那就成什么了,请自行脑补一下。

    所以这些现象足够说明浮动并不是一个真正的脱离标准流,要说是那也只是耍了点小把戏,另外一点更加确定的是它和文字环绕是一对的。

    7.2 隐藏在body、html后面的神秘人物

    你有没有发现,给body设置背景颜色即使不设置宽高,背景也是占满全屏的,你肯定会说,body的宽高默认100%,如果你这么觉得就错了,不多说实战出真知。

    <style>
      body{
        background-color:pink;
      }
    </style>
    

    这个你肯定不止一次的使用过,那这个究竟是不是body的背景呢?肯定不是,为什么这么说,如果你看了css单位的第一节100%单位,我想你应该还记得之前说过,body的高度是继承html的,而html的高度是根据内容来的,如果没有内容,那么它的高度为0,你说给一个高度为0的元素设置背景色会有用吗,肯定是没有用的,另外一点可以证明它绝对不是body的,我想你应该每天在写这么一句话。

    body{
      margin:0;
      padding:0;
    }
    

    为什么要这么写呢,因为它默认有一个margin,既然默认有一个margin,如果说这个背景真的是body的,那么肯定会有8px的间距。但是没有,所以可以排除这个背景是body的,那么它是html的吗?肯定也不是,看看这张图就知道了。

    可以看到默认html只有8像素的高度,这个高度是body默认的margin高度。因为父元素会自适应子元素的高度,除了脱离标准流的元素,还可以从另外一方面解释。

    <style>
      html{
        margin-top:50px;
        border:10px solid red;
      }
      body{
        border:10px solid green;
        background-color:pink;
      }
    </style>
    

    可以看到我们已经做的很绝了,但依然不影响背景颜色。

    那么既然不是body,也不是html的,那么究竟是谁的呢?

    我猜测它属于整个文档的,而这个文档是我们是无法操作的,简单来说,浏览器默认是没有给这个文档设置背景的,而一旦body或html设置了,它就会去捕获这个背景,从而给这个文档运用上去。

    如果是这样的话,那如果给body和html都设置背景,会用谁的呢?你应该猜到了

    <style>
      html{
        background-color:red; 
      }
      body{
        background-color:pink;
      }
    </style>
    

    正是html的。

    以下这个情况,更加确定,在html以及body后面一直隐藏着一个神秘人物。

    <style>
      body{
        display:none;
        background-color:pink;
      }
    </style>
    

    把body隐藏了居然还可以,但如果把html隐藏了,它的运气就没有那么好了。

    <style>
      html{
        display:none;
      }
      body{
        display:none;
        background-color:pink;
      }
    </style>
    

    白茫茫。或许它离我们并不远,我想有一天它一定会浮出水面...

  • 相关阅读:
    spring boot 配置时区差别
    概率期望
    Euler函数与Euler定理
    素数&筛法
    等差子序列
    8.19 T2
    8.19 T1
    量化交易
    挺进

  • 原文地址:https://www.cnblogs.com/pssp/p/6060721.html
Copyright © 2011-2022 走看看