HTML中的不间断空格

11

我有一个保龄球网络应用程序,允许输入详细的逐帧信息。其中一项功能是跟踪每个球击倒了哪些木瓶。为了显示这些信息,我让它看起来像一排木瓶:

o o o o
 o o o
  o o
   o

使用图像来代表木瓶。所以对于后排,我有四个img标签,然后是一个br标签。它工作得很好...大多数时候。问题在于小浏览器(如IEMobile)。在这种情况下,如果表格中有10或11列,并且每列可能有一排木瓶,Internet Explorer将尝试缩小列的大小以适应屏幕,结果导致出现以下情况:

o o o
  o
o o o
 o o
  o

或者

o o
o o
o o
 o
o o
 o

结构如下:

<tr>
    <td>
        <!-- some whitespace -->
        <div class="..."><img .../><img .../><img .../><img .../><br/>...</div>
        <!-- some whitespace -->
    </td>
</tr>

内部的div没有空格。如果您在普通浏览器中查看此页面,应该能够正常显示。但是,在IEMobile中查看时却不行。

有什么提示或建议吗?也许是一种不会实际添加空格的&nbsp;之类的东西吗?


后续/总结

我收到并尝试了几个好建议,包括:

  • 在服务器上动态生成整个图像。这是一个很好的解决办法,但不符合我的需求(托管在GAE上),而且比我想写的代码还多一点。这些图像也可以在第一次生成后被缓存。
  • 使用CSS white-space声明。这是一个很好的基于标准的解决方案,但在IEMobile视图中却失败了。

最终我所做的事情

*低头咕哝着什么*

没错,就是一个透明的GIF放在div顶部,大小设置为我需要的宽度。最终代码(简化版)如下:

<table class="game">
    <tr class="analysis leave">
        <!-- ... -->
        <td> <div class="smallpins"><img class="spacer" src="http://seasrc.th.net/gif/cleardot.gif" /><br/><img src="/img/pinsmall.gif"/><img src="/img/nopinsmall.gif"/><img src="/img/nopinsmall.gif"/><img src="/img/nopinsmall.gif"/><br/><img src="/img/pinsmall.gif"/><img src="/img/pinsmall.gif"/><img src="/img/nopinsmall.gif"/><br/><img src="/img/nopinsmall.gif"/><img src="/img/nopinsmall.gif"/><br/><img src="/img/nopinsmall.gif"/></div> </td>
        <!-- ... -->
    </tr>
</table>

还有CSS:

div.smallpins {
    background: url(/img/lane.gif) repeat;
    text-align: center;
    padding: 0;
    white-space: nowrap;
}
div.smallpins img {
    width: 1em;
    height: 1em;
}
div.smallpins img.spacer {
    width: 4.5em;
    height: 0px;
}
table.game tr.leave td{
    padding: 0;
    margin: 0;
}
table.game tr.leave .smallpins {
    min-width: 4em;
    white-space: nowrap;
    background: none;
}

顺便说一下:不,我不会在最终解决方案中使用别人的清晰点的热链接 :)

18个回答

26

在包含的div中,您可以尝试使用css的"nowrap"选项。

{white-space: nowrap;}

我不确定它的支持范围有多广泛。


据Quirksmode称,除了IE5,它被所有浏览器支持。http://www.quirksmode.org/css/whitespace.html - JacquesB
1
将其标记为已接受,但需要注意的是它不适用于IEMobile :( - Chris Marasti-Georg
4
有个拼写错误,应该为:{white-space: nowrap}(没有破折号)。 - Sam Watkins

4
最合理的做法是动态更换所显示的图片:
<div id="pin-images">
    <img src="fivepins.jpg" />
    <img src="fourpins.jpg" />
    <img src="threepins.jpg" />
    <img src="twopins.jpg" />
    <img src="onepin.jpg" />
</div>

4
为什么不为所有可能的引脚结果准备一张图片呢?不需要浏览器布局,图片就是图片。动态生成图片并缓存已创建的图片以供重复使用。

看着这个页面,那将会是很多图片。 - Matthew Rapati
2的10次方等于1024张图片?这是很多,但还是可以管理的。带宽可能是一个问题,特别是在移动设备上。 - Daniel Papasian
确实是这样。有10!种可能的组合,尽管有些在技术上有点不可能。实际上,这会更多一些,因为如果制造或未制造备用球,则使用不同的图像。 - Chris Marasti-Georg

4
我曾经通过动态创建整个图像来解决这种问题(带有适当的引脚排列)。 如果您使用ASP.NET,可以使用GDI调用轻松完成此操作。 您只需动态创建带有引脚放置的图像,然后将其作为单个图像提供给页面即可。 这样就消除了所有对齐问题(意在双关)。

这是使用GAE构建的,我担心CPU配额的使用……我想我可以在生成后缓存每个图像……值得考虑。 - Chris Marasti-Georg

3

既然您已经在使用图像,为什么不动态生成一个代表整个布局的图像呢?您可以使用类似于GDImageMagick这样的工具来实现。


3
在您的td标签中添加“nowrap”属性...

2

我发现客户端有一个设置,他们可以选择以下视图:1)单列,2)桌面视图和3)适合窗口

根据MSDN的说法,默认设置应该是适合窗口。但是我的妻子的IE移动电话默认为单列。所以无论如何,它都会将所有内容包装成单列。如果我切换到其他两个选项中的任何一个,它看起来都很好。

好吧,你可以使用meta标签来设置这个:

<meta name="MobileOptimized" content="320">

将页面宽度设置为320像素。但我不知道如何使其自动。

这在v4.6之前的黑莓上无法工作 - 除非用户手动更改为桌面视图,否则您将被限制为单列。对于4.6或更高版本,以下内容应该可以使用,但我还没有测试过:

<meta name="viewport" content="width=320">

非常棒,非常感谢。对于iPhone/iPod touch支持,我目前正在使用以下设置:<meta name="viewport" content="width = device-width">。您是否知道是否有其他方法可以让黑莓正确地运行?如果没有,我可以保留当前的解决方案,这应该是可以的。 - Chris Marasti-Georg

2

如果您希望实现最大兼容性,请考虑生成一个代表框架的单个图像。

如果您正在使用PHP,可以使用GD动态创建代表框架的图像,基于与您在问题中创建HTML所使用的相同输入。这样做的最大优势是,任何能够显示PNG或GIF的浏览器都能够显示您的框架。


1

您可以将img替换为span,并根据CSS类使用每个span的背景图像:

<p class="..."><span class="pin"></span><span>&nbsp;</span><span class="pin"></span>...
<p class="..."><span class="pin"></span><span>&nbsp;</span><span class="pin"></span>...
<p class="..."><span class="pin"></span><span>&nbsp;</span><span class="pin"></span>...
<p class="..."><span class="pin"></span><span>&nbsp;</span><span class="pin"></span>...

(个人认为,最好使用带有 p标签的四个行而不是一个带有br的单个div。)
(然后在CSS中可以这样写:)
p.smallpins {
    margin: 0;
    padding: 0;
    height: 11px;
    font-size: 1px;
}
p.smallpins span {
    width: 11px;
    background-image: url(nopinsmall.gif);
    background-repeat: ...
    background-position: ...
}
p.smallpins span.pin {
    background-image: url(pinsmall.gif);
}

这是一种不错的方法,但如果用户关闭了CSS,它就无法优雅地降级。 - Chris Marasti-Georg

1

在“;”后面可能需要一个实际的空格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接