如何制作元素宽度:100%减去填充?


396

我有一个html输入。

输入有padding: 5px 10px;我希望它是父div宽度的100%(可变)。

但是,使用width: 100%;导致输入100% + 20px如何解决呢?


1
请参阅我不是在15分钟前发布的答案:stackoverflow.com/questions/5219030/…除非您要求它在IE7中运行,否则这对您应该是完美的。
2011年

如果您使用我的方法,请参阅我刚刚对答案进行的略微编辑。在某些浏览器中,它可以确保“均匀填充”。
2011年

@Hailwood我有保持对inputIE7的填充和支持的解决方案
Vladimir Starkov 2012年

请同时使用calc函数查看下面的答案
Daan 2014年

Answers:


485

box-sizing: border-box 是一种快速,轻松的解决方法:

将适用于所有现代浏览器和IE8 +。

这是一个演示:http : //jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

-webkit-box-sizing现代浏览器中不需要浏览器前缀版本(,等)。


5
我认为这不是解决问题的方法。通常,将元素包装成一个额外的div是填充元素的好方法,而不会将元素的整个宽度推到其父容器之外。
杰克·威尔逊

1
将包装div填充也将产生不同的结果,从而直接将填充添加到输入中。
菲利克斯·冯

@thirtydot我有一些更灵活,更优雅的解决方案,可以保持输入的宽度
Vladimir Starkov 2012年

8
@thirtydot是的,只要为IE7保留它,然后让M $修复即可:)
Petr Peller

除非您将其应用于隐藏的div,否则这还会为您的jQuery人员保留自动调整文本区域大小的功能,而不是框大小调整。
Michael J. Calkins

276

这就是为什么我们有box-sizingCSS。

我已经编辑了您的示例,现在它可以在Safari,Chrome,Firefox和Opera中运行。一探究竟: http //jsfiddle.net/mathias/Bupr3/ 我添加的全部是这样的:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

不幸的是,较旧的浏览器(例如IE7)不支持此功能。如果您正在寻找适用于旧IE的解决方案,请查看其他答案。


3
+1,但caniuse.com/#search=box-size IE 8?另外,github.com/Schepp/box-sizing-polyfill似乎为IE 6-7提供了解决方案。
Alix Axel 2012年

1
+1,这是伟大的,如果你不关心IE浏览器(使用的PhoneGap例如,当)
卢克B.

3
这是什么巫术?+1为答案,+ 1为我上方的评论(这正是我所需要的)。
爱德华·卢卡

20
这应该是默认行为。而不是宽度+20。有时CSS似乎一团糟。
索思

2
为了阐明对IE的框大小调整的支持,因为IE框大小调整属性取决于IE文档模式,因此它适用于“ IE8标准模式”及更高版本。因此,如果文档模式为“ IE8标准模式”,它也将在IE8浏览器版本中工作。希望这可以帮助。
桑耶夫2014年

40

也使用百分比填充,并从宽度中删除:

填充:5%;
宽度:90%;

19
仅供参考,此解决方案仅适用于非柔性布局。
muff

+1,这是我想是边界。正常情况下,它们看起来最多只有1到3个像素,是“正确的”。考虑到浏览器关于亚像素舍入的不一致,结果太不可预测了。
Alix Axel 2012年

27

你能做到不使用box-sizing不清晰的像的解决方案width~=99%

jsFiddle上的演示
在此处输入图片说明

  • 保持输入的paddingborder
  • 添加到输入负水平margin= border-width+horizontal padding
  • 添加到输入的包装器水平padding等于margin上一步

HTML标记:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}

4
这是一个很好的技巧,使用余量作为输入,并使用包装的填充来补偿输入的填充。
maulik13 2012年

完全同意!!!我已经使用了该解决方案,并且可以广泛使用而没有肮脏的花招!这不得不成为解决各种这些答案..
安德烈·菲格雷多

我不太了解负边距的作用-我所知道的是,如果值不正确,则盒子最终会向一侧倾斜,但是以某种方式,对称边距可以解决这一问题
Casebash

21

使用CSS calc()

超级简单又给力。

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

如此处所示:Div宽度100%减去固定像素
数(通过webvitaly)(https://stackoverflow.com/users/713523/webvitaly
原始来源:http : //web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

只是将其复制到了这里,因为我在另一个线程中几乎错过了它。


不过,您需要手动对其进行编程。理想情况下,它将自动确定。
JackHasaKeyboard

11

假设我在一个15px填充的容器中,这就是我一直在内部使用的内容:

width:auto;
right:15px;
left:15px;

这样会将内部部分拉伸到任何宽度,但应小于两侧的15px。


您可以发布一个width:auto应用于input字段的完整示例吗?
jakubiszon 2014年

那只是答案的一半。元素的默认位置是静态的,因此左右在这里完全不起作用。并且width auto也是初始值,所以..所有这些答案都没有了:)
honk31

5

您可以尝试一些定位技巧。您可以将输入放在具有position: relative和固定高度的div中,然后在输入上包含position: absolute; left: 0; right: 0;以及您喜欢的任何填充。

现场例子


您在哪些浏览器中对此进行了测试?:(
2011年

嗯,仅适用于Chrome。但是我知道我在FF和IE中也有非常相似的东西。
菲利克斯(Felix)

似乎无法<input>在Firefox中使用元素(有关IE的idk)。不过,它可以与<div>s 配合使用。不,display: block<input>也不起作用: - /
费利克斯

5

这是codeontrack.com的建议,其中包含良好的解决方案示例:

而不是将div的宽度设置为100%,而是将其设置为auto,并确保将<div>设置为display:block(默认为<div>)。


3
您不应该直接发布链接。您可以包括该链接中的信息。原因是是,明天可能该链接将无法使用,你的答案就不再有效..
Amnesh戈埃尔

4

将输入框的填充移动到包装器元素。

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

在此处查看示例:http : //jsfiddle.net/L7wYD/1/


2

只需了解width:auto;之间的区别即可;宽度:100%; 宽度:自动; 将(自动)自动计算宽度,以适合包含padding的包装div的确切宽度。宽度100%可扩展宽度并添加填充。


您能否提供一个与<input>一起使用的示例?否则,您只是在追赶人们。
李斯特先生,2018年



-1

对我来说,使用margin:15px;padding:10px 0 15px 23px;width:100%,结果是这样的:

在此处输入图片说明

我的解决方案是使用width:auto而不是width:100%。我的新代码是:

margin:15px;padding:10px 0 15px 23px;width:auto。然后元素正确对齐:

在此处输入图片说明



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.