深刻理解CSS盒模型【轉載】

 

 下面本文章將會從如下幾個方面談談盒模型。css

  • 基本概念:標準模型 和IE模型
  • CSS如何設置這兩種模型
  • JS如何設置獲取盒模型對應的寬和高
  • 實例題(根據盒模型解釋邊距重疊)
  • BFC(邊距重疊解決方案)

 

基本概念

盒模型的組成你們確定都懂,由裏向外content,padding,border,margin.html

盒模型是有兩種標準的,一個是標準模型,一個是IE模型。瀏覽器

 

 從上面兩圖不難看出在標準模型中,盒模型的寬高只是內容(content)的寬高,dom

而在IE模型中盒模型的寬高是內容(content)+填充(padding)+邊框(border)的總寬高。佈局

 

css如何設置兩種模型

這裏用到了CSS3 的屬性 box-sizingpost

/* 標準模型 */
box-sizing:content-box;

 /*IE模型*/
box-sizing:border-box;

 

JS獲取寬高

經過JS獲取盒模型對應的寬和高,有如下幾種方法:flex

爲了方便書寫,如下用dom來表示獲取的HTML的節點。spa

1.  dom.style.width/height 3d

  這種方式只能取到dom元素內聯樣式所設置的寬高,也就是說若是該節點的樣式是在style標籤中或外聯的CSS文件中設置的話,經過這種方法是獲取不到dom的寬高的。code

 2. dom.currentStyle.width/height 

  這種方式獲取的是在頁面渲染完成後的結果,就是說無論是哪一種方式設置的樣式,都能獲取到。

  但這種方式只有IE瀏覽器支持。

 3. window.getComputedStyle(dom).width/height

  這種方式的原理和2是同樣的,這個能夠兼容更多的瀏覽器,通用性好一些。

 4. dom.getBoundingClientRect().width/height

  這種方式是根據元素在視窗中的絕對位置來獲取寬高的

 5.dom.offsetWidth/offsetHeight

  這個就沒什麼好說的了,最經常使用的,也是兼容最好的。

 

邊距重疊

什麼是邊距重疊

以下圖,父元素沒有設置margin-top,而子元素設置了margin-top:20px;能夠看出,父元素也一塊兒有了邊距。

上圖的代碼

 

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        .demo{
            height:100px;
            background: #eee;
        }
        .parent{
            height:200px;
            background: #88f;
        }
        .child{
            height:100px;
            margin-top:20px;
            background: #0ff;
            width:200px;
        }
    </style>
</head>
<body>
    <section class="demo">
        <h2>此部分是能更容易看出讓下面的塊的margin-top。</h2>
    </section>
    <section class = "parent">
        <article class="child">
            <h2>子元素</h2>
            margin-top:20px;
        </article>
        <h2>父元素</h2>
            沒有設置margin-top
    </section>
</body>
</html>
複製代碼

 

邊距重疊解決方案(BFC)

首先要明確BFC是什麼意思,其全英文拼寫爲 Block Formatting Context 直譯爲「塊級格式化上下文」

BFC的原理

  1. 內部的box會在垂直方向,一個接一個的放置
  2. 每一個元素的margin box的左邊,與包含塊border box的左邊相接觸(對於從作往右的格式化,不然相反)
  3. box垂直方向的距離由margin決定,屬於同一個bfc的兩個相鄰box的margin會發生重疊
  4. bfc的區域不會與浮動區域的box重疊
  5. bfc是一個頁面上的獨立的容器,外面的元素不會影響bfc裏的元素,反過來,裏面的也不會影響外面的
  6. 計算bfc高度的時候,浮動元素也會參與計算

 怎麼取建立bfc

  1. float屬性不爲none(脫離文檔流)
  2. position爲absolute或fixed
  3. display爲inline-block,table-cell,table-caption,flex,inine-flex
  4. overflow不爲visible
  5. 根元素

應用場景

  1. 自適應兩欄佈局
  2. 清除內部浮動 
  3. 防止垂直margin重疊

看一個垂直margin重疊例子

代碼

複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        .top{
            background: #0ff;
            height:100px;
            margin-bottom:30px;
        }
        .bottom{
            height:100px;
            margin-top:50px;
            background: #ddd;
        }
    </style>
</head>
<body>

    <section class="top">
        <h1>上</h1>
        margin-bottom:30px;
    </section>
    <section class="bottom">
        <h1>下</h1>
        margin-top:50px;
    </section>

</body>
</html> 
複製代碼

 

 效果圖

 用bfc能夠解決垂直margin重疊的問題

關鍵代碼

複製代碼
<section class="top">
        <h1>上</h1>
        margin-bottom:30px;
    </section>

    <!-- 給下面這個塊添加一個父元素,在父元素上建立bfc -->
    <div style="overflow:hidden">
        <section class="bottom">
            <h1>下</h1>
            margin-top:50px;
        </section>
    </div>
複製代碼

 

效果圖 

 

關於bfc的應用的案例這裏就不在一一舉出了,你們去網上找一些其餘的文章看一下。

 

 

參考原文:https://www.cnblogs.com/chengzp/p/cssbox.html

相關文章
相關標籤/搜索