有没有什么好的方法可以用纯HTML和CSS来截断文本,从而使动态内容能够适合固定宽度和高度的布局?
我一直在根据逻辑宽度(即盲目猜测的字符数量)截断服务器端,但由于“w”比“I”宽,这往往是次优的,并且还需要我重新猜测(并不断调整)每个固定宽度的字符数量。理想情况下,截断应该发生在浏览器中,因为浏览器知道呈现文本的物理宽度。
我发现IE有一个text-overflow: ellipsis属性,这正是我想要的,但我需要这是跨浏览器的。这个属性似乎是标准的,但Firefox不支持。我发现了基于overflow: hidden的各种变通方法,但它们要么不显示省略号(我想让用户知道内容被截断了),要么一直显示省略号(即使内容没有被截断)。
有人有一个很好的方法来拟合动态文本在一个固定的布局,或者服务器端截断逻辑宽度就像我现在要得到的一样好吗?
更新:Firefox 7(2011年9月27日发布)现在支持text-overflow:省略号。耶!我最初的回答是有历史记载的。
Justin Maxwell有跨浏览器的CSS解决方案。但是它也有缺点,就是不能在Firefox中选择文本。查看他在马特·斯奈德博客上的客座文章,了解这是如何工作的全部细节。
注意,这种技术还阻止使用Firefox中的innerHTML属性更新JavaScript中的节点内容。看到这篇文章的结尾的解决办法。
CSS
.ellipsis {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
-o-text-overflow: ellipsis;
-moz-binding: url('assets/xml/ellipsis.xml#ellipsis');
}
xml文件内容
<?xml version="1.0"?>
<bindings
xmlns="http://www.mozilla.org/xbl"
xmlns:xbl="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
>
<binding id="ellipsis">
<content>
<xul:window>
<xul:description crop="end" xbl:inherits="value=xbl:text"><children/></xul:description>
</xul:window>
</content>
</binding>
</bindings>
更新节点内容
要在Firefox中以一种工作方式更新节点的内容,请使用以下方法:
var replaceEllipsis(node, content) {
node.innerHTML = content;
// use your favorite framework to detect the gecko browser
if (YAHOO.env.ua.gecko) {
var pnode = node.parentNode,
newNode = node.cloneNode(true);
pnode.replaceChild(newNode, node);
}
};
请参阅Matt Snider的帖子,了解这是如何工作的。