Как сделать элементы с разными тегами в одной строке без пробелов между ними? - PullRequest
1 голос
/ 25 февраля 2020

Я бы хотел поместить эти элементы в одну строку и без пробелов между ними, например: Target to achieve

Я пытался создать div или использовать table, но я не достиг хороших результатов, потому что элементы имеют разные теги ...

Итак, это мой код:

.fa-search {
  color: #777777;
  background: #f7f7f7;
  border: 0.25px solid #a9a9a9;
}

.fa-check {
  border: 0.25px solid #999999;
  background: #eeffee;
}

[class*="fa-"] {
	width: 21.5px;
	height: 21.5px;
	line-height: 1.2;
	text-align: center;
	cursor: pointer;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<input type="text" id="search_box" placeholder="Search...">
<i class="fa fa-search" id="search_button"></i>
<i class="fa fa-check" id="other_button"></i>

Ответы [ 2 ]

4 голосов
/ 25 февраля 2020

Добавляя CSS flex следующим образом:

.fa-search {
  color: #777777;
  background: #f7f7f7;
  border: 0.25px solid #a9a9a9;
}

.search_container {
  display: flex;
  flex-direction: row;
 }

.fa-check {
  border: 0.25px solid #999999;
  background: #eeffee;
}

[class*="fa-"] {
    width: 21.5px;
    height: 21.5px;
    line-height: 1.2;
    text-align: center;
    cursor: pointer;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<div class="search_container">
<input type="text" id="search_box" placeholder="Search...">
<i class="fa fa-search" id="search_button"></i>
<i class="fa fa-check" id="other_button"></i>
</div>
1 голос
/ 25 февраля 2020

Это на самом деле намного сложнее, чем должно быть. Давайте попробуем понять, почему эти элементы не выстраиваются последовательно, тогда мы можем выяснить, что нужно изменить.

Примечание: этот ответ имеет значение Academi c, поскольку объясняет, почему оригинальный код не совсем работает, но для более практичного решения используйте flexbox, как рекомендовано в ответе Куммера Вольфа

Используя инспектор стилей моего браузера, я вижу, что все эти элементы имеют display значение inline-block. Обычно элемент <i> просто встроен, но Font Awesome изменил это с помощью класса fa. Между тем, элементы <input> по умолчанию являются inline-block.

Вертикальное выравнивание встроенных элементов задается с соответствующим атрибутом vertical-align CSS. Опять же, инспектор вычисляемых стилей браузера сообщает нам, что для всех этих элементов свойство установлено в baseline. Это означает, что элементы будут выровнены, так что текст, который они содержат, выровнен, как в примере ниже.

Поскольку ваши элементы - это значки, а не текст, это не совсем то, что вам нужно. Одна вещь, которую вы могли бы сделать, это установить все эти элементы, чтобы они были выровнены по их середине, с vertical-align: middle.

big, small { border: 1px solid blue; display: inline-block; }
.middle>* { vertical-align: middle; }
<p>Here <big>BIG</big> and <small>small</small> are aligned based on the bottom of the letters.</p>
<p class="middle">But here <big>BIG</big> <small>small</small> are aligned based on the middle of their box.

Вам также необходимо убедиться, что все элементы имеют одинаковую высоту, чтобы их верхняя и нижняя границы идеально совпали. Однако есть еще одна проблема. По умолчанию свойство height CSS определяет высоту содержимого элемента, исключая границы и отступы. Таким образом, даже если вы установите высоту элементов <input> и <i> в одно и то же, они не будут совпадать, поскольку у них нет одинаковых границ и отступов. Я предполагаю, что по этой причине вы пытались поиграть с отступами и границами, используя значения 0.5px, но я бы не рекомендовал использовать половину пикселей, если вы хотите, чтобы в браузерах и устройствах было одинаковое поведение.

Если вы хотите высоту свойство для включения границы и отступа, вместо этого вы можете установить атрибут box-sizing элемента в border-box. Таким образом, все, что вам нужно сделать, это установить оба элемента height одинаковыми, а для вас все равно go.

input {
  box-sizing: border-box;
  height: 22px;
  vertical-align: middle;
}

.fa-search {
  background: #f7f7f7;
  border: 1px solid #a9a9a9;
  color: #777777;
}

.fa-check {
  background: #eeffee;
  border: 1px solid #999999;
}

.fa {
  box-sizing: border-box;
  cursor: pointer;
  height: 22px;
  line-height: 1.2;
  text-align: center;
  vertical-align: middle;
  width: 22px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<input type="text" id="search_box" placeholder="Search...">
<i class="fa fa-search" id="search_button"></i>
<i class="fa fa-check" id="other_button"></i>

Чтобы упростить задачу, многие веб-разработчики размещают это в верхней части своих CSS файлов, что гарантирует, что все элементы по умолчанию используют border-box .

html { box-sizing: border-box; }
*, *::before, *::after { box-sizing: inherit; }

Я только что заметил, что вы хотели избавиться от пробелов между вашими элементами. Еще одна досадная вещь в элементах inline-block состоит в том, что любые пробелы в коде между ними сворачиваются в один пробел. Если вам не нужен пробел между ними, вам нужно удалить пробел в коде или поместить его в комментарии.

input {
  box-sizing: border-box;
  height: 22px;
  vertical-align: middle;
}

.fa-search {
  background: #f7f7f7;
  border: 1px solid #a9a9a9;
  color: #777777;
}

.fa-check {
  background: #eeffee;
  border: 1px solid #999999;
}

.fa {
  box-sizing: border-box;
  cursor: pointer;
  height: 22px;
  line-height: 1.2;
  text-align: center;
  vertical-align: middle;
  width: 22px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">

<input type="text" id="search_box" placeholder="Search..."><!--
--><i class="fa fa-search" id="search_button"></i><!--
--><i class="fa fa-check" id="other_button"></i>

Да, это довольно ужасно, но это единственное решение при использовании элементов встроенных блоков ...

Но со всеми Тем не менее, выравнивание элементов формы таким образом особенно утомительно, и вы все равно можете получить некоторые несоответствия между браузерами. Я бы порекомендовал использовать display: flexbox, как рекомендовали другие. Вы можете узнать больше о flexbox здесь: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

...