如何对齐复选框及其标签始终跨浏览器


1732

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

这是我使用的标准代码:

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

我通常使用Eric Meyer的重置,因此表单元素相对而言是覆盖不大的。期待您提供的任何提示或技巧!


7
将每个复选框和标签放在<li>元素中。将overflow:hidden添加到<li>,然后将标签和复选框浮动到左边。然后它们全部对齐就很好了。显然不要将复选框放在label元素内。
1

5
我已经通过使用heightline-height属性获得了效果,请看一下jsfiddle.net/wepw5o57/3
TheGr8_Nik 2014年

操纵与positiontop将解决这个问题实施例:jsfiddle.net/ynkjc22s
Profesor08

2019。仍然是同一期。仍然需要一些技巧来使它起作用:(
Dieter

@dieter看到了我的答案,我已经解释了为什么需要黑客入侵,而哪种方法不是黑客攻击:stackoverflow.com/a/56558431/3995261
YakovL

Answers:


1009

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

  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>

这是JSFiddle中的工作示例。

此代码假定您使用的是类似Eric Meyer的重置,该重置不会覆盖表单输入的边距和填充(因此会将边距和填充重置放在输入CSS中)。显然,在实际环境中,您可能会嵌套/覆盖东西以支持其他输入元素,但我想让事情保持简单。

注意事项:

  • *overflow声明是一个内联IE hack(星级属性hack)。IE 6和7都会注意到它,但是Safari和Firefox将适当地忽略它。我认为这可能是有效的CSS,但条件注释会更好。只是为了简单起见使用它。
  • 据我所知,在vertical-align所有浏览器中唯一一致的语句是vertical-align: bottom。在Safari,Firefox和IE中,设置此值然后相对向上定位几乎相同,只有一个或两个像素差异。
  • 使用对齐的主要问题是IE在输入元素周围留下了许多神秘的空间。它不是填充或边距,而是该死的持久性。在复选框上设置宽度和高度,然后overflow: hidden由于某种原因会减少多余的空间,并使IE的定位与Safari和Firefox非常相似。
  • 毫无疑问,根据文本的大小,您需要调整相对位置,宽度,高度等等,以使外观看起来正确。

希望这对别人有帮助!除了今天早上正在研究的项目之外,我没有在其他项目上尝试过这种特定技术,因此,如果您发现一些更一致的方法,请务必进行尝试。


8
注意。您可能应该在标签上放置一个“ for”属性,以确保该属性适用于所有浏览器和文本阅读器。(我意识到您可能为简单起见就忽略了它)
Armstrongest

306
令人悲伤的是,我没有意识到有多少人对此一无所知:如果将输入内容包装在标签标签中,则“ for”属性是不必要的。随时随地看看:w3.org/TR/html401/interact/forms.html#h-17.9.1
蜡笔小新

10
我不同意使用条件注释的建议。保持* foobar CSS hack。效果很好,已被YUI之类的框架使用,并允许您将所有内容保持在一起。
ebruchez

50
尝试在Chrome 28,Mac OSX中解决此问题,并且该复选框明显低于文本框
MusikAnimal 2013年

9
请注意,在最新版本的Chrome(我使用的是v36)中,该功能似乎无效。i.imgur.com/y9Ffxsh.png 编辑:也不是Firefox(v31)
汉斯

214

有时,垂直对齐需要两个相邻的内联元素(跨度,标签,输入等)才能正常工作。以下复选框在IE,Safari,FF和Chrome中正确垂直居中,即使文本大小非常小也是如此。

它们都在同一行上彼此相邻浮动,但是nowrap表示整个标签文本始终位于复选框旁边。

缺点是多余的无意义的SPAN标签。

.checkboxes label {
  display: inline-block;
  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>

现在,如果您有很长的标签文本需要在复选框下不包装而要包装,则可以在标签元素上使用填充和负文本缩进:

.checkboxes label {
  display: block;
  padding-right: 10px;
  padding-left: 22px;
  text-indent: -22px;
}
.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 so long that it will probably wrap so let's see how it goes with the proposed CSS (expected: two lines are aligned nicely)</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>


19
谢谢!输入和跨度上的“垂直对齐:中间”对我来说效果很好。
威廉·格罗斯

6
display: block; float: left;似乎是多余的
PHPst 2013年

4
当标签内有输入时,不必使用for属性。没有它就行了。
TommySørensen'16

6
我认为这应该是公认的答案。无需调整。
蒂姆(Tim)

4
出色且已确认的功能仍可在Chrome 58(Windows)上使用(不同于当前的最佳答案)。
杰森C

188

One Crayon解决方案的基础上,我有一些对我有用的东西,而且更简单:

.font2 {font-family:Arial; font-size:32px} /* Sample font */

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>
<p class="font2">
  <label><input type="checkbox"/> Label text</label>
</p>

在Safari(我相信其基准)中以像素为单位呈现相同的内容,而Firefox和IE7都可以很好地检出。它也适用于各种大小的标签字体。现在,为了将IE的基准固定在选择和输入上...


更新:(第三方编辑)

正确的bottom位置取决于字体系列和字体大小!我发现bottom: .08em;用于复选框和单选元素是一个很好的一般价值。我在使用Arial和Calibri字体的Windows中的Chrome / Firefox / IE11中使用了几种小/中/大字体来测试了它。

.font2, .font2 input {font-family:Arial; font-size:32px} /* Sample font */

input[type=checkbox], input[type=radio] {
  vertical-align: middle; 
  position: relative;
  bottom: .08em; /* this is a better value for different fonts! */
}
<label><input type="checkbox" /> Label text</label> 

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


10
给其他人一个提示:这在IE6中不起作用,因为它不支持[type = checkbox] CSS定位。
一支蜡笔

3
如果需要IE6支持,则可以只添加一个类,而不使用不支持的选择器。
哈特利·桑2014年

1
这个为我工作。但是,可以使用“ margin:0 0 1px 0”代替设置“ position:relative; bottom:1px”来获得相同的结果。
newman

142

看起来很有效的一件简单事情是使用vertical-align调整复选框的垂直位置。跨浏览器,它仍然会有所不同,但是解决方案并不复杂。

input {
    vertical-align: -2px;
}

参考


9
在所有其他版本中,这是最小的更改,这对我来说适用于最新版本的浏览器。
Johnny_D 2014年

6
这比使用更好vertical-alignposition: relative因为它也可以在IE9中正常工作:)
Dennis98

5
但这取决于字体大小。对于大字体,必须将其调整为更高的负值,例如:vertical-align:-6px;
S.Serpooshan

1
如果在em
YakovL

92

尝试 vertical-align: middle

您的代码似乎也应该是:

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


<label for="blah">仅当您使用的标签不需要包装的东西时才需要(例如文本框;我通常会<label for="blah">Foo</label><input id="blah" type="text" />在该实例中使用)。使用复选框,我发现包装它的标记更少了。
一支蜡笔

13
并非完全正确:Label-for允许用户单击标签以选中复选框,而不仅仅是单击复选框本身。将两个元素捆绑在一起非常方便。
EndangeredMassa

26
如果输入嵌套在标签内,则单击具有激活/焦点的标签。for属性仅适用于未嵌套输入的情况。
一支蜡笔

3
确实是One Crayon,但使用“ for”属性仍然是一个好习惯,否则某些浏览器会遇到无法识别此语法咳嗽 IE的问题。
阿姆斯特朗(Armstrongest)

如果您不希望复选框具有ID,则需要将复选框包装在标签内
Simon_Weaver

39

尝试我的解决方案,我在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>


3
有趣; 我喜欢浮动这两个元素的想法;优雅地解决了包装问题。我喜欢用标签包装输入内容,但是该代码比我提供的解决方案要干净得多。
一支蜡笔

在此示例中,复选框输入和标签还应该具有属性显示:块,在这种情况下,它们将被视为可以轻松对齐的普通DIV
se_pavel

5
这有一个问题,如果标签不适合可用空间怎么办?标签和复选框是分开的(复选框在右上方,标签在左下方)。如果将复选框包装在标签内,则不会出现此问题。
Enrique

它没有达到像素的要求,但它足以让它在3种主要浏览器上看起来更好。我想我可能还要花一个小时才能看到它会更好...
Alexis Wilke 2014年

26

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

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

今天测试在Chrome,Firefox,歌剧,IE 7和8实施例:小提琴


22

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

我的HTML很简单:

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

然后,我将所有复选框24px都设置为高度和宽度。为了使文本对齐,我也使标签line-height也对齐24pxvertical-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;
}
<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使用并行表示歉意):

复选框的屏幕截图:Chrome 复选框的屏幕截图:IE


1
这已经很老了,但是由于您要告诉您,所以在FireFox中效果不佳(复选框位于基线之上)。您可能我发布的详细说明感兴趣
YakovL

20

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

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>

希望能有所帮助。


行高,eight。永远不要忘记那一个。做得好,效果很好。
克雷格

13

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

诀窍是仅在表单元格中使用垂直对齐方式,如果使用标签标签,则仅在行内块中使用。


11

最后,让我们看一下问题的根源

复选框是使用图片呈现的(一个可以通过CSS设置自定义)。这是FireFox中的一个(未选中的)复选框,以DOM检查器突出显示:

这只是一个正方形

这是Chrome中相同的无样式复选框:

这是一个无中心的正方形,右边和底部都有“边距”

您可以看到边距(橙色);填充不存在(将显示为绿色)。那么,复选框右侧和底部的伪利润是多少?这些是用于复选框的图像的一部分。这就是为什么仅使用vertical-align: middleJust不够用,这就是跨浏览器问题的根源。

那么我们该怎么办?

一个明显的选择是–替换图像!幸运的是,可以通过CSS做到这一点,并将其替换为外部图像,base64(in-CSS)图像,in-CSS svg或仅是伪元素。这是一种健壮的(跨浏览器!)方法,这是一个从该问题中窃取此类调整的示例:

.checkbox-custom {
  opacity: 0;
  position: absolute;
}
.checkbox-custom,
.checkbox-custom-label {
  display: inline-block;
  vertical-align: middle;
  margin: 5px;
  cursor: pointer;
}
.checkbox-custom + .checkbox-custom-label:before {
  content: '';
  display: inline-block;
  background: #fff;
  border-radius: 5px;
  border: 2px solid #ddd;
  vertical-align: middle;
  width: 10px;
  height: 10px;
  padding: 2px;
  margin-right: 10px;
  text-align: center;
}
.checkbox-custom:checked + .checkbox-custom-label:before {
  width: 1px;
  height: 5px;
  border: solid blue;
  border-width: 0 3px 3px 0;
  transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  border-radius: 0px;
  margin: 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">First Choice</label>
</div>
<div>
  <input id="checkbox-2" class="checkbox-custom" name="checkbox-2" type="checkbox">
  <label for="checkbox-2" class="checkbox-custom-label">Second Choice</label>
</div>

你可能想了解这样的造型像一些列出了一些更有深度的文章在这里 ; 这超出了此答案的范围。

好吧,那还是没有自定义图像或伪元素的解决方案呢?

TL; DR:看来这行不通,请改用自定义复选框

首先,请注意,如果在其他浏览器中复选框图标内的那些伪边距是任意的,则没有一致的解决方案。要构建一个图像,我们必须在现有浏览器中探索此类图像的结构。

那么哪些浏览器的复选框中有伪边距?我已经检查了Chrome 75,Vivaldi 2.5(基于铬),FireFox 54(不要问为什么这样过时),IE 11,Edge 42,Safari ?? (借用一分钟,忘了签出版本)。只有Chrome和Vivaldi才有这种伪利润(我怀疑所有基于Chromium的浏览器也一样,例如Opera)。

这些伪利润的大小是多少?要弄清楚这一点,可以使用缩放复选框:

input {
  zoom: 10;
  box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>

我的结果是宽度/高度的7%,因此以绝对单位为0.9-1.0px。但是,准确性可能会受到质疑:请zoom为复选框尝试不同的值。在Chrome和Vivaldi的测试中,伪边距的相对大小在zoom值10、20和值11-19(??)上有很大不同:

放大= 10等于7% 而对于zoom = 11,几乎是该值的两倍

scale 似乎更一致:

input {
  transform: scale(10) translate(50%, 50%);
  box-shadow: 0 0 1px inset #999;
}
<input type=checkbox>

因此大约14%和2px是正确的值。

现在我们知道(?)伪边距的大小,让我们注意这还不够。所有浏览器的复选框图标的大小都一样吗?唉! 这是DOM检查器显示的无样式复选框的内容:

  • 火狐:13.3px
  • 基于铬的元素:整个元素为12.8 像素,因此对于可视为复选框的元素,其值为12.8(100%-14%)= 11 像素
  • IE 11,边缘:13 像素
  • Safari:不适用(我认为这些应该在同一屏幕上进行比较)

现在,在讨论任何解决方案或技巧之前,让我们问:什么是正确的对齐方式?我们要达到什么目标?在某种程度上,这是一个品味问题,但基本上我可以想到以下“不错”的对齐方式:

文字和复选框位于同一基线上(我故意不在此处调整复选框大小):

在此处输入图片说明

或在小写字母方面具有相同的中间行:

在此处输入图片说明

或用大写字母表示相同的中间行(更容易看出不同字体大小的差异):

在此处输入图片说明

并且我们还必须确定复选框的大小是否应等于小写字母,大写字母或其他大小(更大,更小或介于小写和大写之间)的高度。

在此讨论中,如果复选框与文本位于同一基线上并且具有大写字母的大小(这是一个非常有争议的选择),那么我们将对齐方式称为“不错”。

在此处输入图片说明

现在,我们必须使用哪些工具:

  1. 调整复选框大小
  2. 通过伪距复选框识别Chromium并设置特定样式
  3. 调整复选框/标签垂直对齐

  1. 关于复选框大小调节:有widthheightsizezoomscale(有我错过了什么?)。zoom并且scale不允许设置绝对大小,因此它们可能仅有助于调整文本大小,而不能设置跨浏览器大小(除非我们可以编写特定于浏览器的规则)。size不适用于Chrome(它是否可以与旧版IE一起使用?无论如何,它并不是那么有趣)。widthheight可以在Chrome和其他浏览器中使用,因此我们可以设置一个通用大小,但是在Chrome中,它可以设置整个图片的大小,而不是复选框本身的大小。注意:它是最小值(宽度,高度),用于定义复选框的大小(如果宽度≠高度,则复选框正方形外部的区域将添加到“伪边距”中)。

    不幸的是,据我所知,对于任何宽度和高度,Chrome复选框中的伪边距均未设置为零。

  2. 恐怕这些天没有可靠的纯CSS方法

  3. 让我们考虑垂直对齐。vertical-align设置为middlebaseline由于Chrome的伪边距而不能给出一致的结果,对于所有浏览器来说,获得相同“坐标系”的唯一真实选择是对齐标签并输入到top

    比较垂直对齐:顶部和底部

    (在图片上:垂直对齐:顶部,底部和底部无框阴影)

那么我们从中得到什么结果呢?

input[type="checkbox"] {
    height: 0.95em;
    width: 0.95em;
}
label, input {
    vertical-align: top;
}
<label><input type="checkbox">label</label>

上面的代码段适用于Chrome(基于Chromium的浏览器),但是其他浏览器需要较小的复选框。似乎无法以Chromium复选框图像怪异的方式调整大小和垂直对齐方式。我的最终建议是:改用自定义复选框-这样可以避免感到沮丧:)


这个答案是如此深刻!
Marecky

10

现在所有现代浏览器都支持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>


这是完整的带前缀版本的演示:


10

我认为这是最简单的方法

input {
    position: relative;
    top: 1px;
}
<form>
    <div>
        <label><input type="checkbox" /> Label text</label>
    </div>
<form>


问题是:它是否在所有浏览器中都能正常工作?;-)
JonSnow 2015年

9

我不喜欢相对定位,因为它会使元素在其水平上高于其他所有元素(如果您具有复杂的布局,它可以放在某些东西之上)。

我发现,这vertical-align: sub使得复选框在Chrome,Firefox和Opera中的排列看起来足够好。由于我没有MacOS,并且IE10略有关闭,因此无法检查Safari,但我发现它对我来说已经足够了。

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


只要字体大小不太大,似乎就可以使用。
robsch

9

这对我来说很好:

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>


8
祝福您使用ems而不是pxs。
IDisposable

7

选择的具有400多个投票的答案在Chrome 28 OSX中对我不起作用,可能是因为它没有在OSX中进行测试,或者它在2008年回答该问题时都可以使用。

时代已经改变,新的CSS3解决方案现在是可行的。我的解决方案使用伪元素创建自定义复选框。因此,规定(利弊),如下所示:

  • 仅适用于现代浏览器(FF3.6 +,IE9 +,Chrome,Safari)
  • 依赖于自定义设计的复选框,该复选框将在每个浏览器/ OS中呈现完全相同的外观。在这里,我只是选择了一些简单的颜色,但是您总是可以添加线性渐变,这样可以使它看起来更棒。
  • 适应特定的字体/字体大小,如果更改了该大小,您只需更改复选框的位置和大小以使其垂直对齐即可。如果正确调整,最终结果在所有浏览器/操作系统中仍应接近完全相同。
  • 没有垂直对齐属性,没有浮点
  • 在我的示例中必须使用提供的标记,如果结构像问题一样,它将不起作用,但是,布局本质上看起来是相同的。如果要四处移动,还必须移动关联的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;
}
<form>
    <div class="checkbox">
        <input id="check_me" type=checkbox />
        <label for="check_me">Label for checkbox</label>
    </div>
</form>

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

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

希望有人觉得这有用!


6

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

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

4
正如我对以前的海报所说的那样:我不喜欢它,因为它需要不必要的标记。另外,我尝试了这种标记,但是很难防止标签包裹在输入下方(尽管标签/输入组各有一行)。
一支蜡笔

7
因此,您宁愿拥有不必要的CSS而不是“不必要的”标记(可能几乎每个人都使用过)?
罗伯特·巴特

10
包装架的问题。但是总的来说,是的,因为缓存了CSS,所以我宁愿使用多余的CSS而不是标记,但是对于每个新页面,可能都必须重新加载标记。
一支蜡笔

4
比较:1个额外CSS实例-vs-许多额外标记实例。
格雷格,

6

如果使用ASP.NET Web窗体,则无需担心DIV和其他元素或固定大小。我们可以<asp:CheckBoxList>通过float:left在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>

3

如果您使用的是Twitter Bootstrap,则可以在上使用checkbox该类<label>

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

3

将输入类型复选框包装在标签内,然后像这样浮动到左侧:

<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)的line-height相同。


3

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


真好!但是您应该考虑在此处复制HTML和CSS代码。不鼓励过于依赖外部链接的答案。该链接对于查看结果仍然很有价值,但是我认为在此处显示代码将帮助您获得更多投票。
Mariano Desanze 2014年

是的,它们不是(在FireFox和Chrome中,在Chrome中,复选框高于基线),我已经解释了原因
YakovL

为什么呢,您声称即使使用两个浏览器的屏幕截图也不支持该功能。您提出索赔时要提供证据证明,而不是其他人来证明它是您的工作。我确实做了比较,并会添加屏幕截图,但是注释不支持添加图片。您可以在我的答案中查看图片。但是,这可能与浏览器版本不同,因此提供带有包含浏览器版本的批注的屏幕截图会有所帮助。
YakovL

访问我在不同浏览器中链接到的页面。
弗拉基米尔·科纳

所以我做到了,是吗?:)您看不出区别吗?imagebin.ca/v/50stCZZGl7Ug imagebin.ca/v/50stNBiv29Ks虽然在FireFox他们完全对齐,在Chrome中的复选框是关于基线(顺便说一下,您可以使用通过@提到,如果你有兴趣在快速回复)
YakovL

3

input[type=checkbox]
{
    vertical-align: middle;
} 
<input id="testCheckbox" name="testCheckbox" type="checkbox">
<label for="testCheckbox">I should align</label>


2

我通常会保留一个未标记的复选框,然后使其“标签”成为一个单独的元素。这很痛苦,但是复选框和标签的显示方式之间存在很大的跨浏览器差异(如您所注意到的),这是我接近控制一切外观的唯一方法。

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

我真的希望有人对您的问题有更好的答案。


2

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>

上面的代码会将您的列表项放置在threecols中,只是更改宽度以适合您。


2

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

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

  1. 创建一个输入和一个标签。
  2. 将它们显示为块,因此您可以根据需要浮动它们。
  3. 将高度和线条高度设置为相同的值,以确保它们居中并垂直对齐。
  4. 对于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。

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


嗯,当标签以小写字母开头时,这看起来确实不错,但是如果以大写字母开头,那就更糟了。您可以在此处添加代码段吗?
YakovL

2

所以我知道这个问题已经被回答了很多次,但是我觉得我有一个比已经提供的解决方案更优雅的解决方案。不仅有1种优雅的解决方案,而且还有2种单独的解决方案让您喜欢。如此说来,您需要了解和看到的所有内容都包含在2个JS Fiddle的注释中。


解决方案#1依赖于给定浏览器的本机“复选框”,但要稍作改动...它包含在div中,该字段更容易定位跨浏览器,并带有溢出:隐藏以隐藏多余的1px拉伸复选框(所以您看不到FF的丑陋边框)

简单的HTML :(单击链接以查看带有注释的CSS,代码块是为了满足stackoverflow) http://jsfiddle.net/KQghJ/

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

解决方案2使用“ Checkbox Toggle Hack”来切换DIV的CSS状态(已在整个浏览器中正确定位),并为该复选框的未选中状态和已选中状态设置了简单的精灵。所有需要做的就是用所说的Checkbox Toggle Hack调整背景位置。我认为,这是更优雅的解决方案,因为您可以更好地控制复选框和收音机,并可以确保它们在浏览器中看起来一样。

简单的HTML :(单击链接以查看带有注释的CSS,代码块是为了满足StackOverflow) http://jsfiddle.net/Sx5M2/

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

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


1

是的,谢谢!这也一直让我发疯。

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

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可能解释了其中的一些差异,但这对我来说似乎很好。


1

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在IE6中使CSS工作。


1

vertical-align: subpokrishka所建议的那样简单地使用。

小提琴

HTML代码:

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

CSS代码:

.checkboxes input {
    vertical-align: sub;
}

1

简单的解决方案:

<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+中进行了测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.