Вход CSS с шириной: 100% выходит за пределы родительской границы
Я пытаюсь сделать форму входа, состоящую из двух полей ввода с вставкой заполнения, но эти два поля всегда в конечном итоге превышают границы своего родителя; проблема связана с добавленным вставка обивка. Что можно сделать чтобы исправить эту проблему?
фрагмент JSFiddle:http://jsfiddle.net/4x2KP/
N. B.: код может быть не самым чистым. Например, элемент span, который содержит текстовые материалы могут не быть нужна вообще.
#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> 9 ответов:
используйте определение CSS
box-sizing:border-boxдля предотвращения влияния заполнения на ширину или высоту элемента. См. документацию дляbox-sizing. Вы также можете проверить совместимость браузераbox-sizing(IE8+).border-box : свойства ширины и высоты включают отступ и границу, но не поля... Обратите внимание, что обивка и граница будут внутри коробки.
input[type=text], input[type=password] { box-sizing : border-box; }изменить: На момент этого редактирования никакие префиксы не нужны для
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>
В качестве альтернативы, вместо добавления дополнения к<input>сами элементы, стиль<span>элементы упаковки входов. Таким образом,<input>наборwidth:100%без влияния каких-либо дополнительных подкладок. Пример ниже:#login-form { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; background-color: rgba(0, 50, 94, 0.2); margin: 20px auto; padding: 10px 15px 25px 15px; border: 4px solid rgb(40, 40, 40); box-shadow: 0 5px 10px 5px rgba(0, 0, 0, 0.2); border-radius: 2px; width: 320px; } label span { display: block; padding: .3em 1em; background-color: rgb(215, 215, 215); border-radius: .25em; border: 1px solid rgb(114, 114, 114); box-shadow: 0 1px 0 rgba(24, 24, 24, 0.1); margin: 0 0 1em; } label span:hover { background: rgb(242, 242, 242); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), inset 0 -10px 10px rgba(255, 255, 255, 0.1); } input[type=text], input[type=password] { background: none; border: none; width: 100%; height: 2em; line-height: 2em; font-size: 12px; color: rgb(136, 136, 136); outline: none; } .login-bottom { margin: 2em 1em 0 0; } input#login-button { float: right; padding: 2px 25px; } input#login-remember { float: left; margin-right: 3px; }<form id="login-form"> <label>E-mail address <span><input name="email" type="text" /></span> </label> <label>Password <span><input name="password" type="password" /></span> </label> <div class="login-bottom"> <label> <input type="checkbox" name="remember" id="login-remember" />Remember my email </label> <input type="submit" name="login-button" id="login-button" value="Log in" /> </div> </form>
Если все вышеперечисленное не удается, попробуйте установить следующие свойства для вашего ввода, чтобы он занимал максимальное пространство, но не переполнялся:
input { min-width: 100%; max-width: 100%; }
другие ответы, похоже, говорят вам жестко закодировать ширину или использовать специфичный для браузера Хак. Я думаю, что есть более простой способ.
путем вычисления ширины и вычитания заполнения (что приводит к перекрытию поля). 20px приходит от 10px для левой прокладки и 10px для правой прокладки.
input[type=text], input[type=password] { ... width: calc(100% - 20px); }
добавляется к общей ширине. Поскольку ваш контейнер имеет ширину пикселя, вам лучше дать входам ширину пикселя тоже, но не забудьте удалить отступ и Границу от ширины, которую вы установили, чтобы избежать той же проблемы.
попробуйте изменить
box-sizingtoborder-box. Элементpaddingдобавляет кwidthвашегоinputэлементы.CSS
input[type=text], input[type=password] { width: 100%; margin-top: 5px; height: 25px; ... } input { box-sizing: border-box; }
заполнение по существу добавляется к ширине, поэтому, когда вы говорите
width:100%иpadding: 5px 10pxвы фактически добавляете 20px к ширине 100%.
вы хотите, чтобы поля ввода были центрированы? Трюк для центрирования элементов: укажите ширину элемента и установите для поля значение auto, например:
margin : 0px auto; width:300pxссылка на обновленную скрипку:
у вас также есть ошибка в css с восклицательным знаком в этой строке:
background:rgb(242, 242, 242);!important;удалить точку с запятой перед ним. Однако !важное следует использовать редко и в значительной степени можно избежать.
Я пробовал эти решения, но так и не получил окончательного результата. В конце концов я использовал правильную семантическую разметку с набором полей. Это избавило от необходимости добавлять любые вычисления ширины и любой размер коробки.
Он также позволяет вам установить ширину формы по мере необходимости, а входы остаются в пределах заполнения, необходимого для ваших краев.
в этом примере я поместил границу на форму и набор полей и непрозрачный фон на легенду и набор полей, чтобы вы могли видеть, как они перекрываются и сидеть друг с другом.
<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>
Comments