爲什麼p元素內不能嵌套Div元素(隨筆)

在說明這個問題之前,我們先來回顧一個塊級元素與內聯:我們知道

內聯元素可以嵌套內聯元素,塊級元素可以嵌套部分塊級元素並也能嵌套內聯元素,但內聯元素不能嵌套塊級元素。塊級元素爲block,內聯元素爲inline,擁有“inline”特性的同時又擁有“block”的特性稱爲replace元素。



在實際開發中,有時會犯一個小錯誤:

<p>這是p元素的開始 >span元素1</span>和<span>span元素2</span></p>

<p>這是p元素的開始 
  <div>div元素1</div>
  <div>div元素2</div>
  這是p元素的結束
</p>

它的效果會出乎意料:



代碼中,在<p>元素中嵌套了兩個<span>元素,它們按照瀏覽器的渲染正常顯示。但當在<p>元素中嵌套兩個 <div>元素時,我們會發現,<div>分別在一行顯示,而此時"p元素的開始"與"p元素的結束"也在不同的一行顯示,與我們想要的(這兩段文字在一行顯示)相反。它們也均在不同行顯示。這是什麼原因呢?


原來,在<p>元素中是不能嵌套<div>元素的,在<p>標籤還沒結束時,遇到下一個塊級元素就會自動結束。即:

<p>元素的開始
<p>元素的開始

它的開始標籤會被瀏覽器會解析爲:

<p>元素的開始</p>
<p>元素的開始</p>

它的結束標籤同樣也會被解析爲一個<p>元素。


於是前面書寫的代碼:

 <p>這是p元素的開始 
   <div>div元素1</div>
   <div>div元素2</div>
   這是p元素的結束
 </p>

實際上被解析成了:

<p>這是p元素的開始 </p>
  <div>div元素1</div>
  <div>div元素2</div>
 <p>這是p元素的結束</p>

也就是說,一個p元素會被解析成兩個p元素,兩個會被解析成四個。照這樣依次類推下去。


我們來看瀏覽器把這段代碼解析成的形式:



即使我們爲<div>添加樣式,將它變成內聯元素形式:

<p>這是p元素的開始 </p>
  <div style="display: inline">div元素1</div>
  <div style="display: inline">div元素2</div>
  這是p元素的結束
</p>

它的效果還是:




我們再用JavaScript代碼來檢索一個頁面中的p元素:

<body>

  <p>這是p元素的開始 >span元素1</span>和<span>span元素2</span></p>
  
  <p>這是p元素的開始 </p>
    <div style="display: inline">div元素1</div>
    <div style="display: inline">div元素2</div>
    這是p元素的結束
  </p>

  <script>
     var p = document.querySelectorAll("p"); //查找p元素
     console.log(p.length); // 3個元素
 </script>
</body>

按原來的思維來說,此時應該會返回2,表示頁面中有兩個p元素,



但我們會驚訝地發現,代碼返回了3,也就表示瀏覽器解析爲3個p元素。


因此得出結論:

在p元素是不能嵌套Div元素的,它會被瀏覽器解析爲頁面中p元素的兩倍數量,也就是開始標籤被解析爲一個p元素,結束標籤被解析爲一個p元素。



元素的三個類別

那哪些塊元素裏面不能放哪些塊元素呢?我們可以先把所有的塊元素再次劃分成幾個級別的,我們已經知道<html>是在最外層,<html>下一級裏面只會有<head>、<body>、<frameset>、<noframes>。而我們已經知道了可視的元素只會出現在<body>裏,所以我們把<body>劃在第一個級裏面,接着,把不可以自由嵌套的元素劃在第三個級,其他的就歸進第二個級。所謂的不可自由嵌套的元素就是裏面只能放內聯元素的,它們包括有:標題標記的<h1>、<h2>、<h3>、<h4>、<h5>、<h6>、<caption>段落標記的<p>分隔線<hr>和一個特別的元素<dt>(它只存在於列表元素<dl>的子一級)。

爲什麼說第二級的元素可以自由嵌套呢?我們可以把它們看成是一些容器(或者說是盒子), 這些容器的大小可以自由變化,例如我們可以把<ul>嵌在<div>裏面,也可以把<div>嵌在<li>裏面。

在HTML裏有幾個元素是比較特別的:<ul>、<ol>、<dl>、<table>,它們的子一層必須是指定元素,<ul>、<ol>的子一級必須是<li>;<dl>的子一級必須是<dt>或者<dd>;<table>的子一層必須是<caption> 或<thead>、<tfoot>、<tbody>等,而再子一層必須是<tr> (<tr>只存在於<thead>、<tfoot>、<tbody>中),之後纔是可放內容的<td>或者<th>。


<img>和<input>有着其它內聯元素沒有的寬和高。它們在"inline"的情況下又有"black"的特性,W3C稱之爲replace元素。


最後總結匯總

1、塊元素可以包含內聯元素或某些塊元素(p元素中嵌套Div元素是錯誤的做法) ,但內聯元素卻不能包含塊元素,它只能包含其他的內聯元素

2、p元素中是不能嵌套塊級元素的。

3、重點:塊狀元素的三個級別

4、內聯元素的img 與 input比較特殊,他們有內聯元素沒有的寬高,w3c定義爲replace元素,將元素設置爲display:inline-block,模擬的就是replace元素。

發佈了109 篇原創文章 · 獲贊 56 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章