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

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

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

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

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

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

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


当前回答

尝试此代码

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

其他回答

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

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

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

我认为这是最简单的方法

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

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

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