Como criar uma largura de elemento: 100% menos preenchimento?

397

Eu tenho uma entrada html.

A entrada tem padding: 5px 10px;eu quero que seja 100% da largura da div pai (que é fluido).

No entanto, o uso width: 100%;faz com que a entrada seja 100% + 20pxcomo posso contornar isso?

Exemplo

Hailwood
fonte
11
Veja esta resposta que eu postei há 15 minutos: stackoverflow.com/questions/5219030/… Isso deve funcionar perfeitamente para você, a menos que você precise que ele funcione no IE7.
thirtydot
Se você usou meu método, veja a ligeira edição que acabei de fazer na minha resposta. Ele garante "preenchimento uniforme" em alguns navegadores.
thirtydot
@Hailwood eu tenho solução que manter preenchimento para inpute apoiar IE7
Vladimir Starkov
Por favor, veja também a resposta abaixo usando a função calc
Daan

Respostas:

486

box-sizing: border-box é uma maneira rápida e fácil de corrigi-lo:

Isso funcionará em todos os navegadores modernos e no IE8 +.

Aqui está uma demonstração: http://jsfiddle.net/thirtydot/QkmSk/301/

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

As versões com prefixo do navegador ( -webkit-box-sizing, etc.) não são necessárias nos navegadores modernos.

trinta dias
fonte
5
Não acho que isso seja uma solução tão ruim. Em geral, agrupar elementos em uma div extra é uma boa maneira de preencher elementos sem empurrar a largura geral do elemento além do contêiner pai.
23411 Jake Wilson
11
O preenchimento de uma div de empacotamento também produz resultados não idênticos ao adicionar preenchimento diretamente à entrada.
Felix Fung
@thirtydot eu tenho algumas soluções mais flexíveis e elegantes que mantém a largura da entrada
Vladimir Starkov
8
@thirtydot sim, apenas deixá-lo quebrado para IE7 e deixar M $ correção que :)
Petr Peller
Isso também preserva áreas de texto de redimensionamento automático para qualquer um de vocês, pessoas do jQuery, em comparação com o tamanho da caixa, a menos que você aplique isso na div oculta.
22813 Michael J. Calkins
276

É por isso que temos box-sizingem CSS.

Editei o seu exemplo e agora ele funciona no Safari, Chrome, Firefox e Opera. Confira: http://jsfiddle.net/mathias/Bupr3/ Tudo o que eu adicionei foi este:

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

Infelizmente, navegadores mais antigos como o IE7 não suportam isso. Se você está procurando uma solução que funcione em IEs antigos, confira as outras respostas.

Mathias Bynens
fonte
3
+1, mas caniuse.com/#search=box-sizing IE 8? Além disso, o github.com/Schepp/box-sizing-polyfill parece fornecer uma solução para o IE 6-7.
Alix Axel
11
+1, isso é ótimo se você não se preocupam com o IE (ao usar PhoneGap por exemplo)
Luke B.
3
Que tipo de magia é essa? +1 na resposta e +1 no comentário acima de mim (é exatamente para isso que eu preciso).
Eduard Luca
20
Esse deve ser o comportamento padrão. Em vez de +20 na largura. Às vezes, o CSS parece seriamente confuso.
Soth
2
Para esclarecer o suporte ao dimensionamento de caixas no IE, a propriedade de dimensionamento de caixas do IE depende do modo de documento do IE, funciona no "modo de padrões do IE8" e superior. Portanto, ele funcionará na versão do navegador IE8 também se o modo de documento for "modo IE8 Standards". Espero que isto ajude.
Sanjeev
40

Use o preenchimento também em porcentagens e remova da largura:

estofamento: 5%;
largura: 90%;
Alex
fonte
19
Fyi, esta solução é ideal apenas para layouts não flexíveis.
regalos
+1, o problema com isso seria as fronteiras, eu acho. Normalmente, eles só parecem "certos" com 1 a 3 pixels no máximo. Os resultados são imprevisíveis, considerando as inconsistências do navegador em relação ao arredondamento de sub-pixels.
Alix Axel
27

Você pode fazê-lo sem usar box-sizinge não soluções claras como width~=99%.

Demonstração em jsFiddle :
insira a descrição da imagem aqui

  • Mantenha as entradas paddingeborder
  • Adicionar à entrada horizontal negativo margin= border-width+horizontal padding
  • Adicione ao wrapper da entrada horizontal paddingigual a marginda etapa anterior

Marcação 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 */ 
}
Vladimir Starkov
fonte
4
Esse é um bom truque: usar margem para entrada e preenchimento para invólucro para compensar o preenchimento de entrada.
maulik13
Concordo totalmente !!! Eu usei essa solução e ela funciona amplamente sem truques sujos! Isto tinha de ser a solução para todos os tipos de estas respostas ..
Andre Figueiredo
Eu não entendo muito bem o papel que a margem negativa tem - Tudo que sei é que, se o valor está errado, então a caixa acaba para um lado, mas de alguma forma simétrica correções margem deste
Casebash
21

Use css calc ()

Super simples e incrível.

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

Como visto aqui: Largura da div 100% menos quantidade fixa de pixels
Por webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Fonte original: http://web-profile.com.ua/css/dev/css -width-100prc-menos-100px /

Apenas copiei isso aqui, porque eu quase perdi no outro segmento.

Daan
fonte
Você precisa programar isso manualmente, no entanto. Idealmente, seria determinado automaticamente.
JackHasaKeyboard
11

Supondo que eu esteja em um contêiner com preenchimento de 15px, é isso que eu sempre uso para a parte interna:

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

Isso esticará a parte interna para qualquer largura que seja menor que 15 px em ambos os lados.

Andologia
fonte
Você poderia postar um exemplo completo de width:autoaplicado a um inputcampo?
jakubiszon
isso é apenas meia resposta. a posição padrão dos elementos é estática; portanto, esquerda e direita não farão exatamente nada aqui. e auto largura é também o valor inicial, assim .. toda esta resposta não é nada :)
honk31
5

Você pode tentar alguns truques de posicionamento. Você pode colocar a entrada em uma div com position: relativeuma altura fixa e, em seguida, na entrada have position: absolute; left: 0; right: 0;e em qualquer preenchimento que desejar.

Exemplo ao vivo

Felix
fonte
Em quais navegadores você testou isso? :(
trintadot 7/03/2019
Hmm, funciona apenas no Chrome. Mas eu sei que tenho algo muito semelhante para trabalhar também no FF & IE.
Felix
Parece que não está funcionando com <input>elementos no Firefox (idk sobre o IE). Mas funciona com <div>s. E não, display: blockno <input>também não funciona: - /
Felix
5

Aqui está a recomendação do codeontrack.com , que tem bons exemplos de soluções:

Em vez de definir a largura da div como 100%, defina-a como automática e verifique se <div>está configurada para exibir: block (padrão para <div>).

MEU PC
fonte
3
Você não deve postar o link diretamente. Você pode incluir as informações desse link. O motivo é, pode ser amanhã essa ligação não estará disponível e sua resposta será então já não é válida ..
Amnesh Goel
4

Mova o preenchimento da caixa de entrada para um elemento de invólucro.

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

Veja o exemplo aqui: http://jsfiddle.net/L7wYD/1/

Martin Jespersen
fonte
2

Apenas entenda a diferença entre width: auto; e largura: 100%; Largura: auto; (AUTO) calculará MATICALMENTE a largura, a fim de ajustar exatamente o dado com a div de empacotamento, incluindo o preenchimento. Largura 100% expande a largura e adiciona o preenchimento.

user3849374
fonte
Você pode incluir um exemplo em que isso funcione com <input>? Caso contrário, você está apenas enviando pessoas em um ganso selvagem.
Lister
0

Que tal envolvê-lo em um recipiente. O shoud do contêiner tem estilo como:

{
    width:100%;
    border: 10px solid transparent;
}
Vitali Protosovitski
fonte
0

Tente o seguinte:

width: 100%;
box-sizing: border-box;
Manolo Ramos
fonte
-1

Para mim, usando margin:15px;padding:10px 0 15px 23px;width:100%, o resultado foi este:

insira a descrição da imagem aqui

A solução para mim foi usar em width:autovez de width:100%. Meu novo código era:

margin:15px;padding:10px 0 15px 23px;width:auto. Em seguida, o elemento alinhado corretamente:

insira a descrição da imagem aqui

Jaime Montoya
fonte
-1

Eu tive o mesmo problema. Corrija assim:

width: 100%;
box-sizing: border-box;
Manny Alvarado
fonte
-9

Você consegue fazer isso:

width: auto;
padding: 20px;
MissHD
fonte
Esta não é a mesma margem de 100%.
30912 James