21

我正在尝试设置表格的列宽,它可以正常工作,直到它达到子元素在视觉上被截断的程度......然后它的大小不会再小了。(“视觉上被截断”——不合适的东西似乎隐藏在下一列后面)

这是一些示例代码来演示我的问题:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<script language="javascript" type="text/javascript">
    var intervalID = null;

    function btn_onClick()
    {
        // keep it simple, only click once
        var btn = document.getElementById("btn");
        btn.disabled = true;     
        // start shrinking
        intervalID = window.setInterval( "shrinkLeftCell();", 100);
    }

    function shrinkLeftCell()
    {
        // get elements
        var td1 = document.getElementById("td1");
        var td2 = document.getElementById("td2");

        // initialize for first pass
        if( "undefined" == typeof( td1.originalWidth))
        {
            td1.originalWidth = td1.offsetWidth;
            td1.currentShrinkCount = td1.offsetWidth;
        }

        // shrink and set width size
        td1.currentShrinkCount--;
        td1.width = td1.currentShrinkCount;  // does nothing if truncating!

        // set reporting values in right cell
        td2.innerHTML = "Desired Width : [" 
                    + td1.currentShrinkCount 
                    + "], Actual : [" 
                    + td1.offsetWidth + "]";

        // Stop shrinking
        if( 1 >= td1.currentShrinkCount)
            window.clearInterval(intervalID);
    }
</script>
</head>
<body>
    <table width="100%" border="1">
        <tr>
            <td id="td1">
                Extra_long_filler_text
            </td>
            <td id="td2">
                Desired Width : [----], Actual : [----]
            </td>
        </tr>
    </table>

    <button id="btn" onclick="btn_onClick();">Start</button>
</body>
</html>

我尝试以不同的方式设置宽度,包括

td1.offsetWidth = td1.currentShrinkCount;

td1.width = td1.currentShrinkCount + "px";

td1.style.width = td1.currentShrinkCount + "px";

td1.style.posWidth = td1.currentShrinkCount;

td1.scrollWidth = td1.currentShrinkCount;

td1.style.overflow = "hidden";
td1.width = td1.currentShrinkCount;

td1.style.overflow = "scroll";
td1.width = td1.currentShrinkCount;

td1.style.overflow = "auto";
td1.width = td1.currentShrinkCount;

我意识到,我可能会使用 DIV,但我不想这样做,因为表是从绑定控件生成的,而且我真的不想重写 asp.net 控件。

话虽如此,我认为作为最后的努力,我至少可以用 DIV 包装每个 'td1' 的内容,溢出会处理好事情,但甚至替换

<td id="td1">
    Extra_long_filler_text
</td>

<td id="td1" style="overflow:hidden;">
    <div style="margin=0;padding:0;overflow:hidden;">
        Extra_long_filler_text
    </div>
</td>

没用。

有人知道我如何设置宽度以在视觉上截断其内容吗?

顺便说一句-我的目标浏览器是 IE7。其他浏览器现在并不重要,因为这是一个内部应用程序。

4

5 回答 5

32

我只是尝试添加table-layout: fixed;<table>,它在 IE7 上对我有用。

在固定的表格布局中,水平布局只取决于表格的宽度,列的宽度,而不是单元格的内容

查看文档

于 2009-01-26T18:50:06.843 回答
4

CSS 解决方案

“截断”可能不是您要查找的词。您可能只想隐藏溢出的字符。如果是这种情况,请查看 css 属性“溢出”,它将隐藏任何超出其容器声明限制的内容。

td div.masker {
  height:25px;
  width:100px;
  overflow:hidden;
}

<td>
  <div class="masker">
    This is a string of sample text that
    should be hidden when it reaches out of the bounds of the parent controller.
  </div>
</td>

Javascript 解决方案

如果您确实想要截断容器内的文本,则必须从右侧删除一个字符,测试父级的宽度,然后继续删除字符并测试父级宽度,直到父级宽度与声明的宽度匹配。

while (parent.width > desiredWidth) {
  remove one char from right-side of child-text
}
于 2009-01-26T18:14:54.030 回答
2
<td id="td1" style="overflow-x:hidden;">

应该

<td id="td1" style="overflow:hidden;">

overflow-x 是 Microsoft CSS 属性,现在是 CSS3 的一部分。我会坚持使用旧的溢出属性。

编辑:

正如 Paolo 提到的,您还需要添加 table-layout:fixed; 并指定表格的宽度。下面是一个完整的例子。

<html>
<head>
<style>
    table
    {

        table-layout:fixed;
        width:100px;
        }
td
{
    overflow:hidden;
    width:50px;
    border-bottom: solid thin;
    border-top:solid thin;
    border-right:solid thin;
    border-left:solid thin;

}
</style>
</head>
<body>
<table>
<tr><td>Some_long_content</td><td>Short</td></tr>
</table>
</body>
</html>
于 2009-01-26T18:11:01.883 回答
1

据我所知,表格单元格总是会拉伸以适应其内容。

您是否考虑过使用 Javascript 动态截断内容超过一定数量的表格单元格中的数据?或者,您可以更轻松地在服务器端执行此操作。

于 2009-01-26T18:17:32.247 回答
0

您可以使用 jQuery 或纯 javascript 来用 div 标签包围您的单元格的内容,并设置一个固定的宽度和溢出:隐藏在这些标签上。不漂亮,但它会工作。

预计到达时间:

<td><div style="width:30px;overflow:hidden">Text goes here</div></td>

由于 DIV 是边界元素,因此应该设置宽度。

于 2009-01-26T18:31:42.903 回答