Đầu vào CSS có chiều rộng: 100% nằm ngoài giới hạn của cha mẹ


172

Tôi đang cố gắng tạo một biểu mẫu đăng nhập được cấu thành từ hai trường đầu vào với phần đệm trong, nhưng hai trường đó luôn kết thúc vượt quá ranh giới của cha mẹ; vấn đề bắt nguồn từ phần đệm thêm vào . Những gì có thể được thực hiện để khắc phục vấn đề này?

Đoạn mã JSFiddle: http://jsfiddle.net/4x2KP/

NB: Mã có thể không sạch nhất. Ví dụ, phần tử span đóng gói các đầu vào văn bản có thể không cần thiết chút nào.

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

Câu trả lời:


310

Sử dụng định nghĩa CSS box-sizing:border-boxđể ngăn việc đệm ảnh hưởng đến chiều rộng hoặc chiều cao của phần tử. Xem box-sizing.

hộp viền : Các thuộc tính chiều rộng và chiều cao bao gồm phần đệm và đường viền, nhưng không phải là lề ... Lưu ý rằng phần đệm và đường viền sẽ nằm bên trong hộp.

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

Xin lưu ý khả năng tương thích trình duyệt củabox-sizing (IE8 +).
Tại thời điểm chỉnh sửa này, không cần tiền tố; xem nênipipix.com .

Đây là một minh chứng:

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


Ngoài ra, thay vì thêm phần đệm vào chính các <input>phần tử, hãy tạo kiểu cho các <span>phần tử bao bọc các đầu vào. Bằng cách đó, các <input>yếu tố có thể được đặt thành width:100%mà không bị ảnh hưởng bởi bất kỳ phần đệm bổ sung nào. Ví dụ dưới đây:


1
Điều này dường như để làm công việc. Cảm ơn rất nhiều, bạn đã tiết kiệm cho tôi khá nhiều thời gian.
Peelz

2
Để mở rộng phần đầu tiên của bạn:box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;
Bradmage

bạn làm cho bạn thân của tôi ... css nhỏ nhưng rất quan trọng :)
Gourav Makhija

18

Nếu tất cả các cách trên đều thất bại, hãy thử đặt các thuộc tính sau cho đầu vào của bạn, để nó chiếm không gian tối đa nhưng không bị tràn:

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

1
Đây là những gì làm việc cho tôi giải pháp rất đơn giản cảm ơn
AlexGH

13

Các câu trả lời khác dường như cho bạn biết mã hóa độ rộng hoặc sử dụng hack dành riêng cho trình duyệt. Tôi nghĩ rằng có một cách đơn giản hơn.

Bằng cách tính chiều rộng và trừ phần đệm (điều này gây ra trường chồng lấp). 20px đến từ 10px cho phần đệm bên trái và 10px cho phần đệm bên phải.

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

3
Tôi không thể tin rằng tôi chưa bao giờ thấy điều đó trước đây. Hoàn thành trường hợp sử dụng của tôi một cách hoàn hảo trong khi các câu trả lời khác thì không. cảm ơn
cướp

Đã làm cho tôi. min/max-width: 100%;đã không, box-sizing: border-box;đã không. Tôi tưởng tượng việc đặt toàn bộ trang web của mình vào một thùng chứa và cho nó đệm sẽ hoạt động, nhưng tôi không muốn phải làm điều đó chỉ với cách khắc phục đơn giản này.
SUM1

4

Hãy thử thay đổi box-sizingthành border-box. Việc paddingthêm vào widthcác inputyếu tố của bạn .

Xem bản demo tại đây

CSS

input[type=text],
input[type=password] {
    width: 100%;
    margin-top: 5px;
    height: 25px;
    ...
}

input {
    box-sizing: border-box;
}

+box-sizing


2

Đệm được thêm vào chiều rộng tổng thể. Vì bộ chứa của bạn có chiều rộng pixel, tốt hơn hết bạn nên cung cấp cho đầu vào chiều rộng pixel, nhưng hãy nhớ xóa phần đệm và đường viền khỏi chiều rộng bạn đặt để tránh vấn đề tương tự.


1

Tôi đã thử các giải pháp này nhưng không bao giờ có kết quả cuối cùng. Cuối cùng, tôi đã sử dụng đánh dấu ngữ nghĩa thích hợp với một bộ trường. Nó đã lưu phải thêm bất kỳ tính toán chiều rộng và kích thước hộp nào.

Nó cũng cho phép bạn đặt chiều rộng của biểu mẫu khi bạn yêu cầu và các đầu vào vẫn nằm trong phần đệm bạn cần cho các cạnh của mình.

Trong ví dụ này, tôi đã đặt một đường viền trên biểu mẫu và fieldset và một nền mờ trên chú giải và fieldset để bạn có thể thấy chúng chồng lên nhau và ngồi với nhau như thế nào.

<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

Padding về cơ bản được thêm vào chiều rộng, do đó, khi bạn nói width:100%padding: 5px 10pxbạn thực sự thêm 20px vào chiều rộng 100%.


1
Và làm thế nào tôi có thể khắc phục vấn đề này? Tôi đã thử nhiều thứ trong nhiều giờ: /
Peelz

Xóa chiều rộng 100%, không cần thiết vì đầu vào là các thành phần khối nội tuyến.
Andy G

0

Bạn cũng có một lỗi trong css của bạn với dấu chấm than trong dòng này:

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

loại bỏ dấu chấm phẩy trước nó. Tuy nhiên, quan trọng nên được sử dụng hiếm khi và phần lớn có thể tránh được.


À cảm ơn, tôi đã bỏ lỡ nó, hơn nữa, thẻ quan trọng thậm chí không được yêu cầu.
Peelz

-1

Bạn có muốn các trường đầu vào được tập trung? Một mẹo để trung tâm các phần tử: chỉ định chiều rộng của phần tử và đặt lề thành tự động, ví dụ:

margin : 0px auto;
width:300px

Một liên kết đến fiddle cập nhật của bạn:

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


Không thực sự, tôi đang cố gắng để chúng có kích thước tự động đến chiều rộng của ".loginForm". Ví dụ: jsfiddle.net/4x2KP/7
Peelz

Bạn có thể thay đổi độ rộng của .loginForm và các đầu vào sẽ vẫn ở giữa
monika

Có, điều này hoạt động, nhưng tôi đã thêm phần đệm "inet" vì một lý do: Tôi không muốn văn bản bắt đầu "ngay từ đầu". Xem ảnh này: d.pr/i/xSH1 (So ​​sánh đầu vào email với mật khẩu một)
Peelz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.