为什么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元素。

  • 13
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值