【问题标题】:Why do inputs and selects use different box models?为什么输入和选择使用不同的盒子模型?
【发布时间】:2011-03-16 12:56:48
【问题描述】:

似乎(至少在 IE 8 和 Firefox 3 中)对于 元素,宽度指的是内容,但对于

有什么关系?我会认为两者都是内联替换元素并且行为相同。这种行为是否符合 W3C 标准?它在所有主流浏览器中都这样工作吗?

【问题讨论】:

    标签: internet-explorer firefox w3c css


    【解决方案1】:

    选择尺寸与输入尺寸不同,因为盒子尺寸不同。 Input 将 box-sizing 设置为“content-box”,而 select 将 box-sizing 设置为“border-box”。在下面的示例中,输入将比选择更宽:

    <input type="text" name="a" value="a" style="width:100px; border:5px solid red; padding: 10px;" />
    <select name="b" style="width:100px; border:5px solid red; padding: 10px;" /><option value="b">b</option></select>
    

    这是因为输入的全宽将是 width+padding(left+right)+border(left+right) 而对于 select 全宽将只是宽度(但你知道的)。要使两个元素的行为方式相同,您必须更改 box-sizing 模型。在下面的示例中,输入和选择将具有完全相同的宽度*:

    <input type="text" name="a" value="a" style="width:100px; border:5px solid red; padding: 10px;" />
    <select name="b" style="box-sizing: content-box; width:100px; border:5px solid red; padding: 10px;" /><option value="b">b</option></select>
    

    *使用 -moz-box-sizing for firefox

    据我所知,这种行为在所有现代浏览器(包括 iE6)中都是一致的,但我不知道为什么它会以这种方式工作。不知道任何 W3 规范在哪里描述了这种特殊行为。有note suggesting default styling,但它只涵盖简单的属性——这就是为什么重置默认 css 如此受欢迎的原因。

    【讨论】:

      【解决方案2】:

      我在 CSS 上完美地使用了这个:

      input, select
      {
          -webkit-box-sizing: content-box;
          -moz-box-sizing: content-box;
          box-sizing: content-box;
      }
      

      这样,您可以强制输入的行为和选择相同。

      【讨论】:

        【解决方案3】:

        将所有控件和其他常见元素(如 html、body 等)的基本样式“重置”为共同的最低限度通常是一种最佳做法。虽然不能保证在所有浏览器中产生完美匹配的控件,但它让你更接近。有各种各样的预制重置 CSS,您可以简单地从互联网上使用。最常见的一种是 YUI 的重置 css:

        重置 CSS 后,若要解决宽度差异,您只需为输入控件设置标准默认边框和内边距,以正确适应您的网站样式。

        【讨论】:

        • 感谢您的回答,但我的问题不是关于默认样式,而是为什么我设置的样式会受到不同的对待。我的意思是,我知道我可以将宽度和边框设置为任何我想要的,比如width:150px; border-width:2px,但是为什么这会产生一个元素, 的内部宽度为 150px,
        • @Tim:我确实看到了问题(我想我之前误解了你问题的初衷)。至于“为什么”……我怀疑有人真的知道。我知道在 IE8 和 FF3 中,它们利用底层系统控件来呈现 inputselect。其他一些浏览器对此类控件进行完全自定义呈现。根据操作系统,完全有可能任何依赖于操作系统来呈现输入和选择控件的浏览器都会有不同的行为。这是一个令人讨厌的怪癖,在像素完美布局的现代时代真的不应该存在......但是......你能做什么?
        • 只需将值设置为您想要的值。在大多数情况下,无论如何你都会这样做。很多人都想在每一个问题上进行重置,这种重置并不经常需要,也几乎不是最佳实践。就像无处不在的 jQuery 解决了所有问题,无论多么小。
        【解决方案4】:

        浏览器出现在 W3C 之前,因此它们定义了自己的呈现规则。浏览器在表单控件样式方面永远不会保持一致(在不久的将来),因为默认浏览器样式不一致并且表单控件由不同的操作系统呈现。

        本站列出默认浏览器样式:http://www.iecss.com/(输入的样式不一致)

        【讨论】:

        • 感谢您的回答。但我并不是真正询问默认样式,而是询问为什么当我明确设置样式(例如width: 150px)时,
        • 该站点仅列出了 IE 的样式,并且对于页面末尾列出的所有其他站点来说已经过时了。如果想查看样式,可以随时使用内置的开发人员工具。
        猜你喜欢
        • 2018-02-05
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多