CSS盒模型之內邊距、邊框、外邊距-19問 (持續更新)

2021-02-20 web前端學習圈
△ 是新朋友嗎?記得先點web前端學習圈關注我哦~

本篇文章主要探討盒模型,以及內邊距、邊框、外邊距的面試題與思考,也希望您能把您的思考和遇到的問題以評論的方式補充下,後期,我將會補充到文章中第一問:什麼是盒模型?

可以說,頁面就是由一個個盒模型堆砌起來的,每個HTML元素都可以叫做盒模型,盒模型由外而內包括:外邊距(margin)、邊框(border)、填充(亦稱內邊距)(padding)、內容(content)。它在頁面中所佔的實際寬度是margin + border + paddint + content 的寬度相加。

但是,盒模型有標準盒模型和IE的盒模型。

第二問:兩者的區別是什麼?

我們先來看兩張圖:

標準的(W3C)盒模型:

IE盒模型:

第三問:怎麼設置這兩種模型呢?

很簡單,通過設置 box-sizing:content-box(W3C)/border-box(IE)就可以達到自由切換的效果。


第四問JS怎麼獲取和設置盒模型的寬高呢,你能想到幾種方法

dom.style.width/height

這種方法只能獲取使用內聯樣式的元素的寬和高。

dom.currentStyle.width/height

這種方法獲取的是瀏覽器渲染以後的元素的寬和高,無論是用何種方式引入的css樣式都可以,但只有IE瀏覽器支持這種寫法。

window.getComputedStyle(dom).width/height

這種方法獲取的也是瀏覽器渲染以後的元素的寬和高,但這種寫法兼容性更好一些。

dom.getBoundingClientRect().width/height

這種方法經常使用的場所是,計算一個元素的絕對位置(相對於視窗左上角),它能拿到元素的left、top、width、height 4個屬性。


第五問:描述一下下面盒子的大小,顏色什麼的(content-box模型)
<html><style>  body{    background-color: gray;  }  div{    color: blue;    width: 100px;    background-color: pink;    border: 10px solid;    padding: 20px;  }</style><body>  <div></div></body></html>

有一說一,當時被字節面試官問到這個問題,我是挺蒙蔽的,因為他這裡不指考了一點,問題列一下:

整個盒子的大小

padding的顏色

border的顏色

height為0了,看得見盒子嗎?

答案:如圖所示

整個盒子的大小 = 0 (因為height為0)

padding的顏色 = pink(繼承content的顏色)

border的顏色 = blue(繼承color字體的顏色,默認為black)

height為0了,看得見盒子嗎?(雖然height為0,但是看得見盒子,因為有border和padding)

這裡需要注意

如果沒有寫border-style,那麼邊框的寬度不管設置成多少,都是無效的。

border-color的顏色默認跟字體顏色相同

padding顏色跟背景顏色相同


第六問:當small盒子設置成圓形時,內容會超出圓形嗎?為什麼
<html><style>  body{    background-color: gray;  }  .big{    width: 400px;    height: 400px;    background-color: pink;  }  .small{    width: 100px;    height: 100px;    background-color: red;    border-radius: 50%;    overflow-wrap: break-word;  }</style><body>  <div>    <div>      ddddddddddddddddddddddddddddddddddddddddddd    </div>  </div></body></html>

會超出圓形。原因如圖所示,是因為border-radius只是改變視覺上的效果,實際上盒子佔據的空間還是不變的。


第七問:當元素設置成inline-block會出現什麼問題?怎麼消除?

這是網易有道的小姐姐面試官的問題,我承認我確實不知道這個問題!

真正意義上的inline-block水平呈現的元素間,換行顯示或空格分隔的情況下會有間距,很簡單的個例子

我們使用CSS更改非inline-block水平元素為inline-block水平,也會有該問題:

.space a {    display: inline-block;    padding: .5em 1em;    background-color: #cad5eb;}<div>    <a href="##">惆悵</a>    <a href="##">淡定</a>    <a href="##">熱血</a></div>

去除inline-block元素間間距的N種方法

元素間留白間距出現的原因就是標籤段之間的空格,因此,去掉HTML中的空格,自然間距就木有了。考慮到代碼可讀性,顯然連成一行的寫法是不可取的,我們可以:

<div>    <a href="##">    惆悵</a><a href="##">    淡定</a><a href="##">    熱血</a></div>

或者是:

<div>    <a href="##">惆悵</a    ><a href="##">淡定</a    ><a href="##">熱血</a></div>

或者是藉助HTML注釋:

<div>    <a href="##">惆悵</a><!--    --><a href="##">淡定</a><!--    --><a href="##">熱血</a></div>

使用margin負值

讓閉合標籤吃膠囊

使用font-size:0

詳細的可以看看這篇文章去除inline-block元素間間距的N種方法


第八問:行內元素可以設置padding,margin嗎?

沒有變化

沒用變化

影響左右,不影響上下 ,span包裹的文字左右位置改變,上下位置不變,但背景色會覆蓋上面元素的內容。如圖所示:

行內元素(inline-block)的padding左右有效 ,但是由於設置padding上下不佔頁面空間,無法顯示效果,所以無效


第九問:padding:1px2px3px;則等效於什麼?

對於我們來說,我們經常寫的簡寫是兩個值或者一個值或者四個值,而三個值的,會比較少寫,所以當時,我確實有點蒙了,因為我對於這個三個值各代表什麼是死記硬背的!後來才發現,原來遵循一條非常簡單的規則:

簡單來說就是 這四個值,分別代表上、右、下、左。如果沒有寫下的話,那就下複製上的,同理左複製右的值。

因此, 你應該明白了

當padding的值只有一個時,就是後面三個都複製了第一個

當寫兩個時,就是寫了top和right,因此bottom複製top,left複製right

當寫了三個時,就是寫了top,right,bottom,因此left複製right。

這麼簡單的規則,再也不會忘記了吧。


第十問:內邊距的百分數值是這麼計算的

我們知道,padding可以這麼設置

也可以

那當是百分比時是怎麼計算的呢?

這不是很簡單的問題嗎?

就是根據父元素的寬度計算的


第十一問:那為什麼不根據自己的寬度呢?而要根據父元素

好傢夥,我說怎麼問那麼簡單的問題,原來是為了這個問題做鋪墊

這個問題可以這麼思考,如果不根據父元素,而是根據本身的寬度的話。那麼當padding生效後,本身的寬度不就變大了嗎?那麼padding不是也要變大嗎?這就陷入了死循環(哇塞!)。

或者要是本身沒有寬度,那豈不是怎麼設置padding都是無效的!!!


第十二問:什麼是邊距重疊?什麼情況下會發生邊距重疊?如何解決邊距重疊?

邊距重疊:兩個box如果都設置了邊距,那麼在垂直方向上,兩個box的邊距會發生重疊,以絕對值大的那個為最終結果顯示在頁面上。

邊距重疊分為兩種:

同級關係的重疊

同級元素在垂直方向上外邊距會出現重疊情況,最後外邊距的大小取兩者絕對值大的那個**

<section>  <style type="text/css">      .fat {          background-color: #ccc;      }      .fat .child-one {          width: 100px;          height: 100px;          margin-bottom: 30px;          background-color: #f00;      }

  .fat .child-two {      width: 100px;      height: 100px;      margin-top: 10px;      background-color: #345890;  }

   ```

父子關係的邊距重疊

父子關係,如果子元素設置了外邊距,在沒有把父元素變成BFC的情況下,父元素也會產生外邊距。

給父元素添加 overflow:hidden 這樣父元素就變為 BFC,不會隨子元素產生外邊距,但是父元素的高會變化

<!--。--><section id="fat">  <style type="text/css">      #fat {          background-color: #f00;          overflow: hidden;      }
#fat .child { margin-top: 10px; height: 100px; background-color: blue; }</style> <article></article></section>


第十三問:第二種哪裡算是外邊距重疊???

實際上,這也是第一種的變形。

header {  background: goldenrod;}h1 {  margin: 1em;}<header>  <h1>Welcome to ConHugeCo</h1></header>

可以看到其實是header的margin為0,然後h1的margin為1em,因此header和h1的margin發生了重疊,然後header的margin就取1em和0兩個值中最大的值了,所以當然取1em啦。

(網上有說是因為margin的傳遞性,但我並不同意,因為我實踐了一下,發現不管父盒子有沒有margin-top,父盒子只會選擇兩者值中的最大值,跟傳遞性似乎沒啥關係)


第十四問:為什麼回出現margin重疊的問題?粗俗點就是問設計者的腦子有問題嗎?

這個就是問設計了margin重疊的巧妙用處。

這個曾經有位面試官問過我,我不知道,我請教了他,他說,在flex布局前,要實justify-content:space-evenly的效果,利用浮動布局,然後給每個盒子設置margin-right,margin-left就可以實現了,這樣就不用去單獨地再去設置第一個盒子的margin-left和最後一個盒子的margin-right,那時候我信了。

後來越想越不對,不是說margin水平方向不會發生重疊問題嗎????

但是根據面試官的思路來的話,在垂直方向似乎就講的通了。

<html><style>  body{    background-color: gray;  }  ul{    width: 300px;    height: 170px;    background-color: blue;    border: 1px solid;  }  li{    margin-top: 20px;    margin-bottom: 20px;    width: 40px;    height: 30px;    background-color: orange;  }</style><body>  <ul>    <li></li>    <li></li>    <li></li>  </ul></body></html>

或許你有更好的說法,歡迎下方留言評論補充!!!

那該怎麼解決margin邊距重疊的問題呢?

解決方法就是生成BFC


第十五問:什麼是BFC?

BFC的基本概念–BFC就是「塊級格式化上下文」的意思,也有譯作「塊級格式化範圍」。它是 W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其他元素的關係和相互作用。通俗的講,就是一個特殊的塊,內部有自己的布局方式,不受外邊元素的影響。

第十六問:那麼BFC的原理是什麼呢?

內部的Box會在垂直方向上一個接一個的放置

垂直方向上的距離由margin決定。(完整的說法是:屬於同一個BFC的兩個相鄰Box的margin會發生重疊(塌陷),與方向無關。)

每個元素的左外邊距與包含塊的左邊界相接觸(從左向右),即使浮動元素也是如此。(這說明BFC中子元素不會超出他的包含塊,而position為absolute的元素可以超出他的包含塊邊界)

BFC的區域不會與float的元素區域重疊

計算BFC的高度時,浮動子元素也參與計算

BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面元素,反之亦然

第十七問:BFC由什麼條件創立?

float屬性不為none

position屬性為absolute或fixed

display屬性為inline-block、table-cell、table-caption、flex、inline-flex

overflow屬性不為visible(- overflow: auto/ hidden;)

總結:pdfo


第十八問:BFC的使用場景有哪些呢

可以用來自適應布局。

<!-- BFC不與float重疊 -->    <section id="layout">        <style media="screen">          #layout{            background: red;          }          #layout .left{            float: left;            width: 100px;            height: 100px;            background: #664664;          }          #layout .right{            height: 110px;            background: #ccc;            overflow: auto;          }</style>        <div></div>        <div></div>        <!-- 利用BFC的這一個原理就可以實現兩欄布局,左邊定寬,右邊自適應。不會相互影響,哪怕高度不相等。-->    </section>


可以清除浮動:(塌陷問題)

<!-- BFC子元素即使是float也會參與計算 --><section id="float">    <style media="screen">      #float{        background: #434343;        overflow: auto;      }      #float .float{        float: left;        font-size: 30px;      }</style>    <div>我是浮動元素</div></section>


解決垂直邊距重疊:

<section id="margin">    <style>        #margin{            background: pink;            overflow: hidden;        }        #margin>p{            margin: 5px auto 25px;            background: red;        }        #margin>div>p {            margin: 5px auto 20px;            background: red;        }</style>    <p>1</p>    <div style="overflow:hidden">        <p>2</p>    </div>    <p>3</p>    <!-- 這樣就會出現第一個p標籤的margin-bottom不會和第二個p標籤的margin-top重疊,這也是BFC元素的另一個原則,不會影響到外邊的box,是一個獨立的區域。--></section>


第十九問:清除浮動的方法(最常用的4種)

這時候很多人會想到新建標籤clear:both和float 方法,但是這兩種方法並不推薦使用!

什麼是clear:both

clear:both:本質就是閉合浮動, 就是讓父盒子閉合出口和入口,不讓子盒子出來

額外標籤法(在最後一個浮動標籤後,新加一個標籤,給其設置clear:both;)(不推薦)

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <meta http-equiv="X-UA-Compatible" content="ie=edge">    <title>Document</title>    <style>    .fahter{        width: 400px;        border: 1px solid deeppink;    }    .big{        width: 200px;        height: 200px;        background: darkorange;        float: left;    }    .small{        width: 120px;        height: 120px;        background: darkmagenta;        float: left;    }    .footer{        width: 900px;        height: 100px;        background: darkslateblue;    }    .clear{        clear:both;    }</style></head><body>    <div>        <div>big</div>        <div>small</div>        <div>額外標籤法</div>    </div>    <div></div></body></html>

如果我們清除了浮動,父元素自動檢測子盒子最高的高度,然後與其同高。

優點:通俗易懂,方便

缺點:添加無意義標籤,語義化差

不建議使用。

父級添加overflow屬性(父元素添加overflow:hidden)(不推薦)

通過觸發BFC方式,實現清除浮動

.fahter{    width: 400px;    border: 1px solid deeppink;    overflow: hidden;}

優點:代碼簡潔

缺點:內容增多的時候容易造成不會自動換行導致內容被隱藏掉,無法顯示要溢出的元素

不推薦使用

使用after偽元素清除浮動(推薦使用)

.clearfix:after{/*偽元素是行內元素 正常瀏覽器清除浮動方法*/    content: "";    display: block;    height: 0;    clear:both;    visibility: hidden;}.clearfix{    *zoom: 1;/*ie6清除浮動的方式 *號只有IE6-IE7執行,其他瀏覽器不執行*/}
<body> <div> <div>big</div> <div>small</div> <!--<div>額外標籤法</div>--> </div> <div></div></body>

優點:符合閉合浮動思想,結構語義化正確

缺點:ie6-7不支持偽元素:after,使用zoom:1觸發hasLayout.

推薦使用

使用before和after雙偽元素清除浮動

 .clearfix:after,.clearfix:before{    content: "";    display: table;}.clearfix:after{    clear: both;}.clearfix{    *zoom: 1;}
<div> <div>big</div> <div>small</div> </div>
<div></div>

優點:代碼更簡潔

缺點:用zoom:1觸發hasLayout.

推薦使用

浮動父元素

img{  width:50px;  border:1px solid #8e8e8e;  float:left;}<div style="float:left">  <img src="images/search.jpg"/>  <img src="images/tel.jpg"/>  <img src="images/weixin.png"/>  <img src="images/nav_left.jpg"/></div>

這種方式也不推薦,了解即可。

如果有不對的地方歡迎留言交流與補充也希望您能把您的思考和遇到的問題以評論的方式補充下,後期,我將會補充到文章中

源自:https://juejin.im/post/6880111680153059341

聲明:文章著作權歸作者所有,如有侵權,請聯繫小編刪除。

相關焦點

  • HTML+CSS實戰系列——盒模型製作
    主要內容盒模型的概念標準盒模型怪異盒模型彈性盒模型CSS盒模型本質上是一個盒子,封裝周圍的HTML元素,它包括:邊距(margin),邊框(border),填充(padding),和實際內容(content)。盒模型允許我們在其它元素和周圍元素邊框之間的空間放置元素。
  • CSS Display屬性與盒模型
    本文首先引入CSS盒模型,然後通過不同的display屬性分別介紹Box常見的呈現方式。因為HTML流式文檔的特性,頁面布局往往是新手最為頭疼的問題之一。 每個HTML元素都會渲染為一個Box,可分為inline Box和block Box。 根據display屬性的不同,Box的呈現方式又有所不同。
  • CSS的盒子模型和浮動,都在這了
    點關注,不迷路,每天分享大量前端知識css中的盒子模型 css處理網頁時,他認為每個元素都包含在一個不可見的矩形盒子 盒子是由 內容區,內邊距(padding),邊框,外邊距(margin)組成在瀏覽器中,其默認樣式中存在一些body等元素存在的默認樣式,比如一些外邊距
  • DIV+CSS學習筆記總結篇:盒子模型和塊元素、行元素與溢出
    :盒子模型就是一個有高度和寬度的矩形區域所有html標籤都是盒子模型div標籤自定義盒子模型所有的標籤都是盒子模型class和id的主要差別是:class用於元素組(類似的元素,或者可以理解為某一類元素
  • CSS的盒子模型-最全語法
    盒子模型簡介概述:所謂盒子模型,就是把HTML頁面中的布局元素看作是一個矩形的盒子,也就是一個盛裝內容的容器。當這些元素都是盒子以後,我們的布局就變成了在頁面中擺放盒子。每個矩形都由元素的內容(content)、內邊距(padding)、邊框(border)和外邊距(margin)組成盒子模型特性:每個盒子都有:邊界、邊框、填充、內容 4個屬性;每個屬性都包括4個部分:上、右、下、左。屬性的4部分可以同時設置,也可以分別設置2.
  • 學習筆記 CSS內邊距如何設置?
    學習筆記 CSS內邊距如何設置? 你對CSS內邊距的設置方法是否熟悉,這裡向大家簡單介紹一下,元素的CSS內邊距在邊框和內容區之間,控制該區域最簡單的屬性是padding屬性。
  • 什麼HTML、CSS,其實就是word文檔!
    word工具欄——表格說到這裡肯定有同學問了:盒模型在哪裡?初次接觸盒模型時,我是完全懵了,完全不知道在說什麼,更別提在前端使用了,概念都沒搞清楚,學的也是雲裡霧裡。一個很簡單的東西,套上「盒模型」這三個字瞬間高大上了。
  • CSS沒那麼難,入門篇(一)
    我在剛接觸CSS時對CSS的了解並不精通,為了實現前端展示效果,當時寫樣式踩過不少坑,例如CSS樣式的權重問題,元素定位問題,浮動問題,樣式設置失效問題等,這些問題大多都是CSS基本功不紮實所導致的,下面將對CSS的語法、選擇器、常用屬性、盒子模型、浮動、定位、顯示、偽類和偽元素一一進行講解。
  • css樣式如何美化表格和邊框的外觀?
    如今大家習慣了使用DIV+CSS布局頁面,其實table+css曾經也是流行的頁面布局方式。下面深圳市博納網絡信息技術有限公司介紹css樣式如何美化表格和邊框的外觀。單一邊框雖然給表格添加了邊框,但是顯示的是多個邊框,其中包括了表格邊框、表頭邊框和單元格邊框,如果為表格添加下面的樣式,就可以將表格的邊框顯示為單一的邊框,效果如圖
  • 【教程】html+css零基礎入門教程之CSS邊框
    元素的邊框 (border) 是圍繞元素內容和內邊距的一條或多條線
  • 盒子模型怎麼畫?5步快速創建盒子模型教程
    盒子模型是在網頁設計中經常用到的一種思維模型。盒子模型的組成由內容、內邊距、邊框、外邊距這四大重要部分組成。文本、圖片、數據等這些都是內容,內容展現了盒子模型的信息內容;內邊距是內容和邊框之間的距離,善用內邊距可以指定內容和各邊框的距離;邊框是圍繞內容和內邊距的邊界,盒子模型規定了點線、虛線、實現等邊框樣式;外邊距是在邊框周圍的空間,外邊距的設置和使用跟內邊距類似。善用盒子模型可以使我們更加容易看清網頁的布局。
  • HTML+CSS 面試題整理(一)
    6.css盒模型:content、padding、border、margin(在 CSS 中,width 和 height 指的是內容區域(element)的寬度和高度。增加內邊距、邊框和外邊距不會影響內容區域的尺寸,但是會增加元素框的總尺寸)7.css引入樣式表的方式有:①外部樣式表 <head><link rel="stylesheet" type="text/css" src="style.css"></head>②內部樣式表 <head><style type="
  • css padding屬性設置元素內邊距
    padding屬性定義及用法在css中,padding屬性是一個簡寫屬性,用來設置所有內邊距屬性(填充),將上邊距屬性、右邊距屬性、下邊距屬性、左邊距屬性定義在同一個聲明中。、右內邊距、下內邊距、左內邊距;padding屬性有3個屬性值時:屬性值1和屬性值3分別定義上內邊距和下內邊距。
  • css3 box-sizing屬性筆記
    ,並把邊框和內邊距放入框中);Internet Explorer、Opera和Chrome瀏覽器支持box-sizing屬性,Firefox還不支持該屬性,但支持-moz-box-sizing屬性替代box-sizing屬性;box-sizing屬性語法格式box-sizing:
  • HTML CSS整理筆記
    ———6 盒子模型———39.盒子模型的組成:content網頁內容、border邊框、padding內邊距、margin外邊距(1)邊框border:  border-color 邊框顏色:如border-color:#369 #000 #111 #F00;按「上右下左順時針」設置  border-width 邊框粗細
  • CSS教程之超級快速入門教程
    CSS 能夠對網頁中元素位置的排版進行像素級精確控制,支持幾乎所有的字體字號樣式,擁有對網頁對象和模型樣式編輯的能力。深入學習請百度搜索「php中文網CSS視頻教程」,免費在線學習。">CSS樣式</style>;注意:代碼可維護性比較差,沒有實現CSS代碼與HTML結構分離,影響範圍只在當前頁面;外聯引入:在網頁外創建一個xx.css文件,網頁頭部中利用<link rel="stylesheet" type="text/css" href="xx.css">;
  • CSS padding屬性用法詳解
    CSS padding屬性用法詳解 本文向大家介紹一下CSS padding屬性的用法,元素的內邊距在邊框和內容區之間,控制該區域最簡單的屬性是padding屬性。
  • CSS padding屬性用法要點
    作者:admin來源:68tt.com|2010-08-25 13:33 本文向大家描述一下CSS padding屬性的用法,CSS padding 屬性定義元素邊框與元素內容之間的空白區域
  • css3必須了解的知識 css中常見的樣式屬性和值
    繼續上一篇文章的繼續了解css的基礎知識 全棧學習筆記,不同平臺不同的我!css中常見的樣式屬性和值字體與顏色背景屬性文本屬性邊框屬性內外邊距內邊距/*內邊距*/.padding{ padding: 2px;/*盒子模型的外邊距,上左下右 各向內縮進2px*/ padding-top:
  • 面試題:介紹一下盒子模型
    CSS 中的盒子模型有兩種類型,一種是 content-box,內容盒子,一種是 border-box 邊框盒子,通過 css 屬性 box-sizing 來設置。這兩種盒子計算寬高的方式不一樣。我們先來看一下 content-box 。