Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamic maximum width for text

Tags:

css

width

So let's say I have this markup;

<div>
  <span>Text one</span>
  <span class="sticky">ABC</span>
</div>
<div>
  <span>Some other text</span>
  <span class="sticky">DEF</span>
</div>
<div>
  <span>Lorem dolor sit amet lorem ipsum dolor</span>
  <span class="sticky">GHI</span>
</div>

Which would - with accompanying CSS - yield a result like pictured below.

However, the problem occurs when the text in the first span is longer than the allotted width of the div. Regularly what happens is just normal text wrapping; the second span is bumped to the end of the second row.

However, I want this element to be just a single row. Now, of course to achieve this, you do;

white-space: nowrap;
overflow: hidden;

But then what happens is the second span disappears into oblivion, as it's driven away by the length of the text in the first span.

What I'd want to achieve is what is pictured in the third example below. When the content of the first span is too long to be displayed, text-overflow: ellipsis; would cut the string with a dot-dot-dot, and the second span would be pushed to the very right edge (padding of the div allowing).

Essentially, the pseudo-max-width of the first span would be equal to the width of the div, excluding its padding and deducting the width of span.sticky, whatever that may be (as the content of it may vary, so the width is not set).

I don't know if max-width is actually the way to go when approaching something like this, but it's what I can use to best describe the behavior I want.

Is there a non-JS method of achieving this?

Example

like image 723
Emphram Stavanger Avatar asked Jan 07 '13 06:01

Emphram Stavanger


People also ask

What does max width mean in HTML?

Definition and Usage The max-width property defines the maximum width of an element. If the content is larger than the maximum width, it will automatically change the height of the element. If the content is smaller than the maximum width, the max-width property has no effect.

What happens if the content is larger than the maximum width?

If the content is larger than the maximum width, it will automatically change the height of the element. If the content is smaller than the maximum width, the max-width property has no effect. Note: This prevents the value of the width property from becoming larger than max-width.

What is the max width of an element?

Definition and Usage. The max-width property defines the maximum width of an element. If the content is larger than the maximum width, it will automatically change the height of the element.

What is the maximum size of a text panel in AutoCAD?

3. But if even more content size is needed the panel should remain with height = 450 and there should be scroll view showing the scroll bar. The text should be scrollable with scroll view. Panel min size 650x200, max size 650x450, white background. Panel is vertical layout and contains: Message which can contain very short or very long text.


1 Answers

This can definitely, and should be done in CSS. Apply a fixed width and fixed height on the first span. The height keeps it from stretching to multiple lines. The .sticky span then can be positioned afterwards. This can even be made fluid, using percents or ems. Something to consider, I don't know the context of the 'ABC', 'DEF', but they might better be applied using a :before or :after pseudo class if they're purely visual and not structural elements.

Here's a quick example:

div { 
    width: 200px; /* some amount that you set */
}
span:not(.sticky) { /* can use another selector, just wanted it to be exceptionally clear what i was referring to here */
    display: inline-block; /* so height and width actually take affect */
    max-width: 80%;
    height: 1em; /* so overflow hidden works and keeps text on one row */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap; /* important to show ellipsis, or words will just be broken off */
}
span.sticky {
    display: inline-block;
    width: 20%;
}

If you want to see this working on a live site, I did this design on moolta.com. Click on 'make a challenge' and open the modal to choose a friend. The li's inside of the dropdown list are what I'm talking about. They had to become elipsis and have a button follow them, without breaking lines

like image 128
DMTintner Avatar answered Oct 13 '22 11:10

DMTintner