在CSS中将文本和选择框对齐到相同的宽度?


81

好的,这似乎不可能正确。我有一个文本框和一个选择框。我希望它们的宽度完全相同,以便它们在左边距和右边距上对齐。

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

您会那样做,对吗?不。在Firefox中,选择框短6像素。查看截图。Firefox中的屏幕截图

好的,让我们编辑代码并制作两种样式。

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

好的,行得通!

在Firefox中修复

哦,等等,在Chrome中进行更好的测试...

chrome屏幕截图

FFFFFFFUUUUUUUUUUUU

有人可以告诉我如何在所有浏览器中排列它们吗?我为什么不能只做宽度:全部为200px,为什么所有浏览器都以不同的方式显示宽度?同样,当我们使用它时,为什么文本框和选择框的高度不同?我们如何使它们达到相同的高度?尝试过的高度和线高没有用。


解:

好的,我从下面的答案中获得了一些帮助,找到了解决方案。关键是使用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
如果必须具有这种精确度,那么作为Web设计师,您将不满意。
Scott Saunders 2012年

2
是的,CSS每天使我发疯@Scott。:)
zuallauz 2012年

2
请注意,LTE IE7不支持盒大小调整(大约3%的用户)。而且永远不要使用:not-占20%用户的IE8 IE 8不支持它:)
匿名

Box-size确实可以在IE8上使用!这些年来,我一直在为<select>样式添加特定的宽度...
GlennG 2013年

调整框大小确实有效
Pierre

Answers:


7

这是因为该<input type="text" />元素的默认样式与该<select>元素略有不同,例如,边框,填充和边距值可能不同。

您可以通过元素检查器(例如Firefox的Firebug或Chrome的内置样式检查器)观察这些默认样式。此外,这些默认样式表因浏览器而异。

您有两种选择:

  1. 明确设置两个元素的边框,填充和边距值相同
  2. 要在自己的CSS样式表之前包含的CSS重置样式表

我会选择选项1,因为选项2需要大量的工作,并且最终会产生大量不必要的CSS。但是某些Web开发人员更喜欢从头开始并拥有完全的控制权。


2
在这种情况下,重置CSS并不是一个坏主意。
雷米2012年

1
轻量级CSS重置确实存在,但是当然可能会有不希望的副作用。如果您开始使用CSS重置样式表进行设计,那么该选项将变得更具吸引力。
Thomas Upton

我尝试设置显式padding:0; margin:0; border:1px solid #000;,这使文本/选择框的宽度很好地对齐。但是,如果您查看两个框中的文本,您会注意到选择框中的文本会进一步填充。input { padding-left: 5px; }在第一个要修复的样式之后,几乎需要添加其他特定样式。有任何想法吗?在制作此基本测试代码之前,我已经在构建的站点中使用CSS重置,但是问题仍然存在。CSS重置显然不能解决此特定的文本/选择框宽度问题。
zuallauz 2012年

1
尝试input {text-indent: 5px;}PS,该<select>标签非常严格并且特定于操作系统,它会忽略很多CSS。
克里斯·坎农

是的,如果您添加其他样式,则文本缩进有效...但是仅适用于一种浏览器。然后在Chrome中缩进了不同的数量,因此又减少了2-3个像素!也许需要以某种方式重置选择和文本的缩进?
zuallauz 2012年

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>

3

默认情况下,不同的浏览器会应用不同的样式。我发现将margin和padding都重置为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 Reset)


2
在IE中,选择的长度仍然短了几个像素。因此,尽管没有完美的解决方案,但我们可以非常接近=)
saluce 2012年

1
嗯,IE。看起来好像很独特。我没有要测试的IE版本,但是即使在更高版本(例如9或10)中,它也有所不同吗?
Thomas Upton

1
我使用IE9进行了测试,但宽度仍然有2px的差异。
saluce 2012年

如果您查看两个框中的文本,您会注意到选择框中的文本被进一步填充。几乎需要添加一个特定的input { padding-left: 5px; }。这是正确的方法吗?在制作此基本测试代码之前,我已经在构建的站点中使用CSS重置,但是问题仍然存在。CSS重置无法解决此特定的文本/选择框宽度问题。
zuallauz 2012年

1
如果需要的话,在输入中使用左填充是我尝试将这两个元素中的文本对齐的方式。不要忘记,这些元素在不同的操作系统中看起来有所不同。考虑到所有事项,我不确定尝试将inputandselect元素的文本对齐是否值得做。从美学上讲,使这些元素的外边缘对齐看起来很好。
托马斯·厄普顿

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

认为这是支持浏览器的修复程序


0

如果您使用表4输入,则可以使用以下解决方案-也与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>

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

这样,选择将始终采用剩余宽度并与d输入完美对齐。


那是很多附加的HTML。这是CSS解决方案的CSS问题。
GlennG


0

是的,非常沮丧。但是,直到在我的HTML页面顶部放置一个“ <!DOCTYPE html>”标记之前,我从未遇到任何问题。我的网页在可以测试的所有平台上均正确呈现,直到将该标记放在文档顶部。

虽然这是“真正的规格”,但似乎是这些对齐问题的根源。FWIW,我使用的是HTML5元素,嵌入式CSS等,所有这些都没有该标签来指定HTML5。YMMV。

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.