ThiefMaster ThiefMaster - 4 months ago 21
CSS Question

Definition list side-by-side without wrapping too-long lines

I have a

containing short
texts and possibly long
texts. In the layout where I'm using them I'd like them to appear side-by-side:

|DT DD........|
|DT DD........|
|DT DD........|

However, in case the DD's content is too long I just want it to be truncated (
overflow: hidden
on the DL). One easy way would be giving the DD a max-width to avoid it to be come too big to fit in one line with the fixed-size DT. However, since the container's width is already fixed and changes via media queries I'd prefer a solution where I do not have to specify a fixed width dot the DD. Using a percentage for both the DT and DD is also not a solution since that would waste space in the DT in case of a big container.

Fiddle showing the problem:

Current CSS:

dl { border: 1px solid #000; margin: 2em; width: 200px; overflow: hidden; }
dt { float: left; clear: left; width: 50px; color: #f00; }
dd { float: left; color: #0a0; white-space: nowrap; }


Update: I should have read your entire question first.

Take off the float:left; on the <dd>

One possible problem for beginners using this property (as I already alluded to above) is that they assume that setting whitespace: nowrap on an element will prevent that element from dropping to the next line if it is part of a group of floated boxes. The white-space property, however, will only apply to the inline elements inside of the element its applied to, and will not affect block elements or the spacing of the element itself.


As you have set widths on the dl and dt, add this to the dd:

    overflow: hidden;
    text-overflow: ellipsis;
    width: 150px;

Be aware - this is CSS3 - will not work on older browsers - it is for you to evaluate if this is a problem or not - most of the time I don't mind older browsers getting a slightly worse pick of styles.