深入理解CSS盒模型

一、什么是CSS盒模型?

盒模型是初学CSS必须要掌握的一个点,涉及到页面的整体布局。常说的CSS盒模型分为W3C标准盒模型IE盒模型。下面上一张图直观的看二者区别:

标准盒模型和IE盒模型

很明显IE盒模型的widthheight包含了paddingborder,而标准盒模型没有包含。
那么二者怎么转化呢?
box-sizing: content-box: 指的是W3C标准盒模型,也是默认的设置属性。
box-sizing: border-box:指的是IE盒模型,widthheight包含了paddingborder

二、JS如何获取盒模型对应的宽和高?

  • dom.style.width/height:对节点样式可读可写,但只能读或写内嵌的CSS样式对于在<style>或外联样式不能读写。
  • dom.currentStyle.width/height:拿到的是渲染之后的宽和高,比较真实,但支持IE浏览器
  • window.getComputedStyle(dom).width/height:方法是只读的,只能获取样式,不能设置。
  • dom.getBoundingClientRect().width/heightgetBoundingClientRect()方法得到8个值,除了 width 和 height 外的属性x、y、left、top、right和bottom都是相对于视口(viewport)的左上角位置而言的。如下:
<style media="screen">
    #box {
      width: 100px;
      height: 100px;
      background: red;
    }
  </style>


  <div id="box"></div>

  <script>
    var box = document.getElementById('box');
    console.log(box.getBoundingClientRect());
// x: 8, y: 8, width: 100, height: 100, top: 8, left 8, bottom: 108, right: 108
  </script>

三、BFC

1、什么是BFC?

BFC(Block Formatting Context):块级格式化上下文。是一种边距重叠解决方案

2、BFC的原理
  • (1) 在BFC元素的垂直方向的边距会发生重叠。
  • (2) BFC的区域不会与浮动元素Box重叠。
  • (3) BFC在页面上是一个独立的容器,外面的元素不会影响里面的元素,反之,里面的元素也不会影响外面的元素。(张鑫旭在他的博客中称BFC是CSS世界的结界,就是这个意思。)
  • (4) 计算BFC高度的时候,浮动元素也会参与计算。
3、如何创建BFC?
  • (1) <html> 根元素
  • (1) float值不为none,即只要设置了float值就创建了一个BFC。
  • (2) position的值只要不是static或relative,就创建了一个BFC。
  • (3) display值为inline-block或table-cell或table-caption等,就创建了一个BFC。
  • (4) overflow值不为visible,即为auto或者hidden时,就创建了一个BFC。
4、BFC的使用场景
  • (1) BFC垂直方向边距重叠问题
<style>
        #margin {
            background: #1890FF;
            overflow: hidden;
        }
        #margin p {
            margin: 15px auto 25px;
            background: yellowgreen;
        }
    </style>

    <section id="margin">
        <p>1</p>
        <p>2</p>
        <p>3</p>
        <p>4</p>
    </section>
边距重叠

1,2,3,4的上边距应该都是15px,下边距都是25px,很明显,1和2,2和3,3和4之间的边距发生了重叠,重叠的原则就是取较大值,即1和2之间的距离是25px。

给某个子元素添加一个父元素,然后给这个父元素添加一个BFC,可以解决该子元素的边距重叠问题,如下,给2添加一个父级div,然后给定样式overflow: hidden

<style>
        #margin {
            background: #1890FF;
            overflow: hidden;
        }
        #margin p {
            margin: 15px auto 25px;
            background: yellowgreen;
        }
    </style>

    <section id="margin">
        <p>1</p>
        <div style="overflow: hidden">
            <p>2</p>
        </div>
        <p>3</p>
        <p>4</p>
    </section>
消除边距重叠

1和2,2和3之间就没有边距重叠现象了,边距都变成15+25=40px了,而不是之前取较大值的25px。

  • (2) BFC不与float重叠
<style>
        #layout {
            background: blue;
        }
        .left {
            float: left;
            width: 100px;
            height: 100px;
            background: pink;
        }

        .right {
            height: 150px;
            background: yellowgreen;
        }
    </style>

    <section id="layout">
        <div class="left">1</div>
        <div class="right">2</div>
    </section>
与float元素重叠

图中可以看到1与2因为高度不同,发生了部分重叠,背景蓝色完全被遮挡。

可以给右侧div设定overflow: hidden;来创建一个BFC元素,消除重叠,如下:

<style>
        #layout {
            background: blue;
        }
        .left {
            float: left;
            width: 100px;
            height: 100px;
            background: pink;
        }

        .right {
            height: 150px;
            background: yellowgreen;
            overflow: hidden;
        }
    </style>

    <section id="layout">
        <div class="left">1</div>
        <div class="right">2</div>
    </section>
BFC不与float重叠

1和2的重叠消除了,背景蓝色显示出来。

  • (3) BFC子元素即使是float元素,也会参与高度计算
<style>
        #float {
            background: blue;
        }
        .float {
            float: left;
            color: yellowgreen;
        }
</style>

    <section id="float">
        <div class="float">这是一个浮动元素</div>
    </section>
子元素为浮动元素,不参与父元素高度计算

子元素为浮动元素时候,父级元素颜色未显示,高度为0,子元素不参与父级元素高度的计算。

当把父级元素设为BFC时候,子元素也会参与到父级元素的高的计算中来,如下:

<style>
        #float {
            background: blue;
            overflow: hidden; 
        }
        .float {
            float: left;
            font-size: 35px;
            color:yellowgreen;
        }
    </style>

    <section id="float">
        <div class="float">这是一个浮动元素</div>
    </section>
BFC子元素即使是float元素,也会参与高度计算

给父级元素添加overflow: hidden;float: left创建一个BFC之后,父级元素背景颜色出现,且子元素的高度参与了父级元素高度的计算。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,816评论 1 92
  • 题目:谈谈你对css盒模型的认识? 答: 基本概念:padding,margin,border,content 标...
    noyanse阅读 313评论 0 0
  • 前言 总括: 对于盒子模型,BFC,IFC和外边距合并等概念和问题的总结 原文地址:从CSS盒子模型说起 知乎专栏...
    秦至阅读 792评论 0 3
  • 以下文章是我在网上收集的内容,为了记录自己的学习以及为了以后不到处找而记录下来,如果对你有用,请感谢写这些文章的前...
    DCbryant阅读 954评论 0 2
  • 枝头的杏子压弯了树的腰 布谷鸟的叫声回荡在山中 金灿灿的麦浪起伏翻涌着 农人手里不断挥舞的镰刀 ...
    檐上月光阅读 393评论 0 0