CSS输入的宽度:100%超出了父级的界限


172

我试图制作一个由两个输入字段组成的登录表单,并带有插入填充,但是这两个字段总是最终超出其父级的边界。该问题源于添加的插图填充。为了解决此问题可以采取什么措施?

JSFiddle代码段:http//jsfiddle.net/4x2KP/

注意:该代码可能不是最干净的。例如,完全不需要封装文本输入的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>

Answers:


310

使用CSS定义box-sizing:border-box可以防止填充影响元素的宽度或高度。请参阅box-sizing

border-box:width和height属性包括padding和border,但不包括margin ...请注意,padding和border将在盒子内部。

input[type=text],
input[type=password] {
    box-sizing : border-box;
}

请注意(IE8 +)的浏览器兼容性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%,而不受任何其他填充的影响。下面的例子:


1
这似乎可以完成工作。非常感谢,您为我节省了很多时间。
2013年

2
要扩展您的第一部分:box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;
Bradmage 2014年

您使我成为了好朋友...小css但很重要:)
Gourav Makhija 2015年

18

如果以上所有方法均失败,请尝试为输入设置以下属性,以使其占用最大空间,但不会溢出:

input {
    min-width: 100%;
    max-width: 100%;
}

1
这就是为我工作的非常简单的解决方案,谢谢
AlexGH '17

13

其他答案似乎告诉您对宽度进行硬编码或使用特定于浏览器的技巧。我认为有一种更简单的方法。

通过计算宽度并减去填充(导致字段重叠)。20px来自10px(用于左填充)和10px(用于右填充)。

input[type=text],
input[type=password] {
    ...
    width: calc(100% - 20px);
}

3
我不能相信我以前从未见过。我的用例非常合适,而其他答案则不然。谢谢
rob

为我工作。min/max-width: 100%;没有,box-sizing: border-box;没有。我想将整个网站放入容器中并对其进行填充是可以的,但是我不想仅仅为了这个简单的修复而这样做。
SUM1

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


2

填充被添加到整个宽度。因为您的容器具有像素宽度,所以最好也为输入提供像素宽度,但是请记住从设置的宽度中删除填充和边框,以避免出现相同的问题。


1

我尝试了这些解决方案,但未获得最终结果。最后,我对字段集使用了适当的语义标记。它省去了添加任何宽度计算和任何框大小的麻烦。

它还允许您根据需要设置表单宽度,并且输入保持在所需的边距内。

在此示例中,我在表单和字段集上添加了边框,在图例和字段集上添加了不透明的背景,因此您可以看到它们如何重叠并彼此放置。

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

0

填充实际上是添加到宽度上的,因此当您说的时候width:100%padding: 5px 10px实际上是在100%宽度上添加了20px。


1
我该如何解决这个问题?我已经尝试了好几个小时了:/
–pez

删除100%的宽度,由于输入是行内块元素,因此没有必要。
Andy G

0

您的CSS也会出现错误,并在此行中带有感叹号:

background:rgb(242, 242, 242);!important;

在它前面删除分号。但是,!important应该很少使用并且可以避免。


谢谢,我一定错过了它,而且,甚至不需要!important标记。
peelz

-1

您是否希望输入字段居中?元素居中的技巧:指定元素的宽度并将边距设置为auto,例如:

margin : 0px auto;
width:300px

指向您更新的小提琴的链接:

http://jsfiddle.net/4x2KP/5/


并非如此,我试图让它们自动调整大小为“ .loginForm”的宽度。例如:jsfiddle.net/4x2KP/7
Peelz 2013年

可以更改.loginForm的宽度和输入数据必须保持居中
莫妮卡

是的,这是可行的,但是出于某种原因,我添加了“插入”填充:我不希望文本以“从头开始”开头。看到这样的画面:d.pr/i/xSH1(比较同一个密码的电子邮件输入)
peelz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.