如何在CSS中使文本和选择框宽度对齐?

80

看起来很难做到,我有一个文本框和一个下拉选择框。 我希望它们的宽度完全相同,使它们在左边缘和右边缘上对齐。

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
        </select>
    </body>
</html>

你认为这样就可以了,对吗?不行。在火狐浏览器中,选择框要比其他浏览器短6像素。请看截图。 火狐浏览器截图

那么让我们编辑代码并创建两个样式。

<style type="text/css">
    input {
        width: 200px;
    }
    select {
        width: 206px;
    }
</style>

好的,这方法可以用!

Firefox中已修复

哦,等等,在Chrome浏览器中测试一下……

chrome截图

FFFFFFFUUUUUUUUUUUU

有人能告诉我如何在所有浏览器中对齐它们吗?为什么我不能只在所有元素上设置width:200px,为什么所有浏览器都会显示不同?还有,在这个问题上,文本框和下拉框为什么高度不同?我们如何使它们达到相同的高度?我已经尝试了height和line-height但都无效。


解决方案:

好的,我已经在下面的答案的帮助下找到了解决方案。关键是使用box-sizing: border-box属性,因此当您指定包括边框和填充在内的宽度时。请参见这里的优秀解释。然后浏览器就不会搞砸它了。

下面是代码,还将框的高度设置为相同大小,并使框内文本缩进以便对齐。您还需要设置边框,因为Chrome有一个非常奇怪的边框样式用于下拉框,这会扰乱对齐。这适用于HTML5网站(例如支持IE9、Firefox、Chrome、Safari、Opera等)。

<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            input, select {
                width: 200px;
                border: 1px solid #000;
                padding: 0;
                margin: 0;
                height: 22px;
                -moz-box-sizing: border-box;
                -webkit-box-sizing: border-box;
                box-sizing: border-box;
            }
            input {
                text-indent: 4px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br>
        <select>
            <option>123</option>
            <option>123456789 123123123123</option>
            <option>123456789 123123123123 134213721381212</option>
        </select>
    </body>
</html>

最后提醒一句,你可能不希望包括输入按钮,复选框等在内,请使用 input:not([type='button']) 来排除某些类型,或者使用 input[type='text'],input[type='password'] 来指定你想要的应用类型。


3
如果你必须要达到这种精度水平,那作为一名网页设计师,你将不会感到满足。 - Scott Saunders
2
是的,CSS每天都让我发疯,@Scott。 :) - zuallauz
2
注意,box-sizing在IE7及以下版本中不被支持(约占用户数量的3%)。并且请勿使用:not——它在IE8及以下版本中不被支持,约占用户数量的20% :) - Anonymous
Box-sizing在IE8上确实有效!这些年来,我一直在为<select>样式添加特定的宽度... - GlennG
box-sizing确实起作用。 - Pierre
7个回答

7
这是因为 <input type="text" /> 元素与 <select> 元素的默认样式略有不同,例如边框、填充和外边距值可能不同。您可以通过像 Firefox 的 Firebug 或 Chrome 内置的元素检查器来观察这些默认样式。此外,这些默认样式表在不同的浏览器中也不同。
您有两种选择:
  1. 明确设置两个元素的边框、填充和外边距值相同
  2. 在您自己的 CSS 样式表之前包含一个 CSS 重置样式表
我会选择选项1,因为选项2需要大量的工作,并且最终会产生大量不必要的 CSS 代码。但有些 Web 开发人员喜欢从头开始,拥有完全的控制权。

2
在这种情况下,重置CSS并不是一个坏主意。 - Remy
1
确实存在轻量级的CSS重置,但是当然可能会有一些不希望出现的副作用。如果你开始使用CSS重置样式表进行设计,那么这个选项就变得更加吸引人了。 - Thomas Upton
我尝试了设置显式的 padding:0; margin:0; border:1px solid #000;,这样可以使文本/选择框的宽度对齐。但是,如果您查看两个框内部的文本,您会注意到选择框中的文本被进一步填充了。似乎需要在第一个样式后面添加另一个特定的 input { padding-left: 5px; } 样式来修复。有什么想法吗?在制作这个基本测试代码之前,我在网站中使用了CSS重置,但问题仍然存在。CSS重置显然无法解决这个特定的文本/选择框宽度问题。 - zuallauz
1
尝试使用 input {text-indent: 5px;}。顺便说一句,<select> 标签非常死板且与操作系统相关 - 它会忽略很多 CSS。 - Chris Cannon
是的,如果您添加了额外的样式,text-indent 就会起作用...但只适用于一个浏览器。然后在 Chrome 中缩进的量就不同了,多了 2-3 个像素!也许需要以某种方式重置选择和文本的缩进? - zuallauz

3
这会让你接近答案,但那种精度几乎是不可能的,建议更为实际一些。
<div style="width: 200px"><input type="text" style="width: 100%; margin: 0; padding: 0" /></div>
<div style="width: 200px">
    <select id="Select1" style="width: 100%; margin: 0; padding: 0">
        <option>1</option>
    </select>
</div>

2
在问题的选择和输入标签中都添加一个类,例如:
<input class='custom-input'/>
<select class='custom-input'></select>

然后修改以下CSS以适应您的设计:
.custom-input {
        width:140px;
        border:1px solid #ccc;
        margin:1px;
        padding:3px;
        box-sizing: border-box;
        -moz-box-sizing: border-box;
        -webkit-box-sizing: border-box;
        -ms-box-sizing:content-box;
        -moz-box-sizing:content-box;
        -webkit-box-sizing:content-box;
        box-sizing:content-box;
    }

显然这是为了支持浏览器而做的修复。


2
不同的浏览器默认应用不同的样式。我发现将边距和填充都重置为0可以使两个元素在Firefox和Chrome中宽度相等。
<html>
    <head>
        <title>Test</title>
        <style type="text/css">
            input, select {
                margin: 0;
                padding: 0;
                width: 200px;
            }
        </style>
    </head>
    <body>
        <input type="text" value="ABC"><br />
        <select>
            <option>123</option>
        </select>
    </body>
</html>

在尝试让设计在多个浏览器中表现出色之前,我个人喜欢使用最小化的CSS重置样式表,比如YUI CSS重置


2
在IE中,选择框的长度仍然短了几个像素。因此,虽然没有完美的解决方案,但我们可以接近完美 =) - saluce
1
啊,IE。它似乎很喜欢独树一帜。我没有任何IE版本进行测试,但是即使在后来的版本中,比如9或10,它是否也有所不同? - Thomas Upton
1
我测试了IE9,它的宽度仍然有2像素的差异。 - saluce
如果您查看两个框中的文本,您会注意到选择框中的文本被进一步填充了。几乎需要添加一个特定的 input { padding-left: 5px; }。这是正确的方法吗?在编写此基本测试代码之前,我在正在构建的网站中使用了CSS重置,但问题仍然存在。CSS重置无法解决此特定的文本/选择框宽度问题。 - zuallauz
1
如果需要对齐这两个元素中的文本,我会给输入框添加左填充。但是请注意,这些元素在不同的操作系统中看起来可能不同。考虑到所有因素,我不确定尝试对齐“input”和“select”元素的文本是否值得。从美学角度来看,让这些元素的外边缘对齐看起来非常好。 - Thomas Upton

0

是的,非常令人沮丧。然而,在我的HTML页面顶部放置一个“”标签之前,我从未遇到过这样的问题。在我将该标签放在文档顶部之后,我的网页在我能测试的所有平台上都能正确渲染。

虽然这是“真正的规范”,但它似乎是这些对齐问题的根源。 顺便说一下,我正在使用HTML5元素、内联CSS等,所有这些都没有使用那个标签来指定HTML5。可能会有不同情况。


0

尝试从两个元素中删除默认边框:

select, input {
 border:0;
}

0
如果您使用表格作为输入,您可以使用以下解决方案 - 也兼容ie7:
<tr style="width:1px;"><td style="width:inherit;position:relative;">
    <select style="width:100%;"> 
    </select> 
</td></tr>
<tr><td>
    <input type="text" style="width:150px;"/>
</td></tr>

这样,表格单元格的宽度将被固定为输入框的宽度,

这样,选择框就会始终占据剩余的宽度,并与输入框完美对齐。


这是大量额外的HTML。这是一个具有CSS解决方案的CSS问题。 - GlennG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接