CSS - выравнивание текста, ввода и изображения в DIV - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь выровнять некоторый текст, поле ввода и изображение размером примерно 25x25 px

Я получаю текст и изображение в верхней части элемента div, а входные данные немного ниже.

Как мне выровнять их так, чтобы все они были вертикально выровнены друг с другом.

Это то, что у меня есть:

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; }

https://jsfiddle.net/a3cmfpzL/

Спасибо

Ответы [ 4 ]

0 голосов
/ 16 апреля 2020

Несколько проблем

  1. Этот div.block.input ничего не выбирает, поэтому все эти стили не используются
  2. Вы сделали метку блоком элемент 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>

Решения

Я немного почистил код и удалил ненужные стили.

  1. Floats aren
  2. Если вы хотите применить ширину к метке, используйте 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

Что является самым простым, и я не буду покрывать, потому что он был покрыт в другие ответы.

0 голосов
/ 16 апреля 2020

Попробуйте добавить position:absolute и display:flex в ваш блок div.block. Это должно сработать, если я правильно понимаю ваш вопрос.

0 голосов
/ 16 апреля 2020

Я бы настоятельно рекомендовал вам использовать flexbox.

Вначале это может немного запутать, но как только вы освоитесь, вам это понравится. Здесь вы можете найти идеальное руководство по его использованию.
https://css-tricks.com/snippets/css/a-guide-to-flexbox/

Примерно так (только что написано у меня в голове, поэтому не проверено) Попробуйте сначала удалить свои классы.

Ваш CSS

.flex {
    display: flex; 
    flex-direction: column;
    justify-content: space-between; // only use this if you don't justify-self the elements
}

.border {
    border:1px solid #000;
}

img {
    width: 25px;
    height: 25px;
    justify-self: top; // if you don't use flex-direction on .flex
}

input {
    justify-self: top; // if you don't use flex-direction on .flex
}

Ваш HTML

<div style="flex border">
    <img src='image.png'/>
    <label>Test Label</label>
    <input type='text' value='1234567890'/>
</div>
0 голосов
/ 16 апреля 2020

Это для Горизонтальное :

.block{
  display:flex;
}
label{
  border:1px solid red;
}

img{
  height:25px;
  width:25px;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890'/>
<img src='http://placekitten.com/301/301'/>
</div>

Если вы ищете Вертикальное направление, то:

*{
  border:0;
  padding:0;
}
.block{
  display:flex;
  flex-direction:column;
}
label{
  border:1px solid red;
 width:100px;
}

img{
  height:25px;
  width:25px;
}
<div class='block'>
<label>Test Label</label>
<input type='text' value='1234567890'/>
<img src='http://placekitten.com/301/301'/>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...