Entrada CSS con ancho: 100% sale del límite de los padres

Resuelto peelz asked hace 11 años • 13 respuestas

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

peelz avatar Jun 04 '13 06:06 peelz
Aceptado

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.

Modelo de caja básica CSS

Puede cambiar la forma en que el modelo de caja trata el relleno y el ancho. Establezca la box-sizingpropiedad CSS en border-boxpara 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>
Expandir fragmento


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

showdev avatar Jun 03 '2013 23:06 showdev

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);
}
Al Zziwa avatar Apr 10 '2015 15:04 Al Zziwa

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%;
}
Deiu avatar Dec 08 '2015 20:12 Deiu

Intente cambiar el box-sizinga border-box. El paddingse está sumando a widthsus inputelementos.

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

Sourabh avatar Jun 04 '2013 00:06 Sourabh

intenta codificar esto

*, ::after, ::before {
  box-sizing: border-box;
}
Anecha Sun avatar May 09 '2021 09:05 Anecha Sun