While building an interface with lots of data, there are some <table>
elements, that need to be responsive. Of course it is possible to replace <table>
with any other kind of element.
The structure of the tables are always the same:
- all columns are really small and can have a fixed width
- except for one column, that sometimes contains words that need to be shortened
Problem:
There are some rows with a long and single word, like "intentionalamazingtoostrongawesomeness", which do not break in lines but stretch the whole table. This is not good on smartphones. I did create a snippet to illustrate the problem.
body {
font-family: 'Helvetica Neue', Helvetica, sans-serif;
}
#wrapper {
background: #eaeaea;
width: 320px;
margin: 0 auto;
}
#wrapper table {
width: 100%;
vertical-align: middle;
}
#wrapper .icon {
background: #8da2b5;
border-radius: 3px;
display: block;
height: 23px;
width: 23px;
}
td {
border-bottom: 1px solid #d3d6db;
}
td:nth-child(1) {
padding: 10px;
}
/* demo styles */
body {
background: #e4e8eb;
}
#wrapper {
border: 1px solid #d3d6db;
background: #f0f4f7;
color: #63778b;
}
#legend {
color: #63778b;
width: 320px;
margin: 40px auto 10px;
font-size: 11px;
text-transform: uppercase;
}
<div id="legend">|--------- This is the smallest width necessary ----------|</div>
<div id="wrapper">
<table cellspacing="0">
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Lorem ipsum dolor.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">123</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text"><strong>I_am_the_long_trouble_maker_that_stretches</strong> asdasdasd</span></td>
<td><span class="icon"></span></td>
<td><span class="number">42</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Sint, itaque, cupiditate Lorem ipsum dolor sit..</span></td>
<td><span class="icon"></span></td>
<td><span class="number">16</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Velit et, laudantium?</span></td>
<td><span class="icon"></span></td>
<td><span class="number">24</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Architecto, dolorem, cum!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">13</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Dolore, neque molestias.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">24</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Ratione, reprehenderit, deserunt.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">52</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Quidem, in, excepturi?</span></td>
<td><span class="icon"></span></td>
<td><span class="number">41</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Voluptates, aperiam eos.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">75</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Explicabo delectus, illum.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">45</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Facilis, provident, debitis!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">24</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Corrupti, itaque voluptatem!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">25</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Expedita, ea, ab.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">41</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Necessitatibus, reiciendis, quisquam.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">24</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Quis, rem facilis!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">35</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Porro, ullam, esse.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">14</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Eveniet, laboriosam, in.</span></td>
<td><span class="icon"></span></td>
<td><span class="number">64</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Est, nisi, dicta!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">74</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Iste, et, autem!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">24</span></td>
</tr>
<tr>
<td><span class="icon"></span></td>
<td><span class="text">Mollitia, delectus, magnam!</span></td>
<td><span class="icon"></span></td>
<td><span class="number">52</span></td>
</tr>
</table>
</div>
Solution:
I want to shorten the words inside the table, like "intentionalamazingtoo…", while the word should be as long as possible. How can I achieve this?
Demo table with simulated solution
Requirements:
There is no fixed width for the <td>
or table
containing text and the shortened word. Both should be as large/long as possible.
As said at the beginning, it is ok to use divs instead of tables, a flex-box system or any other html markup, as soon as it works as described above.
I do prefer a css only solution, as I am not used to javascript, while the table is wrapped in a huge javascript component. The app is running on Meteor and TypeScriptReact.