【问题标题】:Inconsistency for displaying <li><img /></li><li><img /></li> 显示不一致
【发布时间】:2017-04-22 01:36:15
【问题描述】:

我对非常​​简单的 HTML 标记有疑问,它在 Chrome 和 Firefox 中呈现不同。我想知道这是否是其中一个错误。

代码很简单:

<ul>
    <li>
        <img />
    </li>
</ul>

问题在于,在 Chrome 中,&lt;li /&gt; 元素在顶部有一些填充,但前提是它的内容是图像。例如没有问题。文本。

小提琴示例:https://jsfiddle.net/8c4rujvu/1/

img {
  display: block;
  width: 500px;
}
li {
  border: 1px solid #f00;
}
<ul>
  <li>
    <img src="http://www.w3schools.com/css/trolltunga.jpg">
  </li>
  <li>
    <img src="http://www.w3schools.com/css/trolltunga.jpg">
  </li>
  <li>Some text</li>
</ul>

这是它在 Firefox (50.0.2) 中的显示方式:

在 Chrome 中(55.0.2883.75 m):

这里似乎有什么问题?

【问题讨论】:

  • 添加 list-style:none 将解决这两个问题
  • 这不是一个 hack,就像我们过去为旧的 IE 6 做的那样? :) 问题是为什么会这样。
  • 您需要在此处显示显示问题的完整的、最小的标记,而不是明天会改变或消失的 jsfiddle。
  • @Rob 也将代码添加为 sn-p :)

标签: html css image google-chrome firefox


【解决方案1】:

这个问题也可以简单地修复float:left属性,检查这个小提琴

https://jsfiddle.net/9wp619xz/

检查错误详细信息修复网站中的 Google Chrome 兼容性错误 - 常见问题解答

https://www.chromium.org/Home/chromecompatfaq

img {
  float:left;
  width: 500px;
}
li {
  border: 1px solid #f00;
  float:left;
  width:100%;
}
<ul>
  <li>
    <img src="http://www.w3schools.com/css/trolltunga.jpg">
  </li>
  <li>
    <img src="http://www.w3schools.com/css/trolltunga.jpg">
  </li>
  <li>Some text</li>
</ul>

【讨论】:

    【解决方案2】:

    解决方案有两个。

    1. 将图像设置为display: inline 可解决图像上方的空行。这个空行是nasty bug in Chrome。这个错误使得在默认列表项中使用/启动非内联元素实际上是不可能的。 如果你问我,这很重要。

    2. 添加vertical-align: top 会将列表标记置于顶部(您可能希望它位于该位置)。这也删除了内联图像下方不需要的空间。列表标记放置和内联元素下方的空白不是错误。这是预期的行为。

    这将导致 OP 的以下(简单)解决方法:

    img {
      width: 500px;
      vertical-align: top;
      /* display: inline; *//* This is default, thus can be omitted */
    }
    li {
      border: 1px solid #f00;
    }
    

    https://jsfiddle.net/8c4rujvu/3/

    【讨论】:

    • 这正是我要写的。 display: inline 在底部产生较小的间隙。 line-height 在这种情况下看起来像是 IE 6 的老好 hack ;)
    • 如果使用vertical-align: top,则没有多余的间隙。
    • 没错,但这仍然是某种黑客行为,不是吗?我可以使用其他解决方案,例如 &lt;li /&gt;display: block&lt;ul /&gt;list-style: none,但这不能回答主要问题 - 为什么会这样?
    • 这不是黑客。图像默认使用vertical align: bottom 呈现。这意味着列表项目符号将显示在图像的底部(而不是顶部)。 vertical-align: top 可以防止这种情况发生。作为一个意外的奖励,这个错误不会发生。但是,将display: blockline-height: 0 添加到
    • -items 是hacks。
    【解决方案3】:

    这是由这两种浏览器在渲染 UL/LI 元素时采用的两种不同方法引起的。我认为从一开始就很清楚:)

    这里的问题不在于内联元素的行为方式!

    这里的问题是列表样式属性在这两种浏览器中的行为方式!


    如果你注意到,间隙的大小是 18px,这是 chrome 中的默认行高!如果你为li增加font-size,那么点标记的大小也会随着图像与div顶部边缘的距离而增加。

    如果 Firefox,该点标记或 list-style-type 组件充当绝对定位元素,因此之后的任何元素只需从 li top-left 边缘开始即可。

    但在 Chrome 中,该点标记或list-style-type 组件充当内联元素,并且与任何其他内联元素一样,将允许内联/浮动元素与自身处于同一行。因此,本质上是内联的文本在点旁边开始!这也适用于图像、按钮、链接、跨度或任何此类元素!

    现在,您认为问题在于这些元素的完全正常行为。即使两个元素是浮动的或内联的,如果它们不能进入父元素的水平宽度,后一个元素会下降到下一行! display:block 元素也是如此,因为它们默认从新行开始!

    在您的示例图像中有display:block,因此它们将始终从新行开始!但是,即使您删除了该属性,静止图像也很大以适合父级,因此它会掉落并显示间隙。 (这仅适用于较小的屏幕,在较大的屏幕上这不会成为 inline-block 图像的问题)

    再一次,奇怪的是,在这种情况下,div 充当了一个内联元素,即使您将宽度设置为 100% 以上!由此我得出结论,如果可以包装内容,则该元素从新行开始,但如果内容不能包装,则它从新行开始!

    注意: 这是基于我的观察和过去的经验!如果有人有此案例的官方文档链接,请在此处粘贴。也欢迎任何改进此答案的建议。

    我已经用更多示例更新了您的 JSFiddle:https://jsfiddle.net/8c4rujvu/5/

    【讨论】:

    • 感谢您的回答。 @kukkuz 在 Chrome 错误跟踪器中发现了导致此换行符的错误。你可能想看看这个答案。我认为承认这是一个意想不到的错误会改善你的答案。
    【解决方案4】:

    这是由于display: list-item 的默认浏览器/用户代理样式不同。

    作为一个修复,您可以使用inline-blockvertical-align:top(甚至只是vertical-align: top)来获取img 的常见行为 - 请参阅下面的演示:

    img {
      display: inline-block;
      vertical-align: top;
      width: 500px;
    }
    li {
      border: 1px solid #f00;
    }
    <ul>
      <li>
        <img src="http://www.w3schools.com/css/trolltunga.jpg">
      </li>
      <li>
        <img src="http://www.w3schools.com/css/trolltunga.jpg">
      </li>
      <li>
        Some text
      </li>
    </ul>

    您可能想查看的相关问题Why alignment mark list is different on WebKit when using :before height?

    为什么会这样?

    鉴于其他浏览器在这方面不同意 chrome,这显然看起来像一个错误,并且它。查看 Chromium Bug Tracker 中记录的这个未解决的错误:

    Table inside list item rendered at wrong position(示例网址http://jsfiddle.net/P8Ua7/)

    查看 bug 中的其中一个 cmets 的摘录:

    不限于表格。将 flexbox 放在列表项中会给出 同样的结果。如果您替换了显示为的内容,也会发生这种情况 块。

    OP 有一个显示为块的图像(这是一个内联替换元素)!

    这里是another bug you may want to check out

    【讨论】:

    • display: inline-block 在底部产生间隙,这就是我想使用display: block 的原因,特别是如果&lt;img /&gt; 将被&lt;a /&gt; 包裹
    • @KrzysztofSowa 底部的 gap 将由vertical-align 属性处理...
    • 感谢您的努力,我很感激。为了不重复我自己,请查看我的其他评论:stackoverflow.com/questions/41011876/…
    • 谢谢,原因是 Firefox 和 Chrome 的 list-item 实现不同——你可能想看看 at this question too...
    【解决方案5】:

    这通常是由于浏览器的默认样式。为了解决这个问题,我建议使用规范化 css 样式表或为元素添加自己的 css。

    【讨论】:

    • 您会推荐哪种规范化 CSS 样式表?我已经在使用一个,但看起来它不适用于这种情况。
    • 这似乎与浏览器默认设置无关。我认为规范化不会有帮助。
    【解决方案6】:

    为你的 HTML 试试这段代码

    ul li {
    display:block;
    }
    

    img {
      display: block;
      width: 500px;
    }
    
    li {
      border: 1px solid #f00;
      display:block;
    }
    <ul>
      <li><img src="http://www.w3schools.com/css/trolltunga.jpg"></li>
      <li>
        <img src="http://www.w3schools.com/css/trolltunga.jpg">
      </li>
      <li>
        Some text
      </li>
    </ul>

    【讨论】:

    • @kukkuz 但也许这是需要作者的最简单的解决方案
    • @iXplo 重置display 或重置list-style 但是不允许您使用项目符号/编号,如果需要的话...
    • 是的,“如果需要的话”。你仍然可以使用 bg-images 或 ::before
    • @iXplo 这就是我的意思,resetting 将要求您使用伪元素并创建项目符号/数字...如果目标是使用 @987654327 的默认项目符号@那你为什么要这样做?
    • ul 通常用于相同类型的块,因为它更短并且始终具有父级(固定结构)。与css级联更有效
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签