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

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

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

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

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

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

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


尝试垂直对齐:中间

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


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

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

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


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

我不是这个答案的海报,但在写这篇文章时,这是迄今为止在正面和负面投票中投票最多的答案(+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非常相似。根据您的文本大小,您无疑需要调整相对位置、宽度、高度等,以使内容看起来正确。

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


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


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

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

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

标签{线条高度:18px;}输入{宽度:13px;高度:18px;字体大小:12px;线条高度:12px;}<表单><div><label><input-type=“checkbox”/>标签文本</label></div></form>

希望这会有所帮助。


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

* {填充:0px;边距:0px;}#世界银行{宽度:15px;高度:15px;浮动:左侧;}#某人标签{浮动:左侧;左侧填充:3px;}<div><input id=“wb”type=“checkbox”/><label for=“wb”id=“somelabel”>Web浏览器</label></div>


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


这对我来说很好:

字段集{文本对齐:左侧;边框:无}字段集ol、字段集ul{填充:0;列表样式:无}字段集li{衬垫底部:1.5em;float:无;清除:左侧}标签{浮动:左侧;宽度:7em;右边距:1em}字段集复选框li{清晰:两者都有;衬垫:.75em}字段集复选框标签{边距:0 0 0 1em;宽度:20em}fieldset.checkboxes输入{浮动:左侧}<表单><fieldset class=“checkbox”><ul><li><input type=“checkbox”name=“happy”value=“yep”id=“happy“/><label for=“happy”>快乐</标签></li><li><input type=“checkbox”name=“饥饿”value=“yep”id=“饥饿”/>饿了吗</标签></li></ul></fieldset></form>


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

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

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,这可能会解释一些差异,但这似乎对我很有用。


根据One Crayon的解决方案,我有一些适合我的更简单的方法:

.font2{font-family:Arial;字体大小:32px}/*示例字体*/输入[type=复选框],输入[type=radio]{垂直对齐:中间;位置:相对;底部:1px;}输入[类型=无线电]{底部:2px;} <label><input-type=“checkbox”/>标签文本</label><p class=“font2”><label><input-type=“checkbox”/>标签文本</label></p>

在Safari(我相信它的基线)中,像素对像素的渲染是一样的,Firefox和IE7都很好。它还适用于各种大小的标签字体。现在,为了修复IE在选择和输入上的基线。。。


更新:(第三方编辑)

正确的底部位置取决于字体系列和字体大小!我发现使用底部:.08em;对于checkbox和radio元素是一个很好的通用值。我在Chrome/Firefox/IE11中使用Arial&Calibri字体在windows中使用几种小/中/大字体进行了测试。

.font2,.font2输入{font-family:Arial;字体大小:32px}/*示例字体*/输入[type=复选框],输入[type=radio]{垂直对齐:中间;位置:相对;底部:.08em;/*对于不同的字体,这是一个更好的值*/}<label><input-type=“checkbox”/>标签文本</label><p class=“font2”><label><input-type=“checkbox”/>标签文本</label></p>


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

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

确保的高度与(块级别)的线高度相同。


input {
    margin: 0;
}

真的很管用


一个看起来很好用的简单方法是使用垂直对齐调整复选框的垂直位置。它仍然会因浏览器而异,但解决方案并不复杂。

input {
    vertical-align: -2px;
}

参考


这不是解决问题的最佳方式

vertical-align: middle

将style=“position:relative;top:2px;”添加到输入框会将其向下移动2px。因此,根据您的字体大小,您可以移动它。


位置:相对;在IE中的z索引和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中工作。


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

无论如何,您应该将分组在一起的表单控件包装在它们自己的字段集中,在这里,它播放包装。设置输入/标签显示:块,输入浮动左,标签浮动右,设置宽度,控制左右边距的间距,相应地对齐标签文本。

so

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
}

对于跨浏览器/媒体解决方案,您可能需要同时设置边框、轮廓和线条高度。


如果您使用ASP.NET Web表单,则无需担心DIV和其他元素或固定大小。我们可以通过将float:left设置为CSS中的CheckBoxList输入类型来对齐<asp: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>

<表单><div><label style=“display:inline block”><input style=“vertical align:middle”type=“checkbox”/>标签文本</span></label></div></form>

如果使用标签标记,技巧是仅在表格单元格或内联块中使用垂直对齐。


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>

上面的代码将把你的列表项放在三列中,只需改变宽度即可。


我找到了一种在几乎所有浏览器中都能得到相同结果的方法。至少是最新的浏览器。它适用于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 */
}

如果您使用的是Twitter Bootstrap,您可以只使用<label>上的复选框类:

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

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

我的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的类似物):


也许有些人也犯了和我一样的错误?这是。。。我为输入框设置了一个宽度,因为它们大多是“文本”类型,但后来忘记了覆盖复选框的宽度,所以我的复选框试图占据大量多余的宽度,因此很难在旁边对齐标签。

.checkboxlabel {
    width: 100%;
    vertical-align: middle;
}
.checkbox {
    width: 20px !important;
}
<label for='acheckbox' class='checkboxlabel'>
    <input name="acheckbox" id='acheckbox' type="checkbox" class='checkbox'>Contact me</label>

早在IE6(使用类选择器)以及Firefox、Safari和Chrome的最新版本中,提供了可点击的标签和正确的对齐方式


为了与浏览器中的表单字段保持一致,我们使用:框大小调整:边框框

button, checkbox, input, radio, textarea, submit, reset, search, any-form-field {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}

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

希望有人觉得这很有用!


尝试此代码

input[type="checkbox"] {
    -moz-appearance: checkbox;
    -webkit-appearance: checkbox;
    margin-left:3px;
    border:0;
    vertical-align: middle;
    top: -1px;
    bottom: 1px;
    *overflow: hidden;
    box-sizing: border-box; /* 1 */
    *height: 13px; /* Removes excess padding in IE 7 */
    *width: 13px;
    background: #fff;
}

我认为这是最简单的方法

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


所以我知道这已经得到了很多次的回答,但我觉得我有一个比已经提供的解决方案更优雅的方法。不仅有一个优雅的解决方案,还有两个单独的解决方案来满足您的需求。话虽如此,你需要知道和看到的一切都包含在2 JS Fiddle的评论中。


解决方案#1依赖于给定浏览器的本机“复选框”,尽管有一点扭曲。。。它包含在一个div中,该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状态,该状态已在浏览器中正确定位,并使用一个简单的精灵设置复选框未选中和选中状态。所有需要的是用所述复选框切换哈克调整背景位置。在我看来,这是一个更优雅的解决方案,因为您可以更好地控制复选框和收音机,并可以确保它们在浏览器中看起来相同。

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

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

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


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


我不喜欢相对定位,因为它使元素呈现在其级别上的所有其他元素之上(如果您有复杂的布局,它可以在某些元素之上)。

我发现垂直对齐:sub使复选框在Chrome、Firefox和Opera中看起来足够对齐。由于我没有MacOS,IE10稍有问题,所以无法检查Safari,但我发现它对我来说已经足够好了。

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


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

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

今天在Chrome、Firefox、Opera、IE 7和8中进行了测试。示例:Fiddle


正如pokrishka已经建议的那样,简单地使用垂直对齐:sub。

不停摆弄

HTML代码:

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

CSS代码:

.checkboxes input {
    vertical-align: sub;
}

以下内容为浏览器(甚至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。

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


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

以下是完整的前缀版本演示:

标签{显示:-webkit框;显示:-webkit flex;显示:-ms flexbox;显示:柔性;-webkit框对齐:居中;-webkit对齐项目:中心;-ms flex align:中心;对齐项目:居中;}输入[类型=无线电],输入[类型=复选框]{-webkit box flex:0;-webkit flex:无;-ms flex:无;flex:无;右边距:10px;}/*仅演示(显示对齐)*/表单{最大宽度:200px}<表单><标签><input-type=“radio”checked>我是一个对齐的电台和标签</label><标签><input-type=“checkbox”已选中>我是一个对齐的复选框和标签</label></form>


输入[类型=复选框]{垂直对齐:中间;} <input id=“testCheckbox”name=“testCheckbox”type=“checkbox”><label for=“testCheckbox”>我应该对齐</label>


简单的解决方案:

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


我发现唯一能将它们对齐的方法是使用绝对位置作为输入。摆弄输入的顶部变量得到了我想要的结果。

div {
  clear:    both;
  float:    none;
  position: relative;
}

input {
  left:     5px;
  position: absolute;
  top:      3px;
}

label {
  display:     block;
  margin-left: 20px;
}

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

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


label {
    display: inline-block;
    padding-right: 10px;
}
input[type=checkbox] {
    position: relative;
    top: 2px;
}

最简单的解决方案是

输入{垂直对齐:文本顶部;}