¿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


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.


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.


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

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

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.


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.


¿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


¿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>).


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/


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.


¿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;
}


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



-9

Puedes hacerlo:

width: auto;
padding: 20px;

Este no es el mismo 100% de margen.
James
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.