深入理解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之后,父级元素背景颜色出现,且子元素的高度参与了父级元素高度的计算。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容

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