图片的高度是40px,然后在a标签下包裹一个img标签,为什么a标签的高度比img标签的高度还要小, a标签的高度才是21px?

图片的高度是40px,然后在<a>标签下包裹一个<img>标签,为什么<a>标签的高度比<img>标签的高度还要小,
<a>标签的高度才是21px?
先看代码:
或者在JSBIN中查看运行效果:https://jsbin.com/fokuyamijo/edit?html,css,output
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
  <style>
    *{ margin:0; padding:0;}  
  </style>
</head>
<body>
  <a href="">
    <img src="http://file.baixing.net/201709/cdfc1b368dfeb5198a5bf25f9ab30e91.png" alt="">
  </a>
</body>
</html>
运行效果:
<img>标签的高度:

图片描述

<a>标签的高度:

图片描述

阅读 4.5k
3 个回答

当你给a标签设置一下css,font-size:0,你会惊奇的发现a标签失去了高度,所以,你懂的。

更新:快下班了给你写个完整的,省的一直追问了。

a标签是行内元素,不能拿来包裹块级元素。
既然a是行内元素,那么它的高度自然不会受其包裹的子元素影响,而浏览器给行内元素设置的最小高度是21px,因为a里有内容,却是个图片,所以自然a的高度就是21px了。

如果你想解决这个问题,a{dispaly:inline-block;font-size:0}
万事ok,下班回家。

采纳的答案其实不太准确。

a标签是行内元素,理论上是不能拿来做包裹其他元素的容器

这个说法是没有根据的。行内级别元素嵌套行内级别元素是允许且建议的,见 MDNWHATWG

要理解为什么会出现两个高度需要理解 IFC 的概念。

  1. <a> 在这里是属于行内级别的非替换元素,它是以透明的方式参与 <body> 宣布的 IFC 。
  2. 其内部的 <img> 在这里是属于行内级别的替换元素,以不透明的方式穿过透明的 <a> 与之处于同一个 IFC 。

行内级别的非替换元素计算高度只跟字体、margin、padding 和 border 有关。因为 <a> 不为空,这个最小高度由一个叫 strut 的假想盒子决定。

那么最后两个高度怎么排的?

行内盒子(inline box)在 IFC 中横向排成一行一行的行盒子(line box),所以这里整体的高度计算就是行高计算。过于简单地总结就是将盒子一个个排上取最高和最低的位置。

你可以想象 <img><a> 切开了。如果 <img> 周围还有其它行内元素,它们也会按各自的盒子计算高度。

a标签是行内标签,行内标签的高度是不能改变的

如果你想要a标签和img标签有一样的高度的话,只要把a标签设置为块状元素即可

a{
    display: block;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏