文本输入将文本向下移动 1px

Text input shifts text down 1px

具有相同 CSS 样式的 divinput type="text" 以不同方式定位其内容。 input 在 Firefox、Chrome 和 Safari(至少在 macOS 上)上的文本低 1px。

尝试点击下面代码段中的 切换 作为示例。请注意,元素的位置相同,只是其中的文本移动了 1px。

由于它在浏览器中始终存在偏差,我想知道是否遗漏了什么。我怎样才能可靠地避免这种 1px 偏移?

const button = document.getElementById('toggle');

const a = document.getElementById('a');
const b = document.getElementById('b');

let state = false;
toggle();

button.onclick = toggle;

function toggle() {
  a.style.display = state ? 'none' : '';
  b.style.display = state ? '' : 'none';
  state = !state;
}
body {
  font: 13px Arial, sans-serif;
}

input,
div {
  position: absolute;
  outline: 0;
  border: 0;
  padding: 0;
  margin: 0;
  appearance: none;
  vertical-align: baseline;
  width: 200px;
  height: 22px;
  font: inherit;
  line-height: 21px;
  display: block;
  background-color: #eee;
}
<button id="toggle">toggle</button>

<input type="text" value="abcdefghijklmnopqrstuvwxyz" id="a" />
<div id="b">abcdefghijklmnopqrstuvwxyz</div>

在 JsFiddle 上 here

input 中的垂直居中受 line-height 的影响较小(文本垂直居中)。但是,height: 22pxline-height: 21px 会导致文本在 div 中以不同方式居中。将行高更改为 22px.

注意: 我在 div 中添加了一个红色的右边框,以表明这些项目仍然处于切换状态。

const button = document.getElementById('toggle');

const a = document.getElementById('a');
const b = document.getElementById('b');

let state = false;
toggle();

button.onclick = toggle;

function toggle() {
  a.style.display = state ? 'none' : '';
  b.style.display = state ? '' : 'none';
  state = !state;
}
body {
  font: 13px Arial, sans-serif;
}

input,
div {
  position: absolute;
  outline: 0;
  border: 0;
  padding: 0;
  margin: 0;
  appearance: none;
  width: 200px;
  height: 22px;
  font: inherit;
  line-height: 22px;
  display: block;
  background-color: #eee;
}

div {
  border-right: 3px solid red;
}
<button id="toggle">toggle</button>

<input type="text" value="abcdefghijklmnopqrstuvwxyz" id="a" />
<div id="b">abcdefghijklmnopqrstuvwxyz</div>