The img
is an inline element, and the .text-container
is an inline block. When the an inline element can't fit in the current line, the line breaks, and the element is moved to the next line.
To Prevent that set white-space: nowrap
on the .container
. To enable the wrap inside the .text-container
, define it's width, and return the white space behavior to normal (wrap).
.container {
width: 200px;
margin-bottom: 10px;
border: 1px solid red;
white-space: nowrap; /** force the elements to stay side by side **/
}
img {
height: 50px;
width: 50px;
border-radius: 50%;
border: 1px solid black;
vertical-align: middle
}
.text-container {
display: inline-block;
width: calc(100% - 60px); /** containers width - img width - margin-left **/
margin-left: 10px;
white-space: normal;
vertical-align: middle
}
<div class="container">
<img src="http://4.bp.blogspot.com/-e98D9RG3Gzs/U5XAgtaj9tI/AAAAAAAAIIo/hDPgyrWvxy0/s1600/shy-smiley.png" />
<div class="text-container">I AM TEXT</div>
</div>
<div class="container">
<img src="http://4.bp.blogspot.com/-e98D9RG3Gzs/U5XAgtaj9tI/AAAAAAAAIIo/hDPgyrWvxy0/s1600/shy-smiley.png" />
<div class="text-container">I AM TEXT OH NOOO</div>
</div>
However, you can simplify the structure even further by using a flexbox with align-items: center
:
.container {
display: flex; /** set the container as flexbox **/
align-items: center; /** align all items vertically **/
width: 200px;
margin-bottom: 10px;
border: 1px solid red;
}
img {
height: 50px;
width: 50px;
border-radius: 50%;
border: 1px solid black;
}
.text-container {
margin-left: 10px;
}
<div class="container">
<img src="http://4.bp.blogspot.com/-e98D9RG3Gzs/U5XAgtaj9tI/AAAAAAAAIIo/hDPgyrWvxy0/s1600/shy-smiley.png" />
<div class="text-container">I AM TEXT</div>
</div>
<div class="container">
<img src="http://4.bp.blogspot.com/-e98D9RG3Gzs/U5XAgtaj9tI/AAAAAAAAIIo/hDPgyrWvxy0/s1600/shy-smiley.png" />
<div class="text-container">I AM TEXT OH NOOO</div>
</div>
And by using flexbox, you can also move the image with it's border to the background of .container
to get a single div solution.
.container {
display: flex; /** set the container as flexbox **/
align-items: center; /** align all items vertically **/
box-sizing: border-box; /** the padding and the border are part of the width **/
width: 202px;
min-height: 54px;
margin-bottom: 10px;
padding-left: 60px; /** save space for the image and the margin between the image and the text **/
border: 1px solid red;
/** set the image and the image border as backgrounds **/
background: radial-gradient(circle at center, transparent 0, transparent 24px, black 24px, transparent 26px), url(http://4.bp.blogspot.com/-e98D9RG3Gzs/U5XAgtaj9tI/AAAAAAAAIIo/hDPgyrWvxy0/s1600/shy-smiley.png);
/** set the backgrounds size **/
background-size: 51px 51px, 50px 50px;
background-repeat: no-repeat; /** prevent the backgrounds from repeating themselves to fill the container **/
background-position: left center; /** position them in relation to the container **/
}
<div class="container">
I AM TEXT
</div>
<div class="container">
I AM TEXT OH NOO
</div>