CSS-вход с шириной: 100% выходит за пределы родительской привязки
Я пытаюсь создать форму входа, состоящую из двух полей ввода с заполнением вставки, но эти два поля всегда превышают его родительские границы; проблема связана с добавленным дополнением вставки. Что можно сделать, чтобы исправить эту проблему?
JSFiddle фрагмент: http://jsfiddle.net/4x2KP/
N.B.: Код может быть не самым чистым. Например, элемент span, который инкапсулирует текстовые входы, может вообще не понадобиться.
HTML:
<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>
CSS
#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);
}
.login-top {
height: 85px;
}
.login-bottom {
padding: 35px 15px 0 0;
}
Ответы
Ответ 1
Используйте определение CSS box-sizing:border-box
, чтобы предотвратить добавление от ширины или высоты элемента. См. Документацию для box-sizing
. Вы также можете проверить совместимость браузера box-sizing
(IE8 +).
border-box. Свойства ширины и высоты включают в себя прописку и границу, но не маржу... Обратите внимание, что заполнение и граница будут внутри поля.
input[type=text],
input[type=password] {
box-sizing : border-box;
}
EDIT: во время этого редактирования для box-sizing
не требуется никаких префиксов. См. shouldiprefix.com.
#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>
Ответ 2
Если все вышеперечисленное не выполнено, попробуйте установить следующие свойства для ввода, чтобы он занимал максимальное пространство, но не переполнял:
input {
min-width: 100%;
max-width: 100%;
}
Ответ 3
Добавляется добавка к общей ширине. Поскольку ваш контейнер имеет ширину пикселя, вам лучше давать входы ширину пикселя, но не забудьте удалить прокладку и границу с указанной вами ширины, чтобы избежать такой же проблемы.
Ответ 4
Попробуйте изменить box-sizing
на border-box
. padding
добавляет к width
вашим input
элементам.
Смотрите демонстрацию здесь
CSS
input[type=text],
input[type=password] {
width: 100%;
margin-top: 5px;
height: 25px;
...
}
input {
box-sizing: border-box;
}
+ box-sizing
Ответ 5
Другие ответы, похоже, говорят вам жестко закодировать ширину или использовать взломанный браузер. Я думаю, что есть более простой способ.
Вычисляя ширину и вычитая отступ (что вызывает перекрытие поля). 20px поставляется с 10px для левой прокладки и 10px для правильного заполнения.
input[type=text],
input[type=password] {
...
width: calc(100% - 20px);
}
Ответ 6
Заполнение по существу добавляется к ширине, поэтому, когда вы говорите width:100%
и padding: 5px 10px
, вы фактически добавляете 20 пикселей на 100% ширину.
Ответ 7
Вы хотите, чтобы поля ввода были центрированы?
Элемент "trick to center": укажите ширину элемента и установите маржу в auto, например:
margin : 0px auto;
width:300px
Ссылка на обновленную скрипту:
http://jsfiddle.net/4x2KP/5/
Ответ 8
У вас также есть ошибка в вашем css с восклицательным знаком в этой строке:
background:rgb(242, 242, 242);!important;
удалите перед ним двоеточие. Тем не менее, важно использовать редко и в значительной степени можно избежать.
Ответ 9
Я пробовал эти решения, но не получил окончательного результата. В конце я использовал правильную семантическую разметку с набором полей. Он сохранил необходимость добавления любых вычислений ширины и любого размера окна.
Он также позволяет вам установить ширину формы, как вам нужно, и входы останутся в пределах прокладки, необходимой для ваших ребер.
В этом примере я установил границу формы и набора полей и непрозрачный фон для легенды и набора полей, чтобы вы могли видеть, как они пересекаются и сидят друг с другом.
<html>
<head>
<style>
form {
width: 300px;
margin: 0 auto;
border: 1px solid;
}
fieldset {
border: 0;
margin: 0;
padding: 0 20px 10px;
border: 1px solid blue;
background: rgba(0,0,0,.2);
}
legend {
background: rgba(0,0,0,.2);
width: 100%;
margin: 0 -20px;
padding: 2px 20px;
color: $col1;
border: 0;
}
input[type="email"],
input[type="password"],
button {
width: 100%;
margin: 0 0 10px;
padding: 0 10px;
}
input[type="email"],
input[type="password"] {
line-height: 22px;
font-size: 16px;
}
button {
line-height: 26px;
font-size: 20px;
}
</style>
</head>
<body>
<form>
<fieldset>
<legend>Log in</legend>
<p>You may need some content here, a message?</p>
<input type="email" id="email" name="email" placeholder="Email" value=""/>
<input type="password" id="password" name="password" placeholder="password" value=""/>
<button type="submit">Login</button>
</fieldset>
</form>
</body>
</html>