让我们最终看一下问题的源头
复选框使用图像呈现(可以通过CSS设置自定义图像)。这是在FireFox中未被选中的复选框,使用DOM检查器突出显示:

这是 Chrome 中相同未经样式处理的复选框:

你可以看到边距(橙色);内边距不存在(应该显示为绿色)。那么复选框右侧和底部的这个伪边距是什么?这些是用于复选框的图像的一部分。这就是为什么仅使用vertical-align: middle并不能真正满足要求,也是跨浏览器问题的根源。
那我们能做些什么呢?一个明显的选择是-替换图片!幸运的是,我们可以通过CSS来实现这一点,并用外部图片、base64(在CSS中)图片、in-CSS svg或伪元素来替换它们。这是一种强大的(跨浏览器!)方法,下面是从这个问题中偷来的一个例子:
.checkbox-custom {
opacity: 0;
position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
display: inline-block;
vertical-align: middle;
margin: 5px;
cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
content: '';
display: inline-block;
background: #fff;
border-radius: 5px;
border: 2px solid #ddd;
vertical-align: middle;
width: 10px;
height: 10px;
padding: 2px;
margin-right: 10px;
text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
width: 1px;
height: 5px;
border: solid blue;
border-width: 0 3px 3px 0;
transform: rotate(45deg);
-webkit-transform: rotate(45deg);
-ms-transform: rotate(45deg);
border-radius: 0px;
margin: 0px 15px 5px 5px;
}
<div>
<input id="checkbox-1" class="checkbox-custom" name="checkbox-1" type="checkbox">
<label for="checkbox-1" class="checkbox-custom-label">First Choice</label>
</div>
<div>
<input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
<label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>
您可能需要阅读更深入的有关此类样式的文章,例如列出的这里;这超出了本答案的范围。
好的,那么没有自定义图像或伪元素的解决方案呢?
简而言之:看起来这行不通,使用自定义复选框代替
首先,让我们注意到,如果在其他浏览器中,复选框图标内部的伪边距是任意的,则没有一致的解决方案。为了建立一个解决方案,我们必须探索现有浏览器中此类图像的解剖学。
那么哪些浏览器具有复选框中的伪边距?我已经检查了Chrome 75、Vivaldi 2.5(基于Chromium)、FireFox 54(不要问为什么这么过时)、IE 11、Edge 42、Safari ??(借了一分钟,忘记检查版本了)。只有Chrome和Vivaldi有这样的伪边距(我怀疑所有基于Chromium的浏览器都有,如Opera)。
这些伪边距的大小是多少?可以使用缩放的复选框来找出:
input {
zoom: 10;
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
我的结果约为宽度/高度的7%,因此在绝对单位中为0.9-1.0像素。然而,准确性可能会受到质疑:尝试使用不同的缩放值进行复选框测试。在我对Chrome和Vivaldi的测试中,伪边距的相对大小在缩放值为10、20和11-19(??)时非常不同:

scale 似乎更加一致:
input {
transform: scale(10) translate(50%, 50%);
box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>
因此,大概是14%和2px是正确的值。
现在我们知道了伪边距的大小,但这还不够。所有浏览器的复选框图标大小都相同吗?唉!以下是未经样式化的复选框的DOM检查器显示的内容:
- FireFox:13.3px
- 基于Chromium的浏览器:整个东西12.8px,因此12.8(100%-14%)= 11px,视觉上感知为复选框的大小
- IE 11、Edge:13px
- Safari:n / a(我认为应该在同一屏幕上进行比较)
在我们讨论任何解决方案或技巧之前,让我们问一下:什么是正确的对齐方式?我们要实现什么?在某种程度上,这是品味问题,但基本上我可以考虑以下“好”对齐方式的方面:
文本和复选框在同一基线上(我故意不调整复选框大小):

或者在小写字母方面具有相同的中线:

或者在大写字母方面具有相同的中线(对于不同的字体大小,这更容易看出区别):

并且我们还需要决定复选框的大小是否应该与小写字母、大写字母或其他内容(更大、更小或介于小写字母和大写字母之间)相等。
在本讨论中,如果复选框与文本处于同一基线并具有大写字母的大小(这是一个极具争议的选择),则称其对齐方式为良好。

现在我们有哪些工具来:
- 调整复选框大小
- 识别带有伪边框复选框的Chromium并设置特定样式
- 调整复选框/标签的垂直对齐
?
关于复选框大小调整:有width、height、size、zoom、scale(我漏掉了什么吗?)。zoom和scale不能设置绝对大小,因此它们只能帮助调整到文本大小,而不能设置跨浏览器大小(除非我们可以编写特定于浏览器的规则)。size在Chrome中不起作用(它在旧版IE中起作用吗?无论如何,它并不那么有趣)。width和height在Chrome和其他浏览器中都有效,因此我们可以设置一个常见的大小,但是在Chrome中,它设置的是整个图像的大小,而不是复选框本身的大小。注意:最小(宽度,高度)定义了复选框的大小(如果宽度≠高度,则在复选框正方形外部的区域会添加“伪边距”)。
不幸的是,在我看来,Chrome复选框中的伪边距没有被设置为任何宽度和高度的零。
恐怕现在没有可靠的仅CSS方法。
让我们考虑垂直对齐。由于Chrome的伪边距,vertical-align设置为middle或baseline时无法给出一致的结果,因此获取所有浏览器相同的“坐标系”的唯一真实选项是将标签和输入对齐到top:

(图片上:垂直对齐:顶部、底部和没有盒子阴影的底部)
那么我们从这里得到的结果是什么?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
上面的片段适用于Chrome(基于Chromium的浏览器),但其他浏览器需要更小的复选框尺寸。似乎不可能以一种可以解决Chromium复选框图像问题的方式调整大小和垂直对齐。我的最终建议是:使用自定义复选框,这样就可以避免沮丧 :)
height和line-height属性来实现了它,请查看 http://jsfiddle.net/wepw5o57/3/。 - TheGr8_Nikposition和top进行操作,可以解决这个问题。 示例:https://jsfiddle.net/ynkjc22s/ - Profesor08