text-overflow:没有宽度的表格单元格中的省略号

时间:2013-02-12 06:48:14

标签: html css

我正在尝试在中间单元格中实现响应式表格宽度text-overflow: ellipsis;,如下所示:

| Button 1 | A one-lined text that is too long and has to be... | Button 2 |

整个表格应该width: 100%;与设备一样大。我无法在Button 1Button 2上设置固定宽度,因为应用程序是多语言的(尽管应该可以max-width)。

我可以尝试任何我想要的东西,...仅在我设置固定宽度时出现。如何在不借助JavaScript的情况下告诉中间单元“使用可用空间”?

7 个答案:

答案 0 :(得分:76)

这不是一个干净的解决方案,但它不使用JS,并且可以在我测试过的每个浏览器中使用。

我的解决方案是将单元格的内容包装在包含table-layout: fixedwidth: 100%的表格中。

请参阅demo

以下是完整的解决方案:

<table class="main-table">
    <tr>
        <td class="nowrap">Button 1</td>
        <td>
            <table class="fixed-table">
                <tr>
                    <td>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus doloremque magni illo reprehenderit consequuntur quia dicta labore veniam distinctio quod iure vitae porro nesciunt. Minus ipsam facilis! Velit sapiente numquam.</td>
                </tr>
            </table>
        </td>
        <td class="nowrap">Button 2</td>
    </tr>
</table>

.main-table {
    width: 100%;
}

.fixed-table {
    /* magic */
    width: 100%;
    table-layout: fixed;

    /*not really necessary, removes extra white space */
    border-collapse: collapse;
    border-spacing: 0;
    border: 0;
}
.fixed-table td {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.nowrap {
    /* used to keep buttons' text in a single line,
     * remove this class to allow natural line-breaking.
     */
    white-space: nowrap;
}

侧面按钮的意图并不是很清楚,因此我使用white-space: nowrap将它们保持在同一行。根据用例的不同,您可能更愿意应用min-width并让它们自然换行。

答案 1 :(得分:18)

在表格上设置100%宽度并指定fixed表格布局:

table {
    width: 100%;
    table-layout: fixed;
}

然后,为具有省略号的表格单元格设置以下内容:

td:nth-child(2) {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

瞧!带有省略号溢出的响应表!

演示:http://jsfiddle.net/VyxES/

答案 2 :(得分:8)

HTML

<tr>
    <td>
        <span class="ellipsis"> A very looooooooooooooooooooooooooooooong string</span>
    </td>
</tr>

CSS

td {
    position: relative;
}

.ellipsis {
    /*Here is the trick:*/
    position: absolute;
    width: 100%;
    /*End of the trick*/

    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}

答案 3 :(得分:4)

更简洁的方法是在td上设置最大宽度。

基于@FabrícioMatté的回复,

http://jsfiddle.net/V83Ae/89/

<table class="main-table">
<tr>
    <td class="nowrap">Button 1</td>
    <td class="truncate">
        Lorem ipsum dolor sit amet, consectetur adipisicing elit. Delectus doloremque magni illo reprehenderit consequuntur quia dicta labore veniam distinctio quod iure vitae porro nesciunt. Minus ipsam facilis! Velit sapiente numquam.</td>
    <td class="nowrap">Button 2</td>
</tr>

body { margin: 0; }

.main-table {
    width: 100%;
}

.truncate {
    text-overflow: ellipsis;
    white-space  : nowrap;
    overflow     : hidden;
    max-width    : 100px; /* Can be any size, just small enough */
}

.nowrap {
    white-space: nowrap;
}

我不知道为什么会这样,但确实如此,所以如果有人可以知道为什么应用最大宽度的工作,那么请让我知道,因为我偶然做到了。

答案 4 :(得分:2)

在敲了几个小时之后,没有任何解决方案可行,最终找到了它。

溢出基底所需的元素需要最小/最大宽度,其中最大值小于最小宽度。然后你可以溢出它或它的孩子,你可以用你选择的任何方式设置:%,px,auto。

我在不止一个棘手的情况下尝试了它,它适用于所有。

我会试着用我的例子发布一个文件,但这应该可以帮助你。

/* Apply on base element for proper overflow */
max-width: 1px;
min-width: 10000px;

/* Apply on self or child, according to need */
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

答案 5 :(得分:0)

[更新] 我道歉,似乎没有“就像那样”:http://jsfiddle.net/kQKfc/1/

但是会留在这里,因为在某些情况下它会对我们有所帮助 [/更新]

我们在项目中有这个css,试一试:

.nowr
{
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

答案 6 :(得分:0)

Here you go

<div class="container">
  <div>
    Button 1
  </div>
  <div class="fill">
    <div class="lockText">
      A one-lined text that is too long and has to be...
    </div>
  </div>
  <div>
    Button 2
  </div>
</div>

诀窍是设置一个表格布局,其中一个单元格首先占用剩余空间(css表,请注意!)。

.container {
  display: table;
  width: 100%;
}

.container > div {
  display: table-cell;
  white-space: nowrap;
  position : relative;
  width : auto;

  /*make it easier to see what's going on*/
  padding : 2px;
  border : 1px solid gray;
}

.container > .fill {
  width : 100%;
}

然后添加限制自己的文本。

.lockText {
  position : absolute;
  left : 0;
  right : 0;
  overflow: hidden;
  text-overflow: ellipsis;
}