Avoid line break between html elements
HtmlWhitespaceHtml Problem Overview
I have this <td>
element:
<td><i class="flag-bfh-ES"></i> +34 666 66 66 66</td>
I was hoping to keep this into a single line, but this is what I get:
As you can see, flag and telephone number are in separate lines. The
are working in between the numbers of the telephone number, but not between flag and telephone number.
How can I make sure that no line-break at all is introduced by the renderer?
Html Solutions
Solution 1 - Html
There are several ways to prevent line breaks in content. Using
is one way, and works fine between words, but using it between an empty element and some text does not have a well-defined effect. The same would apply to the more logical and more accessible approach where you use an image for an icon.
The most robust alternative is to use nobr
markup, which is nonstandard but universally supported and works even when CSS is disabled:
<td><nobr><i class="flag-bfh-ES"></i> +34 666 66 66 66</nobr></td>
(You can, but need not, use
instead of spaces in this case.)
Another way is the nowrap
attribute (deprecated/obsolete, but still working fine, except for some rare quirks):
<td nowrap><i class="flag-bfh-ES"></i> +34 666 66 66 66</td>
Then there’s the CSS way, which works in CSS enabled browsers and needs a bit more code:
<style>
.nobr { white-space: nowrap }
</style>
...
<td class=nobr><i class="flag-bfh-ES"></i> +34 666 66 66 66</td>
Solution 2 - Html
CSS for that td: white-space: nowrap;
should solve it.
Solution 3 - Html
If you need this for several words or elements, but can't apply it to a whole TD or similar, the Span tag can be used.
<span style="white-space: nowrap">Text to break together</span>
or
<span class=nobr>Text to break together</span>
If you use the class version, remember to set up the CSS as detailed in the accepted answer.
Solution 4 - Html
If the <i>
tag isn't displayed as a block and causing the probelm then this should work:
<td style="white-space:nowrap;"><i class="flag-bfh-ES"></i> +34 666 66 66 66</td>
Solution 5 - Html
In some cases (e.g. html generated and inserted by JavaScript) you also may want to try to insert a zero width joiner:
.wrapper{
width: 290px;
white-space: no-wrap;
resize:both;
overflow:auto;
border: 1px solid gray;
}
.breakable-text{
display: inline;
white-space: no-wrap;
}
.no-break-before {
padding-left: 10px;
}
<div class="wrapper">
<span class="breakable-text">Lorem dorem tralalalala LAST_WORDS</span>‍<span class="no-break-before">TOGETHER</span>
</div>
Solution 6 - Html
This is the real solution:
<td>
<span class="inline-flag">
<i class="flag-bfh-ES"></i>
<span>+34 666 66 66 66</span>
</span>
</td>
css:
.inline-flag {
position: relative;
display: inline;
line-height: 14px; /* play with this */
}
.inline-flag > i {
position: absolute;
display: block;
top: -1px; /* play with this */
}
.inline-flag > span {
margin-left: 18px; /* play with this */
}
Example, images which always before text:
Solution 7 - Html
nobr is too unreliable, use tables
<table>
<tr>
<td> something </td>
<td> something </td>
</tr>
</table>
It all goes on the same line, everything is level with eachother, and you have much more freedom if you want to change something later.