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

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

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

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

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

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

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


当前回答

我从来没有这样做的问题:

<form>
  <div>
    <input type="checkbox" id="cb" /> <label for="cb">Label text</label>
  </div>
</form>

其他回答

警告这个答案太老了,在现代浏览器上不起作用。

我不是这个答案的海报,但在写这篇文章时,这是迄今为止在正面和负面投票中投票最多的答案(+1035-17),它仍然被标记为接受答案(可能是因为问题的原始海报是写这个答案的人)。

正如评论中多次指出的那样,这个答案在大多数浏览器上都不起作用了(自2013年以来似乎一直无法做到这一点)。


经过一个多小时的调整、测试和尝试不同风格的标记,我想我可能有一个不错的解决方案。该特定项目的要求如下:

输入必须在自己的线路上。复选框输入需要在所有浏览器中与标签文本垂直对齐(如果不相同)。如果标签文本换行,则需要缩进(因此复选框下面没有换行)。

在我做出任何解释之前,我只给你代码:

标签{显示:块;向左填充:15px;文本缩进:-15px;}输入{宽度:13px;高度:13px;填充:0;边距:0;垂直对齐:底部;位置:相对;顶部:-1px;*溢出:隐藏;}<表单><div><label><input-type=“checkbox”/>标签文本</label></div></form>

这里是JSFiddle中的工作示例。

这段代码假设您使用的是类似于EricMeyer的重置,它不会覆盖表单输入边距和填充(因此在输入CSS中设置边距和填充重置)。显然,在实际环境中,您可能会嵌套/覆盖支持其他输入元素的内容,但我希望保持简单。

需要注意的事项:

*溢出声明是一个内联IE黑客(星属性黑客)。IE 6和7都会注意到它,但Safari和Firefox会适当地忽略它;只是为了简单起见使用它。据我所知,在浏览器中唯一一致的垂直对齐语句是垂直对齐:底部。在Safari、Firefox和IE中,设置此项并相对向上定位的行为几乎相同,只有一两个像素的差异。使用对齐的主要问题是IE在输入元素周围留下了一堆神秘的空间。它不是填充或边距,它是该死的持久性。在复选框上设置一个宽度和高度,然后溢出:由于某种原因隐藏,会切断额外的空间,并允许IE的定位与Safari和Firefox非常相似。根据您的文本大小,您无疑需要调整相对位置、宽度、高度等,以使内容看起来正确。

除了今天早上我在做的项目之外,我还没有在其他项目上尝试过这种特定的技术,所以如果你找到更稳定的方法,一定要闭嘴。


警告这个答案太老了,在现代浏览器上不起作用。

有时垂直对齐需要两个相邻的内联(span、label、input等)元素才能正常工作。以下复选框在IE、Safari、FF和Chrome中垂直居中,即使文本大小很小或很大。

它们都在同一行上彼此相邻浮动,但nowrap意味着整个标签文本始终保持在复选框旁边。

缺点是额外的无意义SPAN标签。

复选框标签{显示:内联块;右侧填充:10px;空白:nowrap;}复选框输入{垂直对齐:中间;}复选框标签跨度{垂直对齐:中间;}<表单><div class=“checkbox”><label><inputtype=“checkbox”><span>标签文本x</span></label><label><input-type=“checkbox”><span>标签文本y</span></label><label><input-type=“checkbox”><span>标签文本z</span></label></div></form>

现在,如果您有一个非常长的标签文本需要在复选框下换行而不换行,那么您可以在标签元素上使用填充和负文本缩进:

复选框标签{显示:块;右侧填充:10px;向左填充:22px;文本缩进:-22px;}复选框输入{垂直对齐:中间;}复选框标签跨度{垂直对齐:中间;}<表单><div class=“checkbox”><label><input-type=“checkbox”><span>给文本x加上很长的标签,使其可能会换行,让我们看看它如何与建议的CSS(预期:两行很好地对齐)</span></label><label><input-type=“checkbox”><span>标签文本y</span></label><label><input-type=“checkbox”><span>标签文本z</span></label></div></form>

以下内容为浏览器(甚至IE9)提供了完美的像素一致性:

这种方法非常明智,显而易见:

创建输入和标签。将它们显示为块,以便您可以随意浮动它们。将高度和线高度设置为相同的值,以确保它们居中并垂直对齐。对于em测量,要计算元素的高度,浏览器必须知道这些元素的字体高度,并且它本身不能在em测量中设置。

这导致了一个全球适用的通用规则:

input, label {display:block;float:left;height:1em;line-height:1em;}

字体大小可根据表单、字段集或元素进行调整。

#myform input, #myform label {font-size:20px;}

在Mac、Windows、Iphone和Android上的最新Chrome、Safari和Firefox中进行了测试。以及IE9。

此方法可能适用于不高于一行文本的所有输入类型。根据需要应用类型规则。

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

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

硬编码复选框的高度和宽度,删除其填充,并使其高度加上垂直边距等于标签的行高度。如果标签文本是内联的,请浮动复选框。Firefox、Chrome和IE7+都以相同的方式呈现以下示例:http://www.kornea.com/css-checkbox-align