【问题标题】:Why anchor tag does not take height and width of its containing element为什么锚标记不占用其包含元素的高度和宽度
【发布时间】:2013-09-06 06:17:40
【问题描述】:

这是我的JsFiddle

当我使用 Chrome 开发人员工具检查锚标记的大小时,它会显示 144px*18px 用于第一个元素,310px*18px 用于第二个元素。

我想知道为什么它不占用包含元素的高度和宽度以及它是如何计算的。

.gallery {
    background-color: #abcdef;
}
.gallery img {
    display: inline-block;
    margin-left: 20px;
    margin-top: 20px;
}
.normal {
    height: 160px;
    width: 110px;
    border: 5px solid black;
}
.wide {
    height: 160px;
    width: 280px;
    border: 5px solid black;
}
<div class="gallery">
    <a href="#"> <img class="normal" src=""> </a>
    <a href="#"> <img class="wide" src=""> </a>
</div>

【问题讨论】:

  • 锚标签是内联元素。内联元素不会填充其容器的宽度,它们只会填充它们所包含内容的宽度。就这么简单。想一想,如果是块元素,那么你不能在一个句子中的单个单词上放置链接。

标签: html css


【解决方案1】:

另一种解决方案是使用带有img 元素的负margin-bottom 属性(大小取决于字体,因此,最好使用@font 规则来确定使用的字体,0.2em 很好此外,对于我使用的字体,使用 em 单位是一个好主意,因为大小取决于字体,因此,如果稍后更改字体大小,则不必更改此 CSS 代码):

HTML:

Something, <a href="#"><img src="whatever.png" alt="Whatever" /></a>, something else.

CSS:

a:link {
 display: inline-block;
}
img {
 margin-bottom: -0.2em;
}

这样,所有文本都与图像很好地对齐,无论它是否在链接中,我都这样做是为了让所有图像 + 文本块以相同的方式显示,但您可以使用 a &gt; img 而不是只是上面代码中的img

顺便说一句,我想出了这个解决方案,因为我有类似的东西:

a[something]:link::after {
 content=" something to add"
}

所以,img {display: block;} 对我来说不是一个选项,因为“要添加的东西”会在图像下方,其余的文字会在之后,这会切断阅读流程。

【讨论】:

    【解决方案2】:

    我有同样的问题,例如,我有 GitHub 风格的降价生成的 HTML,所以我可以有包含锚点的段落,里面有图像。

    实际上在锚点中设置display: inline-block 对我不起作用;我还在图片中设置了display: block。使用 Sass 嵌套的东西看起来像这样:

    .gallery {
      a {
          display: inline-block;
    
          img {
            display: block;
          }
      }
    }
    

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 使用浮动不是一个好主意,因为它会导致锚及其兄弟节点的主要布局副作用。
      • 我从来没有遇到过浮动的任何副作用。你能列出一些吗?
      【解决方案4】:

      a 标签也需要设置样式

      我加了

      .gallery a {
      display: inline-block;
      }
      

      【讨论】:

      • 这确实显示了链接在“检查元素工具”中采用其子项的高度,但它并没有使其可点击...
      【解决方案5】:

      CSS 2.1 spec

      盒子内容区域的尺寸——内容宽度和 内容高度——取决于几个因素:元素是否 生成框是否设置了“宽度”或“高度”属性 该框包含文本或其他框,框是否为表格等。 盒子的宽度和高度在视觉一章中讨论 格式化模型细节。

      &lt;a&gt; 元素默认显示值为inline。它的内容参与布局,所以它是一个non-replaced 元素。

      对于高度,规范说:

      10.6.1 Inline, non-replaced elements

      “高度”属性不适用。内容区域的高度 应以字体为准,但本规范未规定 如何。

      所以18px 是从单行文本中得出的,取自字体指标。较大的图像内容和包含的块大小都不起作用。

      对于宽度,规范说

      10.3.1 Inline, non-replaced elements

      “宽度”属性不适用。 'margin-left' 或 'margin-right' 的计算值 'auto' 变为使用值 '0'。

      换句话说,宽度由&lt;a&gt; 元素的内容、内边距、边框和边距决定。

      对于第一个 &lt;a&gt; 元素,它是 114px(内容 - 图片加一个空格)+ 20px(左边距)+ 2x5px(左右边框)= 144px

      对于第二个 &lt;a&gt; 元素,即 280px(内容 - 图像)+ 20px(左边距)+ 2x5px(左右边框)= 310px

      只需要考虑空格。元素被布置在内联上下文中的行框中,因此第一个 &lt;a&gt; 元素开头和第二个 &lt;a&gt; 元素末尾的空格被删除。第一个 &lt;a&gt; 元素末尾的空格和第二个 &lt;a&gt; 元素开头的空格被折叠成一个空格。当空间被折叠时,它总是第一个剩余的空间,在这种情况下是第一个 &lt;a&gt; 元素末尾的空间,所以这就是为什么空间参与第一个 &lt;a&gt; 元素的宽度而不是第二个的宽度。

      【讨论】:

      • 谢谢!对我来说,解释的关键部分是结束语:When spaces are collapsed, it's always the first space which remains, ... so that's why a space participates in the width of the first &lt;a&gt; element but not in the width of the second one.。头痛终于好了。
      • 这对我很重要:“ 元素默认显示值为 inline”
      【解决方案6】:

      anchor 默认总是display: inline。要使anchor 占用它的子空间,您必须给他一个display:block,或者在这种情况下,display:inline-block,这样它们将是inlineblock

      a{
          display:inline-block;
      }
      

      JSFiddle

      Read this question for more info.

      【讨论】:

      • 另外您可能需要将 line-height 属性设置为 0
      【解决方案7】:

      在锚点中使用display:inline-block

      .gallery a{
          display:inline-block;
      }
      

      这里更新jsFiddle File

      同时从图像中删除边距并将其添加到锚点

      .gallery a{
          display: inline-block;
          margin-left: 20px;
          margin-top: 20px;
      }
      

      【讨论】:

      • 我知道这会解决我的问题,但我想解释一下如果我们不提供 display: inline-block; 会发生这种情况的原因;
      • 我也很困惑是否应该为锚标签或 img 标签提供边距。你能告诉我哪一个好,为什么
      • anchor 是内联元素,我们需要将其设置为显示块或显示内联块以显示适当的宽度和高度,在图像中添加边距会占用带有锚标记的空白空间,所以我们为什么要添加锚边距。
      • 感谢您提供包含解决方案的简洁答案。
      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 2018-09-11
      • 2019-05-03
      • 1970-01-01
      • 2019-02-16
      • 2021-01-07
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多