【问题标题】:How to style CSS for input box's width as a percentage when it has border and padding?当输入框有边框和填充时,如何将 CSS 样式设置为百分比?
【发布时间】:2014-04-26 00:31:17
【问题描述】:

如果容器是 500px 宽,标签是 30% 宽,输入框是 70% 宽,那么应该一切都适合,但问题是输入框有一个 4px 左右的边框,并左右填充 2px,使其比原来宽 6px。

我们可以通过使宽度不是 70%,而是 68% 之类的来破解它,但这有点 hacky。有没有办法处理它? (我们不能做 CSS 重置,因为输入框通常需要一个边框,假设我们不使用不占用任何空间的轮廓来修改它。

CSS:

#my-container { width: 500px }
#first-name-label { display: inline-block; width: 30% }
#first-name { display: inline-block; width: 70% }

以下是一些例子:

  1. http://jsfiddle.net/hNaM7/12/outWidth: 356(用于输入框,如调试控制台所示)
  2. http://jsfiddle.net/hNaM7/13/outerWidth 351
  3. http://jsfiddle.net/hNaM7/14/outerWidth 349
  4. http://jsfiddle.net/hNaM7/15/outerWidth 349
  5. http://jsfiddle.net/hNaM7/20/ 不会换行,但是输入框会去 超出容器宽度

【问题讨论】:

标签: html css forms


【解决方案1】:

宽度不准确的原因是它们设置为box-sizing:content-box;,这是box-sizing 的默认设置。在 CSS 中计算 widthheight 时,borderpaddingwidthheight 的外部计算,即使设置为 width:100%; 也会增加额外的空间。为了抵消这种情况,您只需将带有边框的元素设置为box-sizing:border-box;。这会将边框和内边距都带入宽度和高度计算中。

试试这个:

#my-container { width: 500px; }
#first-name-label { display: inline-block; width: 30%; }
#first-name {
   display:inline-block;
   width: 70%;
   -webkit-box-sizing: border-box; /* Safari, other WebKit */
   -moz-box-sizing: border-box;    /* Firefox, other Gecko */
   box-sizing: border-box;         /* Opera/IE 8+ */
}

或者,如果您想更具体地输入文本,试试这个:

input[type=text] {
   -webkit-box-sizing: border-box; /* Safari, other WebKit */
   -moz-box-sizing: border-box;    /* Firefox, other Gecko */
   box-sizing: border-box;         /* Opera/IE 8+ */
}

CSS 语法:

box-sizing: content-box|border-box|initial|inherit;

浏览器支持:

Chrome (any): box-sizing
Opera 8.5+: box-sizing
Firefox (any): -moz-box-sizing
Safari 3: -webkit-box-sizing (unprefixed in 5.1+ versions)
IE8+: box-sizing

如果您想了解更多相关信息,可以在此处找到有关 box-sizing 的内容丰富的文章:

http://css-tricks.com/box-sizing/

http://css-tricks.com/almanac/properties/b/box-sizing/

【讨论】:

  • 你需要-webkit-box-sizing吗?哪个版本的 Chrome/Safari 需要它?
  • 我用浏览器支持信息更新了我的答案。 Chrome 在任何版本中都不需要前缀,它一直支持 box-sizing。对于低于 5.1 版本的任何内容,Safari 都需要前缀版本。
【解决方案2】:

这样的事情怎么样: http://jsfiddle.net/hNaM7/21/

#my-container { width: 500px }
#first-name-label { display: inline-block; width: 30% }
#first-name { display: inline-block; width: 70%; margin: 0 -3px;}

【讨论】:

  • 有趣的解决方案...虽然我通常尽量不使用负边距
【解决方案3】:

http://jsfiddle.net/fA75f/5/

http://www.paulirish.com/2012/box-sizing-border-box-ftw/

*,:before,:after {
  -moz-box-sizing:border-box;
  -webkit-box-sizing:border-box;
  box-sizing:border-box;
}

#my-container {
  width:500px;
}

#first-name-label {
  display:inline-block;
  width:30%;
}

#first-name {
  display:inline-block;
  width:70%;
}

【讨论】:

  • 我只将box-sizing:border-box 应用于输入框,它甚至在IE 8 上也能正常工作。参见jsfiddle.net/hNaM7/23fiddle.jshell.net/hNaM7/23/show 非常棒
  • 我注意到您将box-sizing:border-box; 应用到*,:before,:after --- 这可能太多了,因为它本质上将盒子模型更改为 IE 怪癖模式
【解决方案4】:

你试过了吗

border-style: hidden

?

它应该有助于缓解表格元素中的边界冲突,这与您遇到的问题相同。

【讨论】:

  • 但在最初的问题中,我确实想要输入框的边框(否则人们怎么知道它在那里,除非你添加背景?但设计团队可能不想要背景)
  • 所以改为边框父元素?
  • (1) 你试过了吗? (2)容器有边框,输入框没有边框是什么意思?
  • 我不会说它在实际代码表现方面有任何意义,我应该认为如果表单元素周围也没有边框和边距,你会看到没有区别,但只是在周围容器。这可能会阻止它看起来不稳定。这只是我的两分钱!
猜你喜欢
  • 2017-06-21
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多