Что вызывает это таинственное вертикальное смещение на этих кнопках?

У меня есть четыре элемента, которые отображаются как кнопки. Два из них: <button> s, один - <a>, а один - <input type="submit">.

Текст <a> всегда слегка смещен по вертикали относительно других, и я не могу понять, почему. Это происходит в Chrome, Firefox, Safari и IE 11.

введите описание изображения здесь

<!DOCTYPE html>
<html>
  <head>
    <title>Buttons</title>
    <style>
*{
  margin:0;
  padding:0;
  border:0;
  border-collapse:collapse;
  border-spacing:0;
  font-size:inherit;
  font-style:inherit;
  font-family: "Helvetica Neue", Helvetica, sans-serif;
  font-weight:inherit;
  text-decoration:none;
  color:inherit;
  background-color:transparent;
  list-style-type:none;
}
button,
.button,
input[type=submit]{
  cursor:pointer;
  padding:10px;
  margin-bottom:10px;
  box-sizing:border-box;
  border-radius:5px;
  background-color:#eee;
  line-height:24px;
  height:48px;
  display:inline-block;
  vertical-align:middle;
  text-transform:uppercase;
  letter-spacing:2px;
  background-color:#69c;
  color:#fff;
  font-weight:bold;
  text-align:center;
  font-size:10px;
  transition: background-color 0.1s, border-color 0.1s, color 0.1s;
}
button:hover,
.button:hover,
input[type=submit]:hover{
  background-color:#7ad;
}
    </style>
  </head>
  <body>
    <button>Foo</button>
    <button>Bar</button>
    <a class="button">Baz</a>
    <input type="submit" value="Yar" />
  </body>
</html>

Ответ 1

Текст <button> выровнен по центру, но для <a> выровнено вверху. vertical-align применяется только к самому элементу, а не к тексту внутри элемента.

Текст будет выровнен по центру в строке. Поэтому, если line-height соответствует высоте элемента (минус заполнение), чем все центрируется.

Таким образом, высота линии должна быть height - padding-top - padding-bottom= 48px - 10px - 10px= 28px

CSS

button, .button, input[type=submit] {
  line-height: 28px;
}

Ответ 2

Это потому, что элементы, отличные от 'a', автоматически центрируют содержимое. Измените высоту, и вы увидите, что все они остаются центрированными, за исключением якоря. Поэтому, когда вы устанавливаете верхнюю часть дополнения, это делает их одинаковыми, но работает только с определенным размером.

Ответ 3

Что, поскольку line-height применяется к элементам, вы можете исправить его, изменив его:

CSS

button, .button, input[type=submit] {
   line-height: 30px;
}

Причина: поскольку вы устанавливаете padding для элементов, альтернативой вашему коду является удаление height и line-height, а затем использование только padding следующим образом:

<!DOCTYPE html>
<html>
  <head>
    <title>Buttons</title>
    <style>
*{
  margin:0;
  padding:0;
  border:0;
  border-collapse:collapse;
  border-spacing:0;
  font-size:inherit;
  font-style:inherit;
  font-family: "Helvetica Neue", Helvetica, sans-serif;
  font-weight:inherit;
  text-decoration:none;
  color:inherit;
  background-color:transparent;
  list-style-type:none;
}
button,
.button,
input[type=submit]{
  cursor:pointer;
  padding:18px 10px;
  margin-bottom:10px;
  box-sizing:border-box;
  border-radius:5px;
  background-color:#eee;
  display:inline-block;
  vertical-align:middle;
  text-transform:uppercase;
  letter-spacing:2px;
  background-color:#69c;
  color:#fff;
  font-weight:bold;
  text-align:center;
  font-size:10px;
  transition: background-color 0.1s, border-color 0.1s, color 0.1s;
}
button:hover,
.button:hover,
input[type=submit]:hover{
  background-color:#7ad;
}
    </style>
  </head>
  <body>
    <button>Foo</button>
    <button>Bar</button>
    <a class="button">Baz</a>
    <input type="submit" value="Yar" />
  </body>
</html>

Ответ 4

Только объявление line-height влияет только на .button.

(Возможно, потому что остальные три элемента - это все элементы <form> и поэтому могут иметь стили CSS по умолчанию Shadow CSS, предварительно примененные к ним браузером?)

Какая бы ни была причина, применяя правильный line-height to .button, устраняет проблему.

Высота каждого элемента 48px

Что 48px включает в себя дополнение из-за box-sizing: border-box

Итак, чтобы поместить текст в вертикальную середину .button, вам нужно удалить верхнюю часть (10px) и нижнюю часть (10px) с высоты (48px).

48px - 10px - 10px = 28px

Решение:

Удалить

line-height:24px;

от

button,
.button,
input[type=submit]{
...
}

и добавьте

.button {
line-height:28px;
}

для стилей.

*{
  margin:0;
  padding:0;
  border:0;
  border-collapse:collapse;
  border-spacing:0;
  font-size:inherit;
  font-style:inherit;
  font-family: "Helvetica Neue", Helvetica, sans-serif;
  font-weight:inherit;
  text-decoration:none;
  color:inherit;
  background-color:transparent;
  list-style-type:none;
}

button,
.button,
input[type=submit]{
  cursor:pointer;
  padding:10px;
  margin-bottom:10px;
  box-sizing:border-box;
  border-radius:5px;
  background-color:#eee;
  height:48px;
  display:inline-block;
  vertical-align:middle;
  text-transform:uppercase;
  letter-spacing:2px;
  background-color:#69c;
  color:#fff;
  font-weight:bold;
  text-align:center;
  font-size:10px;
  transition: background-color 0.1s, border-color 0.1s, color 0.1s;
}

.button {
line-height:28px;
}

button:hover,
.button:hover,
input[type=submit]:hover{
  background-color:#7ad;
}
<button>Foo</button>
<button>Bar</button>
<a class="button">Baz</a>
<input type="submit" value="Yar" />