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

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

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

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

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

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

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


当前回答

在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/

希望有人觉得这很有用!

其他回答

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

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

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

简单的解决方案:

<label style="display:block">
  <input style="vertical-align:middle" type="checkbox">
  <span  style="vertical-align:middle">Label</span>
</label>

在Chrome、Firefox、IE9+、Safari和iOS 9中测试+

有时垂直对齐需要两个相邻的内联(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>

我找到了一种在几乎所有浏览器中都能得到相同结果的方法。至少是最新的浏览器。它适用于Firefox、Chrome、Safari和Opera。在IE中,它看起来就像没有对输入或标签应用规则一样(即,它的标签仍然比输入低几个像素),所以我认为这是可以理解的。

HTML

<label class="boxfix"><input type="radio">Label</label>

CSS

.boxfix {
    vertical-align: bottom;
}
.boxfix input {
    margin: 0;
    vertical-align: bottom;
    position: relative;
    top: 1.999px; /* the inputs are slightly more centered in IE at 1px (they don't interpret the .999 here), and Opera will round it to 2px with three decimals */
}