Entrada CSS con ancho: 100% sale del límite de los padres
Estoy intentando crear un formulario de inicio de sesión con dos campos de entrada con un relleno insertado, pero terminan excediendo los límites de los padres. ¿Qué está causando esto?
Fragmento de JSFiddle: http://jsfiddle.net/4x2KP/
#mainContainer {
line-height: 20px;
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
background-color: rgba(0,50,94,0.2);
margin: 20px auto;
display: table;
-moz-border-radius: 15px;
border-style: solid;
border-color: rgb(40, 40, 40);
border-radius: 2px 5px 2px 5px / 5px 2px 5px 2px;
border-radius: 2px;
border-radius: 2px 5px / 5px;
box-shadow: 0 5px 10px 5px rgba(0,0,0,0.2);
}
.loginForm {
width: 320px;
height: 250px;
padding: 10px 15px 25px 15px;
overflow: hidden;
}
.login-fields > .login-bottom input#login-button_normal {
float: right;
padding: 2px 25px;
cursor: pointer;
margin-left: 10px;
}
.login-fields > .login-bottom input#login-remember {
float: left;
margin-right: 3px;
}
.spacer {
padding-bottom: 10px;
}
/* ELEMENT OF INTEREST HERE! */
input[type=text],
input[type=password] {
width: 100%;
height: 20px;
padding: 5px 10px;
background-color: rgb(215, 215, 215);
line-height: 20px;
font-size: 12px;
color: rgb(136, 136, 136);
border-radius: 2px 2px 2px 2px;
border: 1px solid rgb(114, 114, 114);
box-shadow: 0 1px 0 rgba(24, 24, 24,0.1);
}
input[type=text]:hover,
input[type=password]:hover,
label:hover ~ input[type=text],
label:hover ~ input[type=password] {
background:rgb(242, 242, 242) !important;
}
input[type=submit]:hover {
box-shadow:
inset 0 1px 0 rgba(255,255,255,0.3),
inset 0 -10px 10px rgba(255,255,255,0.1);
}
<div id="mainContainer">
<div id="login" class="loginForm">
<div class="login-top">
</div>
<form class="login-fields" onsubmit="alert('test'); return false;">
<div id="login-email" class="login-field">
<label for="email" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">E-mail address</label>
<span><input name="email" id="email" type="text"></input></span>
</div>
<div class="spacer"></div>
<div id="login-password" class="login-field">
<label for="password" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">Password</label>
<span><input name="password" id="password" type="password"></input></span>
</div>
<div class="login-bottom">
<input type="checkbox" name="remember" id="login-remember"></input>
<label for="login-remember" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">Remember my email</label>
<input type="submit" name="login-button" id="login-button_normal" style="cursor: pointer" value="Log in"></input>
</div>
</form>
</div>
</div>
Según el modelo de cuadro básico CSS , el ancho y el alto de un elemento se aplican a su cuadro de contenido. El relleno queda fuera de ese cuadro de contenido y aumenta el tamaño general del elemento.
Como resultado, si configura un elemento con relleno al 100% de ancho, su relleno lo hará más ancho que el 100% del elemento que lo contiene. En su contexto, las entradas se vuelven más amplias que sus padres.
Puede cambiar la forma en que el modelo de caja trata el relleno y el ancho. Establezca la box-sizing
propiedad CSS en border-box
para evitar que el relleno afecte el ancho o alto de un elemento:
border-box : Las propiedades de ancho y alto incluyen el relleno y el borde, pero no el margen... Tenga en cuenta que el relleno y el borde estarán dentro del cuadro.
Tenga en cuenta la compatibilidad del navegador debox-sizing
(IE8+).
En el momento de esta edición, no se necesitan prefijos .
Paul Irish y Chris Coyier recomiendan el uso "heredado" a continuación:
html {
box-sizing: border-box;
}
*, *:before, *:after {
box-sizing: inherit;
}
Como referencia, consulte:
* { Box-sizing: Border-box } FTW
Heredar el tamaño de la caja Probablemente sea un poco mejor Mejor práctica .
Aquí hay una demostración en su contexto específico:
#mainContainer {
line-height: 20px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
background-color: rgba(0, 50, 94, 0.2);
margin: 20px auto;
display: table;
-moz-border-radius: 15px;
border-style: solid;
border-color: rgb(40, 40, 40);
border-radius: 2px 5px 2px 5px / 5px 2px 5px 2px;
border-radius: 2px;
border-radius: 2px 5px / 5px;
box-shadow: 0 5px 10px 5px rgba(0, 0, 0, 0.2);
}
.loginForm {
width: 320px;
height: 250px;
padding: 10px 15px 25px 15px;
overflow: hidden;
}
.login-fields > .login-bottom input#login-button_normal {
float: right;
padding: 2px 25px;
cursor: pointer;
margin-left: 10px;
}
.login-fields > .login-bottom input#login-remember {
float: left;
margin-right: 3px;
}
.spacer {
padding-bottom: 10px;
}
input[type=text],
input[type=password] {
width: 100%;
height: 30px;
padding: 5px 10px;
background-color: rgb(215, 215, 215);
line-height: 20px;
font-size: 12px;
color: rgb(136, 136, 136);
border-radius: 2px 2px 2px 2px;
border: 1px solid rgb(114, 114, 114);
box-shadow: 0 1px 0 rgba(24, 24, 24, 0.1);
box-sizing: border-box;
}
input[type=text]:hover,
input[type=password]:hover,
label:hover ~ input[type=text],
label:hover ~ input[type=password] {
background: rgb(242, 242, 242);
!important;
}
input[type=submit]:hover {
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 -10px 10px rgba(255, 255, 255, 0.1);
}
.login-top {
height: auto;/*85px;*/
}
.login-bottom {
padding: 35px 15px 0 0;
}
<div id="mainContainer">
<div id="login" class="loginForm">
<div class="login-top">
</div>
<form class="login-fields" onsubmit="alert('test'); return false;">
<div id="login-email" class="login-field">
<label for="email" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">E-mail address</label>
<span><input name="email" id="email" type="text" /></span>
</div>
<div class="spacer"></div>
<div id="login-password" class="login-field">
<label for="password" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">Password</label>
<span><input name="password" id="password" type="password" /></span>
</div>
<div class="login-bottom">
<input type="checkbox" name="remember" id="login-remember" />
<label for="login-remember" style="-moz-user-select: none;-webkit-user-select: none;" onselectstart="return false;">Remember my email</label>
<input type="submit" name="login-button" id="login-button_normal" style="cursor: pointer" value="Log in" />
</div>
</form>
</div>
</div>
Alternativamente, en lugar de agregar relleno a los <input>
elementos mismos, aplique estilo a los <span>
elementos que envuelven las entradas. De esa manera, los <input>
elementos se pueden configurar width:100%
sin que se vean afectados por ningún relleno adicional. Ejemplo a continuación:
Mostrar fragmento de código
Las otras respuestas parecen indicarle que codifique el ancho o utilice un truco específico del navegador. Creo que hay una forma más sencilla.
Calculando el ancho y restando el relleno (lo que provoca la superposición del campo). Los 20px provienen de 10px para el relleno izquierdo y 10px para el relleno derecho.
input[type=text],
input[type=password] {
...
width: calc(100% - 20px);
}
Si todo lo anterior falla, intente configurar las siguientes propiedades para su entrada, para que ocupe el máximo espacio pero no se desborde:
input {
min-width: 100%;
max-width: 100%;
}
Intente cambiar el box-sizing
a border-box
. El padding
se está sumando a width
sus input
elementos.
Ver demostración aquí
CSS
input[type=text],
input[type=password] {
width: 100%;
margin-top: 5px;
height: 25px;
...
}
input {
box-sizing: border-box;
}
+box-sizing
intenta codificar esto
*, ::after, ::before {
box-sizing: border-box;
}