让我们最后看看问题的根源
复选框使用图像呈现(可以通过CSS设置自定义的)。FireFox中有一个(未选中)复选框,用DOM检查器突出显示:
这里是Chrome中相同的无样式复选框:
您可以看到边距(橙色);填充不存在(将显示为绿色)。那么,复选框右侧和底部的伪边距是什么?这些是用于复选框的图像的一部分。这就是为什么仅仅使用垂直对齐:中间并不足够,这是跨浏览器问题的根源。
那么我们该怎么办呢?
一个明显的选择是–替换图像!幸运的是,可以通过CSS实现这一点,并用外部图像、base64(在CSS中)图像、CSS svg或伪元素替换这些图像。这是一种强大的(跨浏览器!)方法,下面是从这个问题中窃取的调整示例:
复选框自定义{不透明度:0;位置:绝对;}复选框自定义,复选框自定义标签{显示:内联块;垂直对齐:中间;边距:5px;光标:指针;}复选框自定义+复选框自定义标签:之前{内容:“”;显示:内联块;背景:#fff;边界半径:5px;边框:2px实心#ddd;垂直对齐:中间;宽度:10px;高度:10px;填充:2px;右边距:10px;文本对齐:居中;}.checkbox自定义:checked+.checkbox定制标签:之前{宽度:1px;高度:5px;边框:纯蓝色;边框宽度:0 3px 3px 0;变换:旋转(45度);-webkit变换:旋转(45度);-ms变换:旋转(45度);边框半径:0px;边距: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”>首选</label></div><div><input id=“checkbox-2”class=“checkbox custom”name=“checkbox-2”type=“checkbox”>第二选择</label></div>
您可能想阅读一些关于此类样式的更深入的文章,如这里列出的一些;这超出了这个答案的范围。
好的,那么没有自定义图像或伪元素解决方案呢?
TL;DR:看起来这行不通,改用自定义复选框
首先,让我们注意到,如果在其他浏览器中,复选框图标内的伪边距是任意的,则没有一致的解决方案。要构建一个,我们必须探索现有浏览器中此类图像的解剖结构。
那么,哪些浏览器在复选框中有伪边距?我看过Chrome 75、Vivaldi 2.5(基于铬)、FireFox 54(别问为什么这么过时)、IE 11、Edge 42、Safari??(借用了一分钟,忘记查看版本)。只有Chrome和Vivaldi有这样的伪边距(我怀疑所有基于Chromium的浏览器,如Opera)。
这些伪利润的大小是多少?要解决此问题,可以使用缩放复选框:
输入{缩放:10;方框阴影:0 0 1px插图#999;}<输入类型=复选框>
我的结果是宽度/高度的约7%,因此绝对单位为0.9-1.0px。但是,准确性可能会受到质疑:请为复选框尝试不同的缩放值。在我的Chrome和Vivaldi测试中,在缩放值10、20和值11-19(??)时,伪边距的相对大小非常不同:
规模似乎更为一致:
输入{变换:缩放(10)平移(50%,50%);方框阴影:0 0 1px插图#999;}<输入类型=复选框>
因此,大约14%和2px是正确的值。
现在我们知道了伪边距的大小,让我们注意到这还不够。所有浏览器的复选框图标大小是否相同?唉!以下是DOM检查器为未设置样式的复选框显示的内容:
火狐:13.3px铬基:整体为12.8px,因此12.8(100%-14%)=11pxIE 11,边缘:13pxSafari:不适用(我认为应该在同一屏幕上进行比较)
现在,在我们讨论任何解决方案或技巧之前,让我们问:什么是正确的对齐?我们试图实现什么?在某种程度上,这是一个品味问题,但基本上我可以想到以下“不错”的对齐方式:
文本和复选框位于同一基线上(我故意不调整复选框大小):
或者在小写字母方面具有相同的中间线:
或以大写字母表示的相同中间线(更容易看到不同字体大小的差异):
此外,我们还必须决定复选框的大小是否应等于小写字母、大写字母或其他字母的高度(更大、更小或介于小写和大写之间)。
在本次讨论中,如果复选框与文本位于同一基线上,并且大小为大写字母(这是一个非常有争议的选择),那么我们称其为对齐方式:
现在我们需要哪些工具:
调整复选框大小使用伪边距复选框识别Chromium并设置特定样式调整复选框/标签垂直对齐
?
关于复选框大小调整:有宽度、高度、大小、缩放、比例(我错过了什么吗?)。缩放和缩放不允许设置绝对大小,因此它们只能帮助调整文本大小,而不能设置跨浏览器大小(除非我们可以编写特定于浏览器的规则)。大小不适用于Chrome(它适用于旧IE吗?无论如何,它没那么有趣)。宽度和高度在Chrome和其他浏览器中都有效,因此我们可以设置一个通用的大小,但在Chrome中,它设置的是整个图像的大小,而不是复选框本身。注意:它是定义复选框大小的最小值(宽度、高度)(如果宽度≠高度,则复选框方形外的区域将添加到“伪边距”)。不幸的是,据我所知,Chrome复选框中的伪边距并没有针对任何宽度和高度设置为零。现在恐怕没有可靠的仅使用CSS的方法。让我们考虑垂直对齐。由于Chrome的伪边距,当设置为中间或基线时,垂直对齐无法提供一致的结果,为所有浏览器获得相同“坐标系”的唯一真正选择是将标签和输入对齐到顶部:(图片上:垂直对齐:顶部、底部和底部,无框阴影)
那么,我们从中得到了什么结果?
输入[type=“checkbox”]{高度:0.95米;宽度:0.95米;}输入标签{垂直对齐:顶部;}<label><input-type=“checkbox”>label</label>
上面的代码片段适用于Chrome(基于Chromium的浏览器),但其他浏览器需要更小的复选框。似乎不可能同时调整大小和垂直对齐方式,以解决Chromium的复选框图像怪癖。我的最后一个建议是:使用自定义复选框,这样可以避免沮丧:)