Несколько проблем
- Этот
div.block.input
ничего не выбирает, поэтому все эти стили не используются - Вы сделали метку блоком элемент level, поэтому он не будет реагировать на свойство
vertical-align
.
<input>
и <img>
являются встроенными элементами, поэтому они будут использовать один и тот же линейный блок, в котором они живут. Их вертикальное выравнивание будет установлено свойством vertical-align
.
Значением по умолчанию для свойства vertical-align
является базовая линия:
Совместите базовую линию поля с базовой линией родителя коробка. Если у рамки нет базовой линии, выровняйте край нижнего поля с базовой линией родителя.
В этом случае у нас есть <img>
, у которого нет базовой линии, поэтому он будет выровнен основанный на его нижнем поле, в нашем случае у img нет поля, поэтому в основном это нижний край.
У <input>
Однако есть базовая линия, поэтому его базовая линия будет выровнена с нижним краем img к нему.
DEMO
div.block {
overflow: hidden;
border: 1px solid #000
}
div.block label {
width: 150px;
display: block;
float: left;
text-align: left;
vertical-align: middle;
}
div.block.input {
margin-left: 4px;
float: left;
vertical-align: middle;
}
div {
position: relative;
}
div:after {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(red, red) 0 24.5px/ 100% 1px no-repeat
}
<p>red line is the baseline</p>
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
Решения
Я немного почистил код и удалил ненужные стили.
- Floats aren
- Если вы хотите применить ширину к метке, используйте
display:inline-block;
вместо
1) вертикальное выравнивание: среднее;
* {
padding: 0;
margin: 0;
}
div.block {
overflow: hidden;
border: 1px solid #000
}
label {
width: 150px;
display: inline-block;
vertical-align: middle;
background: brown;
}
input {
vertical-align: middle;
border: 0;
background: red;
}
img {
vertical-align: middle;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
Элементы будут выровнены относительно середины самого высокого элемента, который является изображением.
2) Если вы хотите, чтобы элементы с одинаковой высотой
Зная, что <img>
является самым высоким и его высотой, мы можем просто применить ту же высоту к другим элементам. Нам все еще нужно применить vertical-align:top
, чтобы выровнять элементы на основе на их верхнем краю вместо базовой линии
* {
padding: 0;
margin: 0;
/* because we defined a height on the element,
we need to ensure that any extra space should be
calculated within that height */
box-sizing: border-box;
}
div.block {
overflow: hidden;
border: 1px solid #000;
font-size:0;
}
label {
display: inline-block;
width: 150px;
height: 25px;
font-size:16px;
vertical-align: top;
line-height:25px;
background:brown;
}
input {
height: 25px;
vertical-align: top;
border:0;
background:red;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890' />
<img src='https://i.picsum.photos/id/527/25/25.jpg' />
</div>
3) Flexbox
Что является самым простым, и я не буду покрывать, потому что он был покрыт в другие ответы.