最后我们来看看问题的根源
复选框是使用图像呈现的(可以通过 CSS 设置自定义的)。这是 FireFox 中的一个(未选中)复选框,用 DOM 检查器突出显示:
这是 Chrome 中相同的无样式复选框:
可以看到边距(橙色);填充不存在(将显示为绿色)。那么复选框右侧和底部的伪边距是什么?这些是用于复选框的图像的一部分。这就是为什么使用 justvertical-align: middle
还不够,这就是跨浏览器问题的根源。
那么我们能做些什么呢?
一个明显的选择是——替换图像!幸运的是,可以通过 CSS 实现这一点,并用外部图像、base64 (in-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>
您可能想阅读一些有关此类样式的更深入的文章,例如此处列出的一些文章;它超出了这个答案的范围。
好的,仍然没有自定义图像或伪元素解决方案呢?
TL;DR:看起来这不起作用,请改用自定义复选框
首先,让我们注意,如果在其他浏览器中复选框图标内的那些伪边距是任意的,则没有一致的解决方案。要构建一个,我们必须在现有浏览器中探索此类图像的解剖结构。
那么哪些浏览器在复选框中有伪边距?我检查了 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.0px。但是,准确性可能会受到质疑:尝试zoom
复选框的不同值。在我对 Chrome 和 Vivaldi 的测试中,伪边距的相对大小在zoom
值 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 检查器为无样式复选框显示的内容:
- 火狐:13.3px
- 基于 Chromium:12.8px表示整个事物,因此 12.8 (100% - 14%) = 11px表示在视觉上被视为复选框
- IE 11,边缘:13px
- Safari:不适用(我相信这些应该在同一个屏幕上进行比较)
现在在我们讨论任何解决方案或技巧之前,让我们问一下:什么是正确的对齐方式?我们想要达到什么目的?在某种程度上,这是一个品味问题,但基本上我可以想到以下“不错”的对齐方面:
同一基线上的文本和复选框(我故意不在这里调整复选框大小):
或在小写字母方面具有相同的中间线:
或大写字母的相同中间线(更容易看出不同字体大小的差异):
我们还必须决定复选框的大小是否应该等于小写字母、大写字母或其他字母的高度(更大、更小或介于小写和大写之间)。
对于本次讨论,如果复选框与文本在同一基线上并且具有大写字母的大小(一个非常有争议的选择),我们称对齐为好:
现在我们需要什么工具:
- 调整复选框大小
- 使用伪边距复选框识别 Chromium 并设置特定样式
- 调整复选框/标签垂直对齐
?
关于复选框大小调整:有width
, height
, size
, zoom
, scale
(我错过了什么吗?)。zoom
并且scale
不允许设置绝对大小,因此它们可能仅有助于调整文本大小,而不是设置跨浏览器大小(除非我们可以编写特定于浏览器的规则)。size
不适用于 Chrome(它是否适用于旧 IE?无论如何,它并不那么有趣)。width
并且height
在 Chrome 和其他浏览器中工作,所以我们可以设置一个共同的大小,但同样,在 Chrome 中它设置整个图像的大小,而不是复选框本身。注意:定义复选框大小的是 minimum(width, height) (如果宽度≠高度,则将复选框正方形之外的区域添加到“伪边距”)。
不幸的是,据我所知,Chrome 复选框中的伪边距对于任何宽度和高度都没有设置为零。
恐怕这些天没有可靠的纯 CSS 方法。
让我们考虑垂直对齐。当设置为或由于 Chrome 的伪边距vertical-align
时无法给出一致的结果,为所有浏览器获得相同“坐标系”的唯一真正选择是将标签和输入对齐:middle
baseline
top
(上图:vertical-align: top, bottom and bottom without box-shadow)
那么我们从中得到什么结果呢?
input[type="checkbox"] {
height: 0.95em;
width: 0.95em;
}
label, input {
vertical-align: top;
}
<label><input type="checkbox">label</label>
上面的代码片段适用于 Chrome(基于 Chromium 的浏览器),但其他浏览器需要较小尺寸的复选框。似乎不可能以一种围绕 Chromium 的复选框图像怪癖的方式调整大小和垂直对齐方式。我的最后建议是:改用自定义复选框——这样你就可以避免沮丧:)