这是困扰我的CSS小问题之一。

Stack Overflow周围的人如何在浏览器中始终垂直对齐复选框及其标签?

每当我在Safari中正确对齐它们(通常在输入上使用垂直对齐:基线),它们在Firefox和IE中就完全关闭了。

在Firefox中修复它,Safari和IE不可避免地被搞砸了。我每次编写表单时都在这上面浪费时间。

以下是我使用的标准代码:

<表单><div><label><input-type=“checkbox”/>标签文本</label></div></form>

我通常使用埃里克·迈耶的重置,所以表单元素相对来说没有覆盖。期待您提供的任何提示或技巧!


当前回答

让我们最后看看问题的根源

复选框使用图像呈现(可以通过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的复选框图像怪癖。我的最后一个建议是:使用自定义复选框,这样可以避免沮丧:)

其他回答

input {
    margin: 0;
}

真的很管用

我认为这是最简单的方法

输入{位置:相对;顶部:1px;}<表单><div><label><input-type=“checkbox”/>标签文本</label></div><表单>

在Chrome28OSX中,我选择了400+支持率的答案,这对我来说并不适用,可能是因为它没有在OSX中进行测试,或者在2008年回答这个问题时,它确实适用。

时代已经改变,新的CSS3解决方案现在是可行的。我的解决方案使用伪元素创建自定义复选框。因此,规定(无论你怎么看,是赞成还是反对)如下:

仅适用于现代浏览器(FF3.6+、IE9+、Chrome、Safari)依赖于自定义设计的复选框,该复选框将在每个浏览器/操作系统中呈现完全相同。这里我只是选择了一些简单的颜色,但你可以总是添加线性渐变,这样可以让它更具冲击力。调整为特定的字体/字体大小,如果更改,您只需更改复选框的位置和大小,使其看起来垂直对齐。如果调整正确,最终结果在所有浏览器/操作系统中应该仍然接近完全相同。无垂直对齐财产,无浮动在我的示例中必须使用所提供的标记,如果结构像问题一样,它将不起作用,但是,布局基本上看起来是一样的。如果您想四处移动,还必须移动关联的CSS

div.复选框{位置:相对;字体系列:Arial;字体大小:13px;}标签{位置:相对;向左填充:16px;}标签::之前{内容:“”;显示:内联块;宽度:10px;高度:10px;背景色:白色;边框:实心1px#9C9C9C;位置:绝对;顶部:1px;左:0px;}标签::之后{内容:“”;宽度:8px;高度:8px;背景色:#666666;位置:绝对;左:2px;顶部:3px;显示:无;}输入[类型=复选框]{可见性:隐藏;位置:绝对;}input[类型=复选框]:选中+标签::之后{显示:块;}输入[类型=复选框]:活动+标签::之前{背景色:#DDDDD;}<表单><div class=“checkbox”><input id=“check_me”type=checkbox/><label for=“check_me”>复选框的标签</label></div></form>

此解决方案隐藏复选框,并将伪元素添加到标签并设置其样式,以创建可见的复选框。由于标签与隐藏的复选框绑定,因此输入字段仍将更新,值将随表单一起提交。

如果你感兴趣,这里是我对单选按钮的看法:http://jsfiddle.net/DtKrV/2/

希望有人觉得这很有用!

尝试垂直对齐:中间

而且你的代码看起来应该是:<表单><div><input id=“blah”type=“checkbox”><label for=“blah“>标签文本</label></div></form>

我还没有完全测试过我的解决方案,但它似乎很有效。

我的HTML很简单:

<label class="checkbox"><input type="checkbox" value="0000">0000 - 0100</label>

然后,我将高度和宽度的所有复选框设置为24px。为了使文本对齐,我使标签的行高度也为24px,并指定垂直对齐:top;像这样:

编辑:IE测试后,我添加了垂直对齐:底部;并更改了标签的CSS。你可能会发现你需要一个有条件的IE css案例来整理填充-但是文本和框是内联的。

输入[type=“checkbox”]{宽度:24px;高度:24px;垂直对齐:底部;}标签复选框{垂直对齐:顶部;线条高度:24px;边距:2px 0;显示:块;高度:24px;}<label class=“checkbox”><input type=“checkbox“value=“0000”>0000-0100</label><label class=“checkbox”><input type=“checkbox”value=“0100”>0100-0200</label><label class=“checkbox”><input type=“checkbox”value=“0200”>0200-0300</label><label class=“checkbox”><input type=“checkbox”value=“0300”>0300-0400</label>

如果有人发现这不起作用,请告诉我。以下是它的实际操作(在Chrome和IE中-道歉,因为屏幕截图是在视网膜上拍摄的,并使用了IE的类似物):