너비가있는 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>

답변:


310

box-sizing:border-box패딩이 요소의 너비 나 높이에 영향을주지 않도록 CSS 정의 를 사용하십시오 . 참조하십시오 box-sizing.

border-box : width 및 height 속성에는 패딩 및 테두리가 포함되지만 여백은 포함되지 않습니다. 패딩 및 테두리는 상자 안에 있습니다.

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
이것은 일을하는 것처럼 보입니다. 고마워요. 시간을 많이 절약하셨습니다.
peelz

2
첫 번째 부분으로 확장하려면 :box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;
Bradmage

당신은 내 하루 친구를 만들 ... 작은 CSS지만 매우 중요합니다 :)
Gourav Makhija

18

위의 모든 사항이 실패하면 입력에 다음 속성을 설정하여 최대 공간을 사용하지만 오버플로하지 않도록하십시오.

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

1
이것은 매우 간단한 솔루션 덕분에 나를 위해 일한 것입니다
AlexGH

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 % 폭으로 20 픽셀 추가하고 있습니다.


1
이 문제를 어떻게 해결할 수 있습니까? 나는 몇 시간 동안 많은 것을 시도 해왔다 : /
peelz

입력이 인라인 블록 요소이므로 100 % 너비를 제거하지 않아도됩니다.
Andy G

0

이 줄에 느낌표가있는 CSS에 오류가 있습니다.

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

세미콜론을 제거하십시오. 그러나! important는 거의 사용하지 않아야하며 피할 수 있습니다.


고마워요, 필자가 놓쳤을 것입니다.! important 태그도 필요하지 않았습니다.
peelz

-1

입력 필드를 중앙에 배치 하시겠습니까? 요소를 중앙에 배치하는 요령 : 요소의 너비를 지정하고 여백을 자동으로 설정하십시오. 예 :

margin : 0px auto;
width:300px

업데이트 된 바이올린에 대한 링크 :

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


실제로는 ".loginForm"너비로 자동 크기 조정하려고합니다. 예 : jsfiddle.net/4x2KP/7
peelz

.loginForm의 너비를 변경할 수 있으며 입력은 중앙에 있어야합니다.
monika

예, 이것이 작동하지만, 이유 때문에 "삽입"패딩을 추가했습니다. 이 사진을 참조하십시오 d.pr/i/xSH1이 (암호 하나와 이메일 입력을 비교)
peelz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.