zoukankan      html  css  js  c++  java
  • BFC引发的关于position的思考

    BFC布局规则:

    1. 内部的Box会在垂直方向,一个接一个地放置。
    2. Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
    3. 每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
    4. BFC的区域不会与float box重叠。
    5. BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
    6. 计算BFC的高度时,浮动元素也参与计算

    其中第4条:BFC的区域不会与float box重叠

      

    <style type="text/css">
            .first{
                width:100px;
                height:100px;
                background-color:red;
                float:left;
            }
            .second{
                width:200px;
                height:200px;
                background-color:blue;
                overflow: hidden;
                /*position:absolute;*/
    
            }
        </style>
        <body>
            <div class="first"></div>
            <div class="second"></div>
        </body>

      按照上述的写法,两个div确实没有发生重叠,并且按照预期的那样水平排放。

    <style type="text/css">
            .first{
                width:100px;
                height:100px;
                background-color:red;
                float:left;
            }
            .second{
                width:200px;
                height:200px;
                background-color:blue;
                /*overflow: hidden;*/
                position:absolute;
    
            }
        </style>
        <body>
            <div class="first"></div>
            <div class="second"></div>
        </body>

    随后,将second中生成BFC的元素overflow:hidden改为position:absolute;.这时候将,看到second将first覆盖了

    看来,绝对定位还有点奇怪。

    随后,于是我给蓝色块中添加一个小块,并给出绝对定位。

    代码如下:

    <style type="text/css">
            .first{
                width:100px;
                height:100px;
                background-color:red;
                /*float:left;*/
            }
            .second{
                width:200px;
                height:200px;
                background-color:blue;
                /*overflow: hidden;*/
                /*position:absolute;*/
    
            }
            .second-1{
                width:100px;
                height:100px;
                background:green;
            }
        </style>
        <body>
            <div class="first"></div>
            <div class="second">
                <div class="second-1"></div>
            </div>
        </body>

    而从样式可以发现绿色的小DIV并没有定位到想象中的页面左上角去,而是停留在他原来的位置。

    这时候只要给绿色的小DIV的样式添加一个top:0;left:0;才会跑到页面左上角去。

    这说明,只给出position:absolute;只让该元素脱离了普通文档流,而并没有改变他的位置

    结论:给定一个元素position:absolute;而不给出top与left值,它就会去先找父元素并定位,随后,给出top与left值之后所呈现的位置才是定义的样式。

    个人理解,如有不足,还请指教

  • 相关阅读:
    Ext Js MVC系列二 利用Application和Viewport进行应用程序初始化和页面布局
    LINQ to Sql系列一 增,删,改
    Ext Js MVC系列一 环境搭建和MVC框架整体认识
    LINQ to Sql系列四 性能优化总结
    SQL基础回顾系列一 单表查询(select语句)
    JSON详解
    公用类库(4) 缓存操作类CacheUtil
    架构设计考虑的问题(出自代码大全II)
    .net自动更新组件Ant
    .net socket在win2008下的吞吐性能报告
  • 原文地址:https://www.cnblogs.com/Changero/p/4802427.html
Copyright © 2011-2022 走看看