【问题标题】:Input size vs width输入大小与宽度
【发布时间】:2009-09-26 06:40:21
【问题描述】:
<input name="txtId" type="text" size="20" />

<input name="txtId" type="text" style="width: 150px;" />

哪一个是最佳的跨浏览器代码?

当然这取决于要求,但我很想知道人们是如何决定的以及基于什么决定。

【问题讨论】:

  • 在网络上使用“px”通常是个坏主意。您可以考虑使用相对单位(“em”、“%”等)。
  • @kangax 这只是一种意见;关于 px 的使用没有共识
  • @Kos 这是一种共识。不再(使用 IE 和其他旧浏览器)消失了。
  • @kangax 我从来没有收到那个备忘录...我一直使用 px 并且一直都有。

标签: html css


【解决方案1】:

你可以同时使用。 css 样式将覆盖支持 CSS 的浏览器中的 size 属性并使字段具有正确的宽度,对于不支持的浏览器,它将回退到指定的字符数。

编辑:我应该提到size 属性不是精确的大小调整方法:according to the HTML specification,它应该指的是字符数当前字体的输入将能够立即显示。

但是,除非指定的字体是固定宽度/等宽字体,否则保证指定数量的字符实际上是可见的;在大多数字体中,不同的字符会有不同的宽度。 This question 对此问题有一些很好的答案。

下面的 sn-p 演示了这两种方法。

@font-face {
    font-family: 'Diplomata';
    font-style: normal;
    font-weight: 400;
    src: local('Diplomata'), local('Diplomata-Regular'), url(https://fonts.gstatic.com/s/diplomata/v8/8UgOK_RUxkBbV-q561I6kFtXRa8TVwTICgirnJhmVJw.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
@font-face {
    font-family: 'Open Sans Condensed';
    font-style: normal;
    font-weight: 300;
    src: local('Open Sans Condensed Light'), local('OpenSansCondensed-Light'), url(https://fonts.gstatic.com/s/opensanscondensed/v11/gk5FxslNkTTHtojXrkp-xBEur64QvLD-0IbiAdTUNXE.woff2) format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
}
p {
  margin: 0 0 10px 0;
}
input {
  font-size: 20px;
}
.narrow-font {
  font-family: 'Open Sans Condensed', sans-serif;
}
.wide-font {
  font-family: 'Diplomata', cursive;
}
.set-width {
  width: 220px;
}
<p>
  <input type="text" size="10" class="narrow-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="narrow-font set-width" value="0123456789" />
</p>
<p>
  <input type="text" size="10" class="wide-font set-width" value="0123456789" />
</p>

【讨论】:

  • @Mark B. 感谢您的回答。我在这里使用内联样式提问。
  • 别担心 - 我以为你可能有,但我只是指出以防万一。
  • 大多数字体不是单宽的。关于“该字段一次可以显示的字符数”....您是指哪个字符?
  • @Pacerier 输入使用的任何字体的字符数:jsbin.com/zimako/1
  • @jbyrd 是的,确实如此——但根据 HTML 规范,答案是正确的。我现在已经编辑了答案以澄清一些事情。
【解决方案2】:

我建议,可能最好的方法是以 em 为单位设置样式的宽度 :) 所以对于 20 个字符的输入大小只需设置 style='width:20em' :)

【讨论】:

  • 有趣的一点,但是在我的测试中 width:20em 使得输入远大于 20 个字符。
  • "em" 是“M”字符高度的度量,这就是框变得太大的原因。
  • 在 CSS 中,em 与其直接或最近的父级的字体大小相关。举个例子:如果一个元素继承的 font-size 是 16px,而你将 font-size 设置为 2em,那么最终的尺寸将是 32px (16px*2em)。 “em”单位不是字符数量。更多:w3.org/TR/css3-values/#font-relative-lengthskyleschaeffer.com/development/css-font-size-em-vs-px-vs-pt-vsj.eremy.net/confused-about-rem-and-em
  • @Jess,好问题。在typography 中,'em' 曾经表示'M' 字符的宽度。很长一段时间,我相信同样的事情。然而,在 CSS 和数字排版中,“em”等于字体的高度(以磅为单位)。这是为了适应没有“M”字符的字符集,或者“M”不是字体的全高或全宽。
  • 其实我觉得ch这个单位最适合这个应用。
【解决方案3】:

size 在不同浏览器及其可能的字体设置中不一致。

在 px 中设置的 width 样式至少是一致的,以 box-sizing issues 为模。如果您想相对于字体调整样式,您可能还想在 'em' 中设置样式(但同样,除非您明确设置输入的 font 系列和大小,否则这将不一致),或者如果您使用 '%'正在制作一个液体布局形式。无论哪种方式,样式表都可能比内联 style 属性更可取。

您仍然需要 size&lt;select multiple&gt; 才能使高度与选项正确对齐。但我不会在&lt;input&gt; 上使用它。

【讨论】:

    【解决方案4】:

    我想说这违背了“传统智慧”,但我通常更喜欢使用大小。这样做的原因正是很多人说不要的原因:字段的宽度会因浏览器而异,具体取决于字体大小。具体来说,无论浏览器设置如何,它总是足够大以显示指定数量的字符。

    例如,如果我有一个日期字段,我通常希望该字段足够宽以显示 8 或 10 个字符(两位数的月份和日期以及两位或四位数的年份,带分隔符)。设置 size 属性基本上可以保证整个日期都是可见的,并且浪费的空间最少。对于大多数数字也是如此 - 我知道预期值的范围,因此我将 size 属性设置为适当的位数,如果适用,加上小数点。

    据我所知,没有 CSS 属性可以做到这一点。例如,以 em 为单位设置宽度是基于高度而不是宽度,因此如果要显示已知数量的字符,则不是很精确。

    当然,这种逻辑并不总是适用 - 例如,名称输入字段可以包含任意数量的字符。在这些情况下,我将回退到 CSS 宽度属性,通常以 px 为单位。但是,我会说我制作的大多数字段都有某种已知内容,并且通过指定 size 属性,我可以确保 most 的内容,在 most情况下,显示时不剪裁。

    【讨论】:

    • 您也可以为此使用ex 单位,尽管使用 size 仍然可以简化大多数情况,因为您的 css 中没有数十个 id/classes 作为宽度。
    • @Forty 实际上,你不能。 ex 是字符的高度(特别是“X”),而不是宽度 - 就像 em。由于字符的高度和宽度(x 或其他)之间没有固定的关系,因此没有理由相信使用字符的高度来设置字段的宽度会使字段具有适当的宽度以显示任何给定的字符数。它可能更宽或更窄,具体取决于字体。现在ch 单元看起来很有希望,但在 IE 小于 9 中不受支持,这在我写这篇文章时会是一个问题。
    • 是的,但是 x 的高度通常永远不会小于宽度,大多数情况下实际上会高一点或几乎相同,所以它非常接近。 ch 不幸的是,可能会更好,有些零很薄,它可能无法测量完整的字符空间......
    • @Forty True,从而强化了我原来的观点,即没有好的 CSS 属性可以将输入字段的宽度设置为特定数量的字符,而 size 属性力求做到完全正确那。 ex 是一个合理的选择可能是对的,但事实仍然是它是一个高度属性,而不是一个宽度属性。 size 是一个宽度属性,只是不是 css。
    • 足够接近可以使用,只是对于这种情况不实用:)
    【解决方案5】:

    HTML 中的size 属性和CSS 中的width 属性都将设置&lt;input&gt; 的宽度。如果您想将宽度设置为更接近每个字符的宽度,请使用 **ch** 单位,如下所示:

    input {
        width: 10ch;
    }
    

    【讨论】:

      【解决方案6】:

      我刚刚与一张桌子打架,无论我试图缩小哪个元素,桌子的宽度都保持不变。我使用 firebug 进行搜索,但找不到将宽度设置得如此之高的元素。

      最后我尝试更改输入文本元素的 size 属性 并修复它。出于某种原因,size 属性 覆盖了 css 宽度。我正在使用 jQuery 向表中动态添加行,正是这些行包含了输入。因此,也许在使用 appendTo() 函数动态添加输入时,最好将 size 属性 与宽度一起设置。

      【讨论】:

        【解决方案7】:

        如果你使用宽度(你的第二个例子),你会得到更多的一致性。

        【讨论】:

          【解决方案8】:

          您可以使用样式和宽度来调整文本框的大小。 这是它的代码。

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
          
          </head>
          <body>
          <div align="center">
          
              <form method="post">
                    <div class="w3-row w3-section">
                      <div class="w3-rest" align = "center">
                          <input name="lastName" type="text" id="myInput" style="width: 50%">
                      </div>
                  </div>
              </form>
          </div>
          </body>
          </html>

          使用 align 使文本框居中。

          【讨论】:

            【解决方案9】:

            HTML 控制元素的语义。 CSS 控制页面的布局/样式。在控制布局时使用 CSS。

            简而言之,永远不要使用 size=""

            【讨论】:

            • 大小可以是元素固有的含义;例如,中间名首字母只有一个字符。名字 OTOH 没有固有的大小限制 - 除非您的数据库中有一个。
            • @derobert:我可能弄错了,但通常你表示使用 maxlength-attribute 作为 input[type=text|password] 而不是 size-attribute。
            • @Horst:好吧,我会用两者来表示中间的首字母(因为这个限制对用户来说是有意义的),而数据库只用 maxlength 来限制一个。
            猜你喜欢
            • 2013-05-14
            • 2019-01-18
            • 2016-07-29
            • 1970-01-01
            • 1970-01-01
            • 2017-03-24
            • 1970-01-01
            • 2013-05-19
            • 1970-01-01
            相关资源
            最近更新 更多