使用换行符时删除HTML元素之间的空格


110

我有一行大约10 imgs的页面。为了提高HTML的可读性,我想在每个img标签之间插入一个换行符,但是这样做会在图像之间呈现空白,这是我所不希望的。除了在标签中间而不是在标签中间打断之外,我还能做些其他事情吗?

编辑:这是我到目前为止的屏幕截图。我希望使用PHP以随机组合显示书脊图像。这就是为什么我需要单独的img标签的原因。

屏幕截图


如果您使用的是Smarty,则可以使用{strip}其他模板引擎应具有类似的标签。
用户

Answers:


68

您可以使用CSS。在图像上设置display:block或float:left将使您可以定义自己的间距并按需要设置HTML格式,但会以可能适合或不合适的方式影响布局。

否则,您将处理内联内容,因此HTML格式很重要-因为图像将有效地像单词一样。


这是我最喜欢的方法。虽然,这有时会导致我感到奇怪,如果我随后忘记为子元素定义字体大小,为什么不显示文本。
天文学家

159

对不起,如果这是旧的,但我刚刚找到了解决方案。

尝试将其设置font-size为0。这样,图像之间的空白宽度将为0,并且图像不会受到影响。

不知道这是否适用于所有浏览器,但我尝试使用Chromium并尝试使用某些<li>元素display: inline-block;


9
我可以确认它可以在Mac OSX上的Firefox和Safari以及Chrome上运行。我无法相信这不是最佳答案。真是一个好主意,我认为唯一能真正回答问题的人/为询问者提供了他们想要的东西。
道格

16
但这会破坏使用em单元的布局。
devius 2014年

6
设置font-size为0表示您em在那之后不能将其用于可扩展设计。对于某些人来说,这个答案是没有用的。
LB-- 2015年

3
我还将在克里斯·科耶尔(Chris Coyier)的页面上的“将字体大小设置为零”部分下进行分析,以了解在其他情况下可能不起作用的情况:css-tricks.com/fighting-the-space-between -inline-block-elements
克里斯·肯本

现在有了flexbox,就不再需要所有这些了:)终于有了
opatut 2015年

70

您可以使用注释。

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

我会担心并排放置一系列图像的语义。


1
好主意。图像用于装饰-语义上重要吗?
Skilldrick

13
装饰图片属于CSS,而不属于HTML!
康拉德·鲁道夫

11
这取决于图像的装饰性。漂亮的边框?那应该在CSS中。一系列有关飞行站点的飞机小照片?可能满足要求而无需文本。
昆汀2009年

1
@MihaiAlexandruBîrsan- font-size:0在很多情况下都是可怕的,因为您失去了继承权。是的,您可以使用rem单位,但是,媒体查询仍将停止该元素的功能,并且您将必须全部对其进行修改
vsync

1
我刚刚发现了这个小把戏,然后看到了您的答案。有点儿麻烦,但是要使HTML不在一排排的长线中走很长一段路。
尼克·贝德福德

26

您有两种选择,而无需使用CSS进行近似处理。第一种选择是使用javascript从标记中删除仅包含空格的子代。一个更好的选择是利用空白可以存在于标签内部而没有含义的事实。像这样:

<div id="[divContainer_Id]"
    ><img src="[image1_url]" alt="img1"
    /><img src="[image2_url]" alt="img2"
    /><img src="[image3_url]" alt="img3"
    /><img src="[image4_url]" alt="img4"
    /><img src="[image5_url]" alt="img5"
    /><img src="[image6_url]" alt="img6"
/></div>

2
我实际上更喜欢这种风格。是的,这很丑陋,但它不需要可能具有各种副作用的CSS hack。
Stijn de Witt 2015年

24

Flexbox可以轻松解决此旧问题:

.image-wrapper {
  display: flex;
}

有关flexbox的更多信息:https ://css-tricks.com/snippets/css/a-guide-to-flexbox/


4
如今,Flexbox是最干净,最简单的解决方案。我认为这应该是这里的最佳答案。{ flex-direction: row; flex-wrap: nowrap; }可以添加以提高可读性。
罗伯特·库兹尼尔

2
这是最好的现代答案
Nate 19'9

@RobertKusznier我不同意指定flex-direction: rowflex-wrap: nowrap,无论如何它们都是默认值。保持简单通常是最好的!而且,实际上大多数时候用户会想要flex-wrap: wrap
Marc.2377 '19

13

经过大量的研究,反复试验,我发现一种似乎可以正常工作的方法,不需要手动在子元素上手动重新设置字体大小,从而使我可以在整个文档中使用标准化的em字体大小。

在Firefox中,这非常简单,只需word-spacing: -1em在父元素上进行设置即可。出于某种原因,Chrome忽略了这一点(据我测试,无论值如何,它都会忽略字距)。因此,除此以外,我还添加letter-spacing: -.31em了父母和letter-spacing: normal孩子。em的这一部分仅是您的em大小标准化后的空间大小。Firefox反过来会忽略字母间距的负值,因此不会将其添加到单词间距中。

我在Firefox 13(win / ubuntu,Android 14),Google Chrome 20(win / ubuntu),ICS 4.0.4和IE 9上的Android浏览器上对此进行了测试。我很想说这也可以在Safari上运行,但我真的不知道

这是一个演示http://jsbin.com/acucam


1
以我的专业意见,这是最好的解决方案。我在台式机上的Safari 5和6以及第二代iPad上的Mobile Safari中进行了测试。它确实起作用,但是,在重置孩子的字母间距时,还需要包括单词间距:normal; Safari对此表示敬意。干得好,Flatline!
hndcrftd

2
word-spacing: -1em样式似乎使单词在当前版本的Chrome中重叠。
山姆

@Sam令人难以置信的长时间延迟很抱歉:PI将word-spacing更改为0.05,似乎新版本的firefox不太在乎该属性,字母间隔就足够了。我现在在Ubuntu上,因此尚未在Windows上对其进行测试。这是更新的版本jsbin.com/acucam/14
Flatline

1
您尝试使用其他字体吗?这似乎异常常规,非常有可能打破。
dudewad

12

我来不及了(我只是问了一个问题,并在相关章节中找到了答案),但我认为display:table-cell; 是更好的解决方案

<style>
img {display:table-cell;}
</style>

<img src="img1.gif">
<img src="img2.gif">
<img src="img3.gif">

唯一的问题是它将无法在IE 7和更低版本上运行,但多数民众赞成可以通过黑客修复


这很好,但是唯一的缺点是,如果元素的父级具有text-align:center;,则它们将失去浮动中心的能力。
Mladen Janjetovic

可以解决,但如果您可能希望仅通过text-align将img对齐到右侧:right(在父级且没有浮动)–解决方案不适合您。
Herr_Hansen 2014年

2
可能可行,但某些屏幕display: table-*阅读器会进行语义解释,并像用户正在浏览表一样读出。
Tarka

5

使用CSS样式表来解决此问题,例如以下代码。

[divContainer_Id] img
{
    display:block;
    float:left;
    border:0;
}

替代文本http://rabu4g.bay.livefilestore.com/y1pWoAOBMiLumd2iQTAreYjQCDIkHImh2g_b2g9k4AnxtDNrCjvzL6bK7skG8QKMRNWkMG7N8e5Xm7pgle3tdRJd2y08CnP。

在Firefox 3.5 Final上进行测试!

PS。您的html应该是这样的。

<div id="[divContainer_Id]">
    <img src="[image1_url]" alt="img1" />
    <img src="[image2_url]" alt="img2" />
    <img src="[image3_url]" alt="img3" />
    <img src="[image4_url]" alt="img4" />
    <img src="[image5_url]" alt="img5" />
    <img src="[image6_url]" alt="img6" />
</div>

他说“行”,而不是“列”,并且您的HTML示例无效。
昆丁

3
他想要一行包含“列”中的多个图像的一行。尽管“显示:阻止”是多余的,但该答案实际上解决了问题。
鲍比·杰克

3

除了在标签中间而不是在标签中间打断之外,我还能做些其他事情吗?

并不是的。由于<img>s是内联元素,因此HTML渲染器将这些元素之间的空格视为文本中的真实空格-多余的空格(和换行符)将被截断,但单个空格插入到文本元素的字符数据中。

<img>绝对放置标签可以防止这种情况,但是我建议您这样做,因为这将意味着手动将每个图像放置到某个像素尺寸,这可能需要很多工作。


1

另一种解决方案是在空间位置使用非常规的换行符。这类似于前几个答案,是排列元素的另一种方法。这也是一种超边缘优化技术,因为它用回车符替换了标记中的空格。

<img
src="image1.jpg"><img
src="image2.jpg"><img
src="image3.jpg"><img
src="image4.jpg">

请注意,任何代码中都没有空格。HTML中通常使用空格的位置将被回车代替。与使用注释和使用Paul de Vrieze建议的空白一样,它不那么冗长。

感谢tech.co的这种方法。



0

元素之间的空格仅由HTML编辑器放置在此处,用于视觉格式化。您可以使用jQuery删除空格:

$("div#MyImages").each(function () {

    var div = $(this);
    var children= div.children();
    children.detach();
    div.empty();
    div.append(children);

});

这将分离子元素,在再次添加子元素之前清除剩余的空白。

与该问题的其他答案不同,使用此方法可确保保留继承的css displayfont-size值。也不需要使用float,那么麻烦clear。当然,您将需要使用jQuery。


10
虽然此解决方案有效。我认为用javascript删除空格是过大的。
Lashae

1
抱歉,很抱歉...首先应该以正确编写HTML为目标,而不是在事后用JS对其进行处理。后者只是以JS的[咳嗽]奇迹可以在以后解决它的想法而鼓励草率的实践。
underscore_d 2015年

0

我个人喜欢接受的答案,它说明没有确切的方法可以做到这一点,而不是不使用某种形式的技巧。

对我来说,这是一个令人烦恼的问题,有时可能使您浪费一个小时,想知道为什么例如一排复选框未全部正确对齐。我不记得了...但似乎没有:(

至于下一个最佳答案,就是使用font-size ...对我来说这是一个令人讨厌的技巧,稍后您会想知道为什么您的文本没有显示出来,这会给您带来麻烦。

我通常使用PHP进行很多开发,并且在我生成复选框网格的情况下,PHP生成的内容消除了此问题,因为它没有插入任何空格/空格。

简而言之,我建议要么将所有图像都放在一行上,要么使用服务器端脚本来生成内容/图像。


0

我使用SGML处理指令,而不是使用删除元素之间的CR / LF,因为缩小符通常删除注释,而不是XML PI。当PHP PI由PHP处理时,它还有另一个好处,就是可以完全删除PI及其之间的CR / LF,从而节省至少8个字节。您可以使用任意有效的指令名称,例如,并在X(HT)ML中保存两个字节。



-1

从语义上讲,不是最好使用有序列表或无序列表,然后使用CSS对其进行适当的样式设置?

<ul id="[UL_ID]">
    <li><img src="[image1_url]" alt="img1" /></li>
    <li><img src="[image2_url]" alt="img2" /></li>
    <li><img src="[image3_url]" alt="img3" /></li>
    <li><img src="[image4_url]" alt="img4" /></li>
    <li><img src="[image5_url]" alt="img5" /></li>
    <li><img src="[image6_url]" alt="img6" /></li>
</ul>

使用CSS,您可以随意设置样式,并消除书籍之间的空白。


4
将图像放在列表项中不会对空白产生影响,即使它更具语义。
dangerousdave
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.