Reputation: 15434
Here is fiddle: https://jsfiddle.net/udyzyoq6/
HTML (for failing example):
<div class="parent">
<div class="square"></div>
<label class="label">
Long label text, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum
</label>
</div>
CSS (for failing example):
.parent {
width: 300px;
border: solid 1px red;
}
.square {
width: 15px;
height: 15px;
background-color: blue;
display: inline-block;
vertical-align: middle;
}
.label {
display: inline-block;
vertical-align: middle;
}
I DON'T want to set max-width
on label - I just want it to automatically use all available space of .parent
(300px-15px). In my example, if I wont set max-width
on label then long text breaks layout (as in red frame).
Edit: I don't want to set any fixed width on any element except .parent
(width=300px) and .square
(width=15px, height=15px). I want it to automatically/dynamically adjust to .parent
container width.
Upvotes: 1
Views: 81
Reputation: 4503
use display: table
.parent {
width: 300px;
border: solid 1px green;
display: table;
}
.parent.error-frame {
border-color: red;
}
.parent > div{
display: table-cell;
}
.parent > div:nth-of-type(1){
vertical-align: middle;
}
.square {
width: 15px;
height: 15px;
background-color: blue;
display: inline-block;
vertical-align: middle;
}
.label {
display: inline-block;
vertical-align: middle;
padding-left: 5px;
}
<div class="parent">
<div>
<div class="square"></div>
</div>
<div>
<label class="label">Long label text, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum</label>
</div>
</div>
<br>
<div class="parent">
<div>
<div class="square"></div>
</div>
<div>
<label class="label">Long label text, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum</label>
</div>
</div>
Upvotes: 3
Reputation: 14173
You can achieve this layout by using flexbox
:
display: flex;
to .parent
, this tells its children to use the flexbox
modelalign-items: center;
to .parent
, this will vertically align the childrenflex: 1;
to .label-without-max-width
, this will tell it to take up as much space as necessary.parent {
align-items: center;
border: solid 1px green;
display: flex;
width: 300px;
}
.parent.error-frame {
border-color: red;
}
.square {
background-color: blue;
height: 15px;
width: 15px;
}
.label {
max-width: 250px;
}
.label-without-max-width {
flex: 1;
max-width: none;
}
<div class="parent">
<div class="square"></div>
<label class="label">Long label text, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum</label>
</div>
<br>
<div class="parent error-frame">
<div class="square"></div>
<label class="label label-without-max-width">Long label text, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum, lorem ipsum</label>
</div>
Support for flexbox
is pretty good (minus older versions of IE) http://caniuse.com/#feat=flexbox
Upvotes: 2
Reputation: 676
You don't need to set a max-width
. Since you're using set pixel widths, just set a width
on the label class to whatever pixel width you need, in this case, 285px.
Upvotes: 2