提问



这是一直困扰着我的CSS小问题之一。 Stack Overflow周围的人如何垂直对齐 checkboxes 及其 labels 跨浏览器?每当我在Safari中正确对齐它们时(通常使用input上的vertical-align: baseline,它们在Firefox和IE中完全关闭。在Firefox中修复它,Safari和IE不可避免地搞砸了。我浪费了我每次编写表单时都会有这个时间。


这是我使用的标准代码:




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



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



  1. 输入必须在各自的行上。

  2. 复选框输入需要在所有浏览器中与标签文本垂直对齐(如果不相同)。

  3. 如果标签文本换行,则需要缩进(因此不要在复选框下面进行包装)。



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




label {
  display: block;
  padding-left: 15px;
  text-indent: -15px;
}
input {
  width: 13px;
  height: 13px;
  padding: 0;
  margin:0;
  vertical-align: bottom;
  position: relative;
  top: -1px;
  *overflow: hidden;
}

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



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


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


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




.checkboxes label {
  display: block;
  float: left;
  padding-right: 10px;
  white-space: nowrap;
}
.checkboxes input {
  vertical-align: middle;
}
.checkboxes label span {
  vertical-align: middle;
}

<form>
  <div class="checkboxes">
    <label for="x"><input type="checkbox" id="x" /> <span>Label text x</span></label>
    <label for="y"><input type="checkbox" id="y" /> <span>Label text y</span></label>
    <label for="z"><input type="checkbox" id="z" /> <span>Label text z</span></label>
  </div>
</form>



使用One Crayon的解决方案,我有一些对我有用的东西,更简单:




input[type=checkbox], input[type=radio] {
  vertical-align: middle;
  position: relative;
  bottom: 1px;
}

input[type=radio] {
  bottom: 2px;
}

<label>
  <input type="checkbox">
  Label text
</label>



一个似乎运作良好的简单方法是应用垂直对齐调整复选框的垂直位置。它仍然会因浏览器而异,但解决方案并不复杂。


input {
    vertical-align: -2px;
}


参考 [67]

最佳参考


试试vertical-align: middle


您的代码似乎应该是:


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



尝试我的解决方案,我在IE 6,FF2和Chrome中尝试了它,它在所有三个浏览器中逐个像素地渲染。




* {
  padding: 0px;
  margin: 0px;
}
#wb {
  width: 15px;
  height: 15px;
  float: left;
}
#somelabel {
  float: left;
  padding-left: 3px;
}

<div>
  <input id="wb" type="checkbox" />
  <label for="wb" id="somelabel">Web Browser</label>
</div>



对我来说唯一完美的解决方案是:


input[type=checkbox], input[type=radio] {
    vertical-align: -2px;
    margin: 0;
    padding: 0;
}


今天在Chrome,Firefox,Opera,IE 7和8中进行了测试。示例:小提琴 [68]

其它参考1


我通常使用行高来调整静态文本的垂直位置:




label {
  line-height: 18px;
}
input {
  width: 13px;
  height: 18px;
  font-size: 12px;
  line-height: 12px;
}

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



我还没有完全测试我的解决方案,但似乎工作得很好。


我的HTML很简单:


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


然后我将所有复选框设置为24px的高度和宽度。为了使文本对齐,我制作标签s line-height24px并指定vertical-align: top;,如下所示:


编辑:在IE测试后,我将vertical-align: bottom;添加到输入并更改了标签的CSS。您可能会发现需要一个条件IE css案例来整理填充 - 但文本和框是内联的。


input[type="checkbox"] {
    width: 24px;
    height: 24px;
    vertical-align: bottom;
}
label.checkbox {
    vertical-align: top;
    line-height: 24px;
    margin: 2px 0;
    display: block;
    height: 24px;
}


如果有人发现这不起作用,请让我知道。这是它的实际应用(在Chrome和IE中 - 道歉,因为截图是在视网膜上进行的,并且使用了IE的并行):





其它参考2


我认为这是最简单的方法


input {
    position: relative;
    top: 1px;
}


小提琴 [69]

其它参考3


这适合我:




fieldset {
  text-align:left;
  border:none
}
fieldset ol, fieldset ul {
  padding:0;
  list-style:none
}
fieldset li {
  padding-bottom:1.5em;
  float:none;
  clear:left
}
label {
  float:left;
  width:7em;
  margin-right:1em
}
fieldset.checkboxes li {
  clear:both;
  padding:.75em
}
fieldset.checkboxes label {
  margin:0 0 0 1em;
  width:20em
}
fieldset.checkboxes input {
  float:left
}

<form>
  <fieldset class="checkboxes">
    <ul>
      <li>
        <input type="checkbox" name="happy" value="yep" id="happy" />
        <label for="happy">Happy?</label>
      </li>
      <li>
        <input type="checkbox" name="hungry" value="yep" id="hungry" />
        <label for="hungry">Hungry?</label>
      </li>
    </ul>
  </fieldset>
</form>



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


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

其它参考4


我不喜欢相对定位,因为它使得元素在其关卡上呈现在其他所有内容之上(如果你有复杂的布局,它可以在某些东西之上)。


我发现vertical-align: sub使得复选框在Chrome,Firefox和Opera中看起来非常合适。不能检查Safari因为我没有MacOS而且IE10略有偏差,但我发现它很好足够的解决方案给我。


另一种解决方案可能是尝试为每个浏览器制作特定的CSS,并使用%/pixels/EMs中的一些vertical-align对其进行微调:
http://css-tricks.com/snippets/css/browser-specific-hacks/[70]

其它参考5


现在所有现代浏览器都支持flexbox,这样的事情对我来说似乎更容易。


<style>
label {
  display: flex;
  align-items: center;
}
input[type=radio], input[type=checkbox]{
  flex: none;
}
</style>
<form>
  <div>
    <label><input type="checkbox" /> Label text</label>
  </div>
</form>


点击
这是完整的前缀版演示:




label {
	display: -webkit-box;
	display: -webkit-flex;
	display: -ms-flexbox;
	display: flex;
	-webkit-box-align: center;
	-webkit-align-items: center;
	-ms-flex-align: center;
	align-items: center;
}
input[type=radio], 
input[type=checkbox] {
	-webkit-box-flex: 0;
	-webkit-flex: none;
	-ms-flex: none;
	flex: none;
	margin-right: 10px; 
}
/* demo only (to show alignment) */
form {
  max-width: 200px
}

<form>
  <label>
    <input type="radio" checked>
    I am an aligned radio and label
  </label>
  <label>
      <input type="checkbox" checked>
    I am an aligned checkbox and label
  </label>
</form>



只是想在标签上添加关于for属性的讨论(稍微偏离主题):


请提供它,即使没有必要,因为从javascript使用它非常方便:


var label = ...
var input = document.getElementById(label.htmlFor);


这比试图弄清楚标签的输入是否嵌套,或者输入是在标签之前,还是之后......等等都要方便得多。而且它永远不会伤害它......所以。


只需2美分。

其它参考6


如果您使用 ASP.NET Web窗体,您不必担心DIV和其他元素或固定大小。我们可以通过将float:left设置为float:left来对齐<asp:CheckBoxList>文本CSS中的CheckboxList输入类型。


请检查以下示例代码:


.CheckboxList
{
    font-size: 14px;
    color: #333333;
}
.CheckboxList input
{
    float: left;
    clear: both;
}


.ASPX代码:


<asp:CheckBoxList runat="server" ID="c1" RepeatColumns="2" CssClass="CheckboxList">
</asp:CheckBoxList>

其它参考7


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


诀窍是只在表格单元格中使用vertical-align,如果使用label标签则使用inline-block。

其它参考8


如果你正在使用Twitter Bootstrap,你可以使用<label>上的checkbox类:


<label class="checkbox">
    <input type="checkbox"> Remember me
</label>

其它参考9


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

其它参考10


输入类型复选框包含在标签内并向左浮动,如下所示:


<label for="id" class="checkbox">
    <input type="checkbox" id="id">
    <span>The Label</span>
</label>


这对我有用:


label.checkbox {
    display: block;
}
.checkbox input {
    float: left;
    height: 18px;
    vertical-align: middle;
}
.checkbox span {
    float: left;
    line-height: 18px;
    margin: 0 0 0 20px;
}


确保高度与(blocklevel)的行高相同。

其它参考11


选择400+ upvotes的答案对我来说在Chrome 28 OSX中不起作用,可能是因为它没有在OSX中测试过,或者它在2008年回答这个问题的时候确实有效。


时代已经改变,现在新的CSS3解决方案是可行的。我的解决方案使用伪元素来创建自定义复选框。因此,规定(利弊,无论你如何看待)如下:[72]



  • 仅适用于现代浏览器(FF3.6 +,IE9 +,Chrome,Safari)

  • 依赖于自定义设计的复选框,在每个浏览器/操作系统中都会呈现完全相同的复选框。在这里,我只是选择了一些简单的颜色,但你总是可以添加线性渐变等,以便让它更具爆炸性。

  • 适应某种字体/字体大小,如果更改,您只需更改复选框的位置和大小,使其显示为垂直对齐。如果调整正确,最终结果应该仍然接近于所有浏览器/操作系统都一样。

  • 没有垂直对齐属性,没有浮点数

  • 必须在我的示例中使用提供的标记,如果结构类似于问题,它将无法工作,但是,布局基本上看起来相同。如果你想移动东西,你将不得不移动相关的CSS



你的HTML:


<form>
    <div class="checkbox">
        <input id="check_me" type=checkbox />
        <label for="check_me">Label for checkbox</label>
    </div>
</form>


你的CSS:


div.checkbox {
    position: relative;
    font-family: Arial;
    font-size: 13px;
}
label {
    position: relative;
    padding-left: 16px;
}
label::before {
    content :"";
    display: inline-block;
    width: 10px;
    height: 10px;
    background-color: white;
    border: solid 1px #9C9C9C;
    position: absolute;
    top: 1px;
    left: 0px;
}
label::after {
    content:"";
    width: 8px;
    height: 8px;
    background-color: #666666;
    position: absolute;
    left: 2px;
    top: 3px;
    display: none;
}
input[type=checkbox] {
    visibility: hidden;
    position: absolute;
}
input[type=checkbox]:checked + label::after {
    display: block;
}
input[type=checkbox]:active + label::before {
    background-color: #DDDDDD;
}


此解决方案隐藏了复选框,并将伪元素添加并设置为标签以创建可见复选框。由于标签与隐藏的复选框相关联,因此输入字段仍将更新,并且值将与表单一起提交。


jsFiddle:http://jsfiddle.net/SgXYY/6/[73]


如果你对此感兴趣,请点击我的单选按钮:http://jsfiddle.net/DtKrV/2/[74]


希望有人觉得这很有用!

其它参考12


我通常留下一个未标记的复选框,然后将其标签作为一个单独的元素。这很麻烦,但是复选框和它们的标签之间的显示方式之间有很多跨浏览器的区别(正如你已经注意到的),这是我能够接近控制一切外观的唯一方式。


出于同样的原因,我也最终在winforms开发中这样做了。我认为复选框控件的根本问题在于它实际上是两个不同的控件:盒子和标签。通过使用一个复选框,您可以将它留给控件的实现者来决定这两个元素是如何彼此相邻显示的(并且它们总是错误的,哪里错误=不是你想要的)。


我真的希望有人能更好地回答你的问题。

其它参考13


CSS:


.threeCol .listItem {
    width:13.9em;
    padding:.2em;
    margin:.2em;
    float:left;
    border-bottom:solid #f3f3f3 1px;
}
.threeCol input {
    float:left;
    width:auto;
    margin:.2em .2em .2em 0;
    border:none;
    background:none;
}
.threeCol label {
    float:left;
    margin:.1em 0 .1em 0;
}


HTML:


<div class="threeCol">
    <div class="listItem">
        <input type="checkbox" name="name" id="id" value="checkbox1" />
        <label for="name">This is your checkBox</label>
    </div>
</div>


上面的代码会将您的列表项放在三个库中,只需更改宽度即可。

其它参考14


简单地使用vertical-align: sub,正如pokrishka已经建议的那样。


小提琴[76]


HTML代码:


<div class="checkboxes">
    <label for="check1">Test</label>
    <input id="check1" type="checkbox"></input>
</div>


CSS代码:


.checkboxes input {
    vertical-align: sub;
}

其它参考15




input[type=checkbox]
{
    vertical-align: middle;
} 

<input id="testCheckbox" name="testCheckbox" type="checkbox">
<label for="testCheckbox">I should align</label>



谢谢!这也一直让我疯狂。


在我的特殊情况下,这对我有用:


input {
    width: 13px;
    height: 13px;
    padding: 0;
    margin:0;
    vertical-align: top;
    position: relative;
    *top: 1px;
    *overflow: hidden;
}
label {
    display: block;
    padding: 0;
    padding-left: 15px;
    text-indent: -15px;
    border: 0px solid;
    margin-left: 5px;
    vertical-align: top;
}


我正在使用reset.css,这可能解释了一些差异,但这似乎对我有用。

其它参考16


<fieldset class="checks">
    <legend>checks for whatevers</legend>
    <input type="" id="x" />
    <label for="x">Label</label>
    <input type="" id="y" />
    <label for="y">Label</label>
    <input type="" id="z" />
    <label for="z">Label</label>
</fieldset>


无论如何,你应该将表单控件组合在一起放在他们自己的fieldsets中,在这里,它会播放wrappa。 set input/label do display:block,input float left,label float right,设置宽度,用左/右边距控制间距,相应地对齐标签文本。


所以


fieldset.checks {
    width:200px
}
.checks input, .checks label {
    display:block;
}
.checks input {
    float:right;
    width:10px;
    margin-right:5px
}
.checks label {
    float:left;
    width:180px;
    margin-left:5px;
    text-align:left;
    text-indent:5px
}


您可能需要在两者上设置边框,轮廓和线高,以及跨浏览器/媒体解决方案。

其它参考17


position: relative; IE在z-index和jQuery的slideUp/slideDown等动画中存在一些问题。


CSS:


input[type=checkbox], input[type=radio] {
    vertical-align: baseline;
    position: relative;
    top: 3px;
    margin: 0 3px 0 0;
    padding: 0px;
}
input.ie7[type=checkbox], input.ie7[type=radio] {
    vertical-align: middle;
    position: static;
    margin-bottom: -2px;
    height: 13px;
    width: 13px;
}


jQuery的:


$(document).ready(function () {
    if ($.browser.msie && $.browser.version <= 7) {
        $('input[type=checkbox]').addClass('ie7');
        $('input[type=radio]').addClass('ie7');
    }
});


样式可能需要调整,具体取决于<label>中使用的字体大小


PS:点击
我使用ie7js使css在IE6中工作。 [77]

其它参考18


以下内容提供了跨浏览器的像素完美一致性,甚至是IE9:


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



  1. 创建输入和标签。

  2. 将它们显示为块,以便您可以随意浮动它们。

  3. 将高度和线高设置为相同的值,以确保它们居中并垂直对齐。

  4. 对于 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。


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

其它参考19


所以我知道这已经被多次回答了,但我觉得我有一种比已经提供的更优雅的解决方案。不仅有一个优雅的解决方案,还有两个独立的解决方案,可以让您满怀希望。话虽如此,您需要知道和看到的所有内容都包含在2个JS Fiddle中,并附有评论。





解决方案#1依赖于给定浏览器的原生Checkbox,但有一个扭曲...它包含在div中,更容易定位跨浏览器,带溢出:隐藏以切断多余的1px拉伸复选框(这是你不能看到FF的丑陋边界)


简单的HTML:(按照链接查看带有注释的css,代码块是为了满足stackoverflow) http://jsfiddle.net/KQghJ/[78]


<label><div class="checkbox"><input type="checkbox" /></div> Label text</label>





解决方案#2使用Checkbox Toggle Hack切换DIV的CSS状态,该状态已经在浏览器中正确定位,并使用简单的sprite设置复选框未选中和已检查状态。所需要的只是使用Checkbox Toggle Hack调整背景位置。在我看来,这是更优雅的解决方案,因为您可以更好地控制您的复选框和&无线电,并且可以保证它们在浏览器中看起来一样。


简单的HTML:(按照链接查看带注释的CSS,代码块是为了满足StackOverflow) http://jsfiddle.net/Sx5M2/[79]


<label><input type="checkbox" /><div class="checkbox"></div>Label text</label>





如果有人不同意这些方法,请给我发表评论,我很想听到一些关于为什么其他人没有遇到这些解决方案的反馈,或者如果他们有,为什么我在这里看不到有关他们的答案?如果有人看到一个这些方法失败了,很高兴看到这一点,但是这些已经在最新的浏览器中进行了测试,并依赖于相当古老的HTML/CSS方法,并且我已经看到了它的普遍性。