¿Cómo hacer un ancho de elemento: 100% menos relleno?

397

Tengo una entrada html.

La entrada tiene padding: 5px 10px;Quiero que sea el 100% del ancho del div principal (que es fluido).

Sin embargo, el uso width: 100%;hace que la entrada sea 100% + 20px¿cómo puedo evitar esto?

Ejemplo

Granizo
fuente
1
Vea esta respuesta que publiqué no hace 15 minutos: stackoverflow.com/questions/5219030/… Esto debería funcionar perfectamente para usted, a menos que requiera que funcione en IE7.
thirtydot
Si utilizó mi método, vea la pequeña edición que acabo de hacer en mi respuesta. Asegura un "relleno uniforme" en algunos navegadores.
thirtydot
@Hailwood tengo una solución que mantiene el relleno inputy es compatible con IE7
Vladimir Starkov
Consulte también la respuesta a continuación utilizando la función calc
Daan

Respuestas:

486

box-sizing: border-box es una forma rápida y fácil de solucionarlo:

Esto funcionará en todos los navegadores modernos e IE8 +.

Aquí hay una demostración: http://jsfiddle.net/thirtydot/QkmSk/301/

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

Las versiones prefijadas del navegador ( -webkit-box-sizing, etc.) no son necesarias en los navegadores modernos.

Thirtydot
fuente
55
No creo que esta sea una mala solución. En general, envolver elementos en un div extra es una buena manera de rellenar elementos sin empujar el ancho total del elemento más allá de su contenedor principal.
Jake Wilson el
1
El relleno de un div de ajuste también produce resultados no idénticos a la adición de relleno directamente a la entrada.
Felix Fung
@thirtydot tengo algunas soluciones más flexibles y elegantes que mantienen el ancho de entrada
Vladimir Starkov
8
@thirtydot sí, solo déjalo roto para IE7 y deja que M $ arregle eso :)
Petr Peller
Esto también conserva las áreas de texto de cambio de tamaño automático para cualquiera de ustedes jQuery people vs.
Michael J. Calkins
276

Es por eso que tenemos box-sizingen CSS.

He editado su ejemplo, y ahora funciona en Safari, Chrome, Firefox y Opera. Compruébalo: http://jsfiddle.net/mathias/Bupr3/ Todo lo que agregué fue esto:

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

Lamentablemente, los navegadores antiguos como IE7 no son compatibles con esto. Si está buscando una solución que funcione en viejos IE, consulte las otras respuestas.

Mathias Bynens
fuente
3
+1, pero caniuse.com/#search=box-sizing IE 8? Además, github.com/Schepp/box-sizing-polyfill parece proporcionar una solución para IE 6-7.
Alix Axel
1
+1, esto es genial si no te importa IE (cuando usas PhoneGap, por ejemplo)
Luke B.
3
¿Qué tipo de magia es esta? +1 para la respuesta y +1 para el comentario sobre mí (eso es exactamente para lo que lo necesito).
Eduard Luca
20
Este debería ser el comportamiento predeterminado ... en lugar de +20 al ancho. A veces, CSS parece estar muy mal.
Soth
2
Para aclarar la compatibilidad del tamaño de cuadro en IE, la propiedad de tamaño de cuadro de IE depende del Modo de documento de IE, funciona en el "Modo de estándares IE8" y superior. Por lo tanto, funcionará en la versión del navegador IE8 también si el modo de documento es "Modo de estándares IE8". Espero que esto ayude.
Sanjeev
40

Utilice también el relleno en porcentajes y elimine del ancho:

acolchado: 5%;
ancho: 90%;
Alex
fuente
19
Fyi, esta solución solo es ideal para diseños no flexibles.
manguitos
+1, el problema con esto sería las fronteras, supongo. Normalmente, solo se ven "bien" con 1 a 3 píxeles como máximo. Los resultados son demasiado impredecibles considerando las inconsistencias del navegador con respecto al redondeo de subpíxeles.
Alix Axel
27

Puede hacerlo sin usar box-sizingy no soluciones claras como width~=99%.

Demo en jsFiddle :
ingrese la descripción de la imagen aquí

  • Mantener entradas paddingyborder
  • Agregar a la entrada negativa horizontal margin= border-width+horizontal padding
  • Agregar al contenedor horizontal de entrada paddingigual al margindel paso anterior

Marcado 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
fuente
44
Es un buen truco, usar el margen para la entrada y el relleno para el contenedor para compensar el relleno de entrada.
maulik13
De acuerdo totalmente !!! ¡He usado esta solución y funciona ampliamente sin trucos sucios! Esta tenía que ser la solución para todo tipo de respuestas ...
Andre Figueiredo
No entiendo qué papel tiene el margen negativo: todo lo que sé es que si el valor es incorrecto, entonces el cuadro termina a un lado, pero de alguna manera un margen simétrico corrige esto
Casebash
21

Use css calc ()

Súper simple e impresionante.

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

Como se ve aquí: ancho de división 100% menos cantidad fija de píxeles
Por webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
Fuente original: http://web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

Acabo de copiar esto aquí, porque casi lo perdí en el otro hilo.

Daan
fuente
Sin embargo, debe programarlo manualmente. Idealmente, se determinaría automáticamente.
JackHasaKeyboard
11

Suponiendo que estoy en un contenedor con relleno de 15px, esto es lo que siempre uso para la parte interna:

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

Eso estirará la parte interna a cualquier ancho que sea menor a 15px a cada lado.

Andologia
fuente
¿Podría publicar un ejemplo completo de width:autoaplicado a un inputcampo?
jakubiszon
eso es solo la mitad de una respuesta. La posición predeterminada de los elementos es estática, por lo que izquierda y derecha no harán exactamente nada aquí. y concesionarios anchura es también el valor inicial, por lo que .. todo esta respuesta se hace nada :)
honk31
5

Puedes probar algunos trucos de posicionamiento. Puede poner la entrada en un div con position: relativey una altura fija, luego en la entrada have position: absolute; left: 0; right: 0;y cualquier relleno que desee.

Ejemplo en vivo

Felix
fuente
¿En qué navegadores probaste esto? :(
thirtydot
Hmm, solo funciona en Chrome. Pero sé que también obtuve algo muy similar al trabajo en FF e IE.
Felix
Parece que no funciona con <input>elementos en Firefox (idk sobre IE). Sin <div>embargo, funciona con s. Y no, display: blocken el <input>tampoco funciona: - /
Felix
5

Aquí está la recomendación de codeontrack.com , que tiene buenos ejemplos de solución:

En lugar de establecer el ancho del div en 100%, configúrelo en automático y asegúrese de que <div>esté configurado para mostrar: bloque (predeterminado para <div>).

MI PC
fuente
3
No debe publicar el enlace directamente. Puede incluir la información de ese enlace. La razón es que puede ser mañana que el enlace no esté disponible y su respuesta ya no será válida ..
Amnesh Goel
4

Mueva el relleno del cuadro de entrada a un elemento contenedor.

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

Ver ejemplo aquí: http://jsfiddle.net/L7wYD/1/

Martin Jespersen
fuente
2

Solo entienda la diferencia entre ancho: auto; y ancho: 100%; Ancho: auto; calculará (AUTOMÁTICAMENTE) MATICALMENTE el ancho para ajustarse exactamente con el div de envoltura, incluido el relleno. Ancho 100% expande el ancho y agrega el relleno.

usuario3849374
fuente
¿Puedes incluir un ejemplo donde esto funciona con <input>? De lo contrario, solo está enviando personas a una persecución salvaje.
Sr. Lister el
0

¿Qué hay de envolverlo en un recipiente? El contenedor debe tener un estilo como:

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

Prueba esto:

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

Para mí, usando margin:15px;padding:10px 0 15px 23px;width:100%, el resultado fue este:

ingrese la descripción de la imagen aquí

La solución para mí fue usar en width:autolugar de width:100%. Mi nuevo código fue:

margin:15px;padding:10px 0 15px 23px;width:auto. Entonces el elemento se alineó correctamente:

ingrese la descripción de la imagen aquí

Jaime Montoya
fuente
-1

Tuve el mismo problema. Arreglarlo así:

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

Puedes hacerlo:

width: auto;
padding: 20px;
MissHD
fuente
Este no es el mismo 100% de margen.
James