【问题标题】:Ignore whitespace in HTML [duplicate]忽略 HTML 中的空格 [重复]
【发布时间】:2011-02-07 08:31:03
【问题描述】:

HTML/CSS 中是否有任何内容告诉浏览器完全忽略空格?

很多时候,当您想将两张图片并排放置时 - 您拼命尝试保持 HTML 的可读性,但浏览器在它们之间放置了一个空格。

所以不要像这样:

<img src="images/minithing.jpg" alt="my mini thing" />
<img src="images/minithing.jpg" alt="my mini thing" />
<img src="images/minithing.jpg" alt="my mini thing" />
<img src="images/minithing.jpg" alt="my mini thing" />

你最终得到了这个

<img src="images/minithing.jpg" alt="my mini thing" /><img src="images/minithing.jpg" alt="my mini thing" /><img src="images/minithing.jpg" alt="my mini thing" /><img src="images/minithing.jpg" alt="my mini thing" />

这太可怕了!

【问题讨论】:

  • 与问题无关:HTML 和 XHTML 之间存在细微差别。您说的是 HTML,但发布了 XHTML 代码(在 HTML 中,img 标签是一个短标签)。
  • 查看我在这个问题中的回答,了解现在相关的全套选项:stackoverflow.com/questions/14630061/…
  • display: table-cell 在我测试过的所有浏览器中都很好用。
  • 这一定是我们 Web 开发人员/设计师遇到的最烦人的问题之一。我不敢相信它还没有被修复,真的。

标签: html css whitespace


【解决方案1】:

很遗憾,换行符算作空格字符。

我想出的最佳解决方案是使用标签本身内部的空格,而不是外部:

  <img src="images/minithing.jpg" alt="my mini thing" 
/><img src="images/minithing.jpg" alt="my mini thing"
/><img src="images/minithing.jpg" alt="my mini thing"
/><img src="images/minithing.jpg" alt="my mini thing" />

这也不理想,我知道。但至少它不是一些奇怪的 CSS hack,它依赖于渲染空格字符的大小或诉诸相对定位,或者 JavaScript :)

【讨论】:

  • 我也用过这个,虽然它确实会导致一些较弱的 HTML 工具非常糟糕。 (没有那么多 XHTML。)
  • +1 表示我在九十年代发明的一种风格。 ;) 我确定我不是第一个这样做的人(而且我没有使用斜杠,因为当时没有 XHTML),但在我有 的日子里,这是编写 HTML 的一种常规方式很多图像必须完美对齐,没有间隙。 :) 我有时仍然会这样做,因为我不喜欢在不应该有文本节点的地方出现,而且我认为 CSS 不适合从 DOM 中删除原本不应该存在的东西。用 0px 字体书写的空白是不一样的 - 它就像 1px 透明 GIF 一样 - 而是 backwords。
  • 回滚到原来的答案,因为这种奇怪的格式是实际的解决方案。
  • 我投了反对票,因为现在有更好的解决方案。 Stackoverflow 旨在发展 :)
【解决方案2】:

哦,你可以用a single line of CSS很容易做到这一点:

#parent_of_imgs { white-space-collapse: discard; }

缺点,你问? 目前还没有浏览器实现了这个非常有用的功能(想想一般的内联块)。 :-(

我时不时做的,虽然夜深了难看,但就是用cmets:

<p><!--
  --><img src="." alt="" /><!--
  --><img src="." alt="" /><!--
  --><img src="." alt="" /><!--
  --><img src="." alt="" /><!--
--></p>

【讨论】:

  • 显然该属性已重命名很多;截至目前,该页面显示“重大变化……2011 年 2 月……将‘white-space-collapses’重命名为‘bikeshedding’。”
  • 后来 css 工作组会议纪要说这将是 text-space-collapse。
  • CSS 将是 text-space-collapse:trim-inner 与规范的最新变化
  • 它已移至第 4 级,dev.w3.org/csswg/css4-text/#white-space-collapsing,这对我们来说意味着遥远的未来:-(
  • 在父容器上设置 white-space: nowrap; 最近对我有用。
【解决方案3】:

试试这个 CSS:

img { display: table-cell; }

【讨论】:

  • 这在我的情况下没有任何作用,但在 Chrome 44 中使用父元素上的display: table
【解决方案4】:

对此的最新解决方案是在外部容器上使用display: flex,您可以通过以下示例进行尝试:

Codepen →

(是的,Flexbox 正在得到广泛支持:http://caniuse.com/#search=flexbox

HTML:

<!-- Disregard spaces between inline-block elements? -->
<div class="box">
  <span></span>
  <span></span>
  <span></span>
</div>

CSS

.box {
  display: flex;
  display: -webkit-flex;    
}

span {
  display: inline-block;
  width: 30px;
  height: 30px;
  background-color: #fcf;
  border: 2px solid #f9f;
}

更新:另外,如果您希望您的项目可以换行(就像标准的内联块元素一样),请不要忘记将 flex-wrap: wrap 添加到您的 flexbox 容器中。

【讨论】:

  • Flexbox FTW- 参见 herehereherehere
  • Flex 不受广泛支持。您被 caniuse 页面上的绿色数量所迷惑。 Safari 9 之前的 Safari 版本以及较旧的 iPad 或较旧的 iPhone 都不支持它。
  • @CrystalMiller 这当然取决于您对“广泛”的定义。我认为 94%+ 是“足够宽的”。你的情况可能不同。我没有说它被 100% 的浏览器支持。
  • 虽然我同意它确实取决于您需要支持什么,但我不会说对 flex 的支持率是 94%,因为任何旧的 Safari 版本(移动或桌面)也不是 IE(直到 11 并且几乎没有 IE 用户使用 IE11)和只有某些版本的 Firefox。我在网站的某些部分使用了 flex,我发现我的大部分用户没有看到网站 flex。
  • 很好的解决方案。如果你必须支持 pre-flexbox,我很同情你。
【解决方案5】:

您可以将容器font-size设置为0white-space就消失了!

【讨论】:

  • +1。这是一个可怕的 hack,但它确实有效,并且在不支持 white-space-collapse 风格的情况下似乎是最好的解决方案。 (但请注意:如果子元素中有文本,您还需要为它们再次将字体大小设置回正常,否则您的所有内容都会消失)
  • 您也无法使用百分比来表示字体大小,因为它们被计算为父容器的百分比(将为 0)
  • 有趣的是,这适用于 Chrome,但不适用于 Safari(已测试 Chrome 22、Safari 5.1.7)。如果您指定高度为 1px,它可以在 Safari 中使用。
  • 当您使用 em 单元时,此解决方案也不起作用。但是您可以改用 rem 单位(广泛实施)。我认为rem单位更实用。那么你可以根据需要使用 font-size 0
  • 您可以使用#container &gt; * { font-size: initial; } 之类的方式恢复容器子元素的字体大小。
【解决方案6】:

如果您使用的是 php,这将非常有效。我找到了解决方案here

我最初是在用 simplexml 之类的东西解析 html 后寻找删除仅包含 whitespace 的文本节点的东西,但这要便宜得多。

<?ob_start(function($html) {return preg_replace('/>\s+</','><',$html);});?>
    <img src='./mlp.png'/>
    <img src='./dbz.png'/>
    <img src='./b10af.png'/>
    <img src='./fma.png'/>
<?ob_end_flush;?>

【讨论】:

    【解决方案7】:

    这个解决方案有什么困难?

    css

    .no-whitespace {
        line-height: 0;
        font-size: 0;
    }
    

    html

    <span class="no-whitespace">
    
        <a href=# title='image 1'>
           <img src='/img/img1.jpg' alt='img1'/>
        </a>
    
        <a href=# title='image 2'>
           <img src='/img/img2.jpg' alt='img2'/>
        </a>
    
        <a href=# title='image 3'>
           <img src='/img/img3.jpg' alt='img3'/>
        </a>
    
    </span>
    

    【讨论】:

    • 虽然这有可能“取消”嵌套字体大小,但这是我最喜欢的解决方案。
    • 不好。这些属性是继承的...
    • @brunoais 是的,这种技术的唯一警告是您必须显式重置子元素上的font-size
    • 1) 这不适用于 Safari。 2)如果您不使用 px 来定义您的网站,现在更有可能),这真的会弄乱内容。
    【解决方案8】:

    缩小您的 HTML!

    最好在响应呈现给浏览器之前缩小响应。

    因此,除非您需要空格(并且您使用 &amp;nbsp; 对其进行硬编码),否则您始终会在缩小过程中删除空格。

    【讨论】:

    • 实际上,也许你对缩小 HTML 是正确的。 +1。 (我听不懂@Evan 在说什么)
    • 我认为好的缩小器应该(根据定义)不通过缩小过程对文档引入语义变化。因此,如果您的压缩程序当前删除了空格,请注意他们何时“修复”该错误。
    • 我同意它不应该进行语义更改。是的。
    • 智能缩小器应该在这种情况下删除空格,因为在某些情况下使用inline-block时可能需要它们。
    • 但它应该删除换行符,因为它们没有忠实地呈现。
    【解决方案9】:
    <style>
      img {
         display: table-cell
      }
    </style>
    <img src="images/minithing.jpg" alt="my mini thing" />...
    

    好吧,我可能很幸运,因为我现在只需要担心让它在 webkit(特别是嵌入在 QT 中的那个)中工作,因此它也可以在 Chrome 和 Safari 中工作。似乎display: table-cell 具有显示的所有优点:inline-block,但没有空白的缺点(想想缩进的 td)

    【讨论】:

    • 使用inline-block 可以做的一件事是table-cell 无法做到的:通过在父元素上设置text-align,将所有元素向右或居中对齐。
    • 合法性的最佳选择。在 IE
    • 根据caniuse.com/#search=table-cell,它可以在除IE 6+7之外的所有浏览器中使用。所以它也应该在 IE8 中工作。
    【解决方案10】:

    这是一个简单的问题,答案并不那么简单。

    可以尝试避免源代码中的空格,这在 CMS 中并不总是可以实现,因为它们是由系统自动插入的。如果你想改变这一点,你必须深入挖掘 CMS 的核心代码。

    然后您可以尝试使用左浮动图像。但这很危险。起初,您实际上并不能根据定义控制垂直对齐。其次,如果你有太多的浮动元素,你会陷入完全的混乱,以至于它们超过了一条线。如果你有一个依赖于左浮动元素的布局(今天大多数都是这样做的),你甚至可以打破一些外部浮动样式,如果你在图像之后清除浮动。如果您浮动任何周围的元素,这可以被覆盖。而不是推荐。

    因此,唯一的解决方案是处理空白处理过程的 CSS 声明。这不是任何标准的一部分(因为 CSS 3 尚未完成)。

    我更喜欢 HTML 变体中没有空格。使用 drupal 作为 CMS,这可以在您的 template.php 和主题文件中轻松实现。然后我选择 inline-block。

    附: inline-block 在不同的浏览器中是相当复杂的。 对于 FF 2,您需要显示:-moz-inline-box。 其余的和 IE8 可以有 display: inline-block 之后。 对于 lte IE 7,您需要 display: inline 在以下单独的声明中(最好通过条件 cmets)。

    编辑

    我用什么来制作元素内联块

    elem.inline {
      display: -moz-inline-box; /* FF2 */ 
      display: inline-block; /* gives hasLayout in IE 6+7*/
    }
    /* * html hack for IE 6 */
    * html elem.inline {
      display: inline; /* elements with hasLayout and display inline behave like inline-block */
    }
    /* * +  html hack for IE 7 */
    * + html elem.inline {
      display: inline; /* elements with hasLayout and display inline behave like inline-block */
    }
    

    【讨论】:

      【解决方案11】:

      在大多数情况下,当它靠近块元素时,浏览器会忽略空格。

      图像的问题(在这种情况下)是它们是内联元素,所以当你将它们写在不同的行上时,它们实际上是同一行上的元素,它们之间有一个空格(因为换行符算作一个空格)。浏览器删除图像之间的空格是不正确的,在它们之间写入带有换行符的图像标签应该与在它们之间带有空格的同一行上写入图像标签的处理方式相同。

      您可以使用 CSS 使图像成为块元素并使它们彼此相邻浮动,这解决了很多间距问题,包括图像之间的空间和图像下方文本行的间距。

      【讨论】:

      • 我认为使用 CSS 来破解可以在 HTML 源代码中很容易修复的东西是矫枉过正的,并且可能会在任何复杂的布局中给您带来问题。它也不能很好地降解。
      • @Lee:对不起,你弄错了。 (请参阅 IP 对 Matts 的回答对您的回答发表评论。)
      • @Jon:这不是“乱搞”什么东西。布局最好由 CSS 控制,因此指定图像的显示方式实际上应该在 CSS 中而不是在 HTML 中。
      • 如果您必须浮动图像,那就是黑客行为(如果它们与其他内容内联怎么办?现在您必须浮动所有内容。如果已经有其他内容浮动怎么办?现在您必须打破页面的语义布局来处理它)或使用依赖于空间字符呈现大小的相对定位。
      • @Jon:你和“黑客”有什么关系?浮动图像是解决在某些情况下有效的问题的一种方法。我既没有说它是唯一的解决方案,也没有说它总是适用的。
      【解决方案12】:

      图像是默认的内联元素,这就是为什么你会在它们之间看到空白。如果您在屏幕阅读器中聆听您的示例,您会立即知道原因:没有空格,您会听到:

      我的小东西我的小东西我的小东西我的小东西

      因此,请使用my mini thing.(末尾的点加空格)作为替代文本或将图像与 CSS 一起推送。不要只删除代码中的空格。

      【讨论】:

      • 你从哪里得到image是某种空白的想法,alt是填充它以形成语法和准时正确的句子的方法,而不是alt是图片的简短描述?
      • 通过收听JAWS 并在没有图像的情况下浏览。
      • 有趣的见解。我认为这强调了这个问题的真正原因:图像是默认内联的。如果您不使用图像作为内联元素,请确保将它们声明为块状。
      猜你喜欢
      • 1970-01-01
      • 2018-04-24
      • 2016-01-28
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      相关资源
      最近更新 更多