为什么<INPUT>比我说的要宽?

Ian*_*oyd 27 html css html-select html-input

给定a <select><input>元素,两者都指定为200px宽:

<!doctype html>
<body>
<select style="width: 200px"></select><br/>
<input  style="width: 200px" type="text">
</body>
<html>
Run Code Online (Sandbox Code Playgroud)

一个比另一个更宽1,2,3,4:

在此输入图像描述

这是什么原因

如果有人能说出理由,也许解决方案是显而易见的,而不是黑客和祈祷.

布局

应用的布局非常合理:

在此输入图像描述


更新1:当我写这个问题时,Chrome从1719更新了.

更新2:将填充<input>1更改为0:

<!doctype html>
<body>
<select style="width: 200px"></select><br/>
<input style="width: 200px; padding: 0" type="text">
</body>
<html>
Run Code Online (Sandbox Code Playgroud)

不会使<input> 200px宽(即不修复它).

更新3: 应用CSS重置:

<!doctype html>
<head>
<style type="text/css">
   * {
       padding: 0;
       margin: 0;
   }
</style>
<body>
<select style="width: 200px"></select><br/>
<input style="width: 200px; padding: 0" type="text">
</body>
<html>
Run Code Online (Sandbox Code Playgroud)

没有解决问题:

在此输入图像描述

另外,我对解决方案不太感兴趣而不是解释.

脚注

  • 1,2,3 Chrome 17 19,Firefox,Internet Explorer 9
  • 4在Windows 7 64位上

奖金阅读

jus*_*isb 27

你的<input>不是太宽; 你的<select>太窄了!

真正的问题是,<select>元素表现最喜欢的元素做.它使用了

box-sizing: border-box;
Run Code Online (Sandbox Code Playgroud)

填充和边框应用width元素的宽度在哪里; 表现得好像只有它处于"怪癖"模式.

这与所有其他标准模式html元素相反,后者使用:

box-sizing: content-box; 
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请将其更改<select>为使用与html其余部分相同的框模型:

select { box-sizing: content-box; }
Run Code Online (Sandbox Code Playgroud)

或者更改<input>以使用与选择相同的框模型:

input { box-sizing: border-box; }
Run Code Online (Sandbox Code Playgroud)

输入元素的行为与大多数元素一样,使用content-box模型,其中width是填充和边界应用之前元素的宽度.

您的浏览器设置了默认填充和边框,因此它比您想要的和/或预期的要大.我总是在样式表的顶部使用"CSS重置",如下所示:

* {
    padding: 0;
    margin: 0;
}
Run Code Online (Sandbox Code Playgroud)

这将确保任何元素都没有默认的填充或边距.

select元素是一个不同的情况,其中行为更像是一个已box-sizing: border-box启用的元素,其中它考虑了边框和填充到其width规范中.

如果添加box-sizing: border-boxinput元素中,它将完全按照您的预期/期望运行.

编辑:粗体化可能与您相关的部分.另一种解决方案是width将输入元素的指定值减少几个像素,以使其与选择框的宽度相匹配.

小提琴演示两种解决方案:http://jsfiddle.net/n4yT2/2/