ChatGPT解决这个技术问题 Extra ChatGPT

How to make an element width: 100% minus padding?

I have an html input.

The input has padding: 5px 10px; I want it to be 100% of the parent div's width(which is fluid).

However using width: 100%; causes the input to be 100% + 20px how can I get around this?

Example

See this answer I posted not 15 minutes ago: stackoverflow.com/questions/5219030/… This should work perfectly for you, unless you require it to work in IE7.
If you used my method, see the slight edit I just made on my answer. It ensures "even padding" in some browsers.
@Hailwood i have solution which keeping padding for input and supporting IE7
Please also see the answer below using the calc function

t
thirtydot

box-sizing: border-box is a quick, easy way to fix it:

This will work in all modern browsers, and IE8+.

Here's a demo: http://jsfiddle.net/thirtydot/QkmSk/301/

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

The browser prefixed versions (-webkit-box-sizing, etc.) are not needed in modern browsers.


I don't think this is that bad of a solution. In general, wrapping elements in an extra div is a good way to pad elements without pushing the overall width of the element beyond it's parent container.
Padding a wrapping div also produces non-identical results to adding padding to the input directly.
@thirtydot i have some more flexible and elegant solutions which keeps input's width
@thirtydot yeah, just leave it broken for IE7 and let M$ fix that :)
If you need this to work in IE7, you can read an old revision of this answer. And I feel really bad for you.
j
johannchopin

This is why we have box-sizing in CSS.

I’ve edited your example, and now it works in Safari, Chrome, Firefox, and Opera. Check it out: http://jsfiddle.net/mathias/Bupr3/ All I added was this:

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

Unfortunately older browsers such as IE7 do not support this. If you’re looking for a solution that works in old IEs, check out the other answers.


+1, but caniuse.com/#search=box-sizing IE 8? Also, github.com/Schepp/box-sizing-polyfill seems to provide a solution for IE 6-7.
+1, this is great if you don't care about IE (when using PhoneGap for instance)
What kind of wizardry is this? +1 for the answer and +1 for the comment above me (that's exactly what I need it for).
This should be the default behavior.. instead of +20 to width. Sometimes CSS seems seriously messed up.
To clarify box-sizing support on IE, for IE box-sizing property depends on IE Document Mode, it works on "IE8 Standards mode" & higher. So it will work in IE8 browser version also if document mode is "IE8 Standards mode". Hope this helps.
A
Alex

Use padding in percentages too and remove from the width:

padding: 5%;
width: 90%;

Fyi, this solution is only ideal for non-flexible layouts.
+1, The problem with this would be the borders I guess. Normally, they only look "right" with 1 to 3 pixels max. The results are too unpredictable considering the the browser inconsistencies regarding sub-pixel rounding.
V
Vladimir Starkov

You can do it without using box-sizing and not clear solutions like width~=99%.

https://i.stack.imgur.com/Q2ydW.png

Keep input's padding and border

Add to input negative horizontal margin = border-width + horizontal padding

Add to input's wrapper horizontal padding equal to margin from previous step

HTML markup:

<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 */ 
}

That's a good trick, to use margin for input and padding for wrapper to compensate for the input padding.
Agree totally!!! I have used this solution and it works widely with no dirty tricks! This had to be the solution to every kind of these answers..
I don't quite understand what role the negative margin has - all I know is that if the value is wrong, then the box ends up to one side, but somehow a symmetric margin fixes this
Why not use box-sizing? it is there for the purpose.
@Ninthu, because box-sizing didnt work in all appropriate browsers back in '12
j
johannchopin

Use css calc()

Super simple and awesome.

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

As seen here: Div width 100% minus fixed amount of pixels
By webvitaly (https://stackoverflow.com/users/713523/webvitaly)
Original source: http://web-profile.com.ua/css/dev/css-width-100prc-minus-100px/

Just copied this over here, because I almost missed it in the other thread.


You need to manually program that in, though. Ideally it would be automatically determined.
T
TylerH

Assuming i'm in a container with 15px padding, this is what i always use for the inner part:

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

That will stretch the inner part to whatever width it should be less the 15px either side.


Could you post a complete example of width:auto applied to an input field?
thats only half an answer. default position of elements is static, so left & right will do exactly nothing here. and width auto is also the initial value, so.. all this answer does is nothing :)
S
Sumner Evans

Here is the recommendation from codeontrack.com, which has good solution examples:

Instead of setting the width of the div to 100%, set it to auto, and be sure, that the

is set to display: block (default for
).


You shouldn't post link directly. You can include the information from that link. Reason being is, may be tomorrow that link won't be available and your answer will then no longer valid..
F
Felix

You can try some positioning tricks. You can put the input in a div with position: relative and a fixed height, then on the input have position: absolute; left: 0; right: 0;, and any padding you like.

Live example


What browsers did you test this in? :(
Hmm, works only in Chrome. But I know I got something very similar to work in FF & IE as well.
Seems like it's not working with <input> elements in Firefox (idk about IE). It works with <div>s, though. And no, display: block on the <input> doesn't work either :-/
M
Martin Jespersen

Move the input box' padding to a wrapper element.

<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>

See example here: http://jsfiddle.net/L7wYD/1/


P
Peter Moore

Maybe browsers have changed since this question was last answered, but this is the only thing that has ever worked reliably for me to accomplish this:

    width: auto;
    left: 0;
    right: 0;

Then you can make the margins / padding anything you want and the element will not expand past its available width.

This is similar to @andology's answer from way back but if you make left/right both 0 then you can make margin and/or padding whatever you want. So this is always my default div.


u
user3849374

Just understand the difference between width:auto; and width:100%; Width:auto; will (AUTO)MATICALLY calculate the width in order to fit the exact given with of the wrapping div including the padding. Width 100% expands the width and adds the padding.


Can you include an example where this works with ? Otherwise you're just sending people on a wild goose chase.
D
Didier Aupest

What about wrapping it in a container. Container shoud have style like:

{
    width:100%;
    border: 10px solid transparent;
}

M
Manolo Ramos

Try this:

width: 100%;
box-sizing: border-box;

J
Jaime Montoya

For me, using margin:15px;padding:10px 0 15px 23px;width:100%, the result was this:

https://i.stack.imgur.com/7RVie.png

The solution for me was to use width:auto instead of width:100%. My new code was:

margin:15px;padding:10px 0 15px 23px;width:auto. Then the element aligned properly:

https://i.stack.imgur.com/9d6fW.png


k
karthikr

You can do this:

width: auto;
padding: 20px;

This is not the same 100% - margin.