CSS Input with width: 100% ไปนอกขอบเขตของผู้ปกครอง


172

ฉันกำลังพยายามสร้างฟอร์มการเข้าสู่ระบบที่ประกอบด้วยสองฟิลด์อินพุตด้วยการเติมส่วนแทรก ปัญหาเกิดขึ้นจากสิ่งที่ใส่เข้าไปเพิ่ม padding สิ่งที่สามารถทำได้เพื่อแก้ไขปัญหานี้?

ตัวอย่าง JSFiddle: http://jsfiddle.net/4x2KP/

NB: รหัสอาจจะไม่สะอาดที่สุด ตัวอย่างเช่นองค์ประกอบการขยายที่ห่อหุ้มอินพุตข้อความอาจไม่จำเป็นเลย

    #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

ใช้คำนิยาม CSS box-sizing:border-boxเพื่อป้องกันการขยายจากการกระทบต่อความกว้างหรือความสูงขององค์ประกอบ box-sizingดู

border-box : คุณสมบัติความกว้างและความสูงรวมถึงช่องว่างภายในและขอบ แต่ไม่ใช่ระยะขอบ ... โปรดทราบว่าช่องว่างภายในและขอบจะอยู่ภายในกล่อง

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

โปรดทราบความเข้ากันได้ของเบราว์เซอร์ของbox-sizing (IE8 +)
ในช่วงเวลาของการแก้ไขนี้ไม่จำเป็นต้องมีคำนำหน้า ดู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


2

การเติมเต็มจะถูกเพิ่มเข้าไปในความกว้างโดยรวม เนื่องจากคอนเทนเนอร์ของคุณมีความกว้างพิกเซลคุณจึงควรให้อินพุตที่มีความกว้างพิกเซลเช่นกัน แต่อย่าลืมลบการเว้นช่องว่างและเส้นขอบออกจากความกว้างที่คุณตั้งไว้เพื่อหลีกเลี่ยงปัญหาเดียวกัน


1

ฉันลองวิธีแก้ปัญหาเหล่านี้ แต่ไม่เคยได้ข้อสรุป ในที่สุดฉันใช้มาร์กอัปความหมายที่เหมาะสมกับ fieldset มันบันทึกโดยไม่ต้องเพิ่มการคำนวณความกว้างและขนาดกล่อง

นอกจากนี้ยังช่วยให้คุณสามารถตั้งค่าความกว้างของแบบฟอร์มตามที่คุณต้องการและอินพุตยังคงอยู่ในการขยายที่คุณต้องการสำหรับขอบของคุณ

ในตัวอย่างนี้ฉันได้วางขอบบนแบบฟอร์มและ fieldset และพื้นหลังทึบบนคำอธิบายแผนภูมิและ fieldset เพื่อให้คุณสามารถดูว่าพวกเขาทับซ้อนกันและนั่งกัน

<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คุณเพิ่ม 20px ถึงความกว้าง 100%


1
และฉันจะแก้ไขปัญหานี้ได้อย่างไร? ฉันพยายามหลายสิ่งหลายชั่วโมง: /
peelz

ลบความกว้าง 100% ไม่จำเป็นเนื่องจากอินพุตเป็นองค์ประกอบอินไลน์บล็อก
Andy G

0

คุณมีข้อผิดพลาดใน css ของคุณด้วยเครื่องหมายอัศเจรีย์ในบรรทัดนี้:

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

ลบเซมิโคลอนก่อนหน้า อย่างไรก็ตาม!! สำคัญควรใช้น้อยมากและสามารถหลีกเลี่ยงได้ส่วนใหญ่


อ่าขอบคุณฉันต้องพลาดมันบวกแท็ก!! สำคัญไม่จำเป็นต้องมีแม้แต่
peelz

-1

คุณต้องการให้ฟิลด์อินพุตอยู่กึ่งกลางหรือไม่ เคล็ดลับการจัดองค์ประกอบกลาง: ระบุความกว้างขององค์ประกอบและตั้งระยะขอบเป็นอัตโนมัติเช่น:

margin : 0px auto;
width:300px

ลิงค์ไปยังซอที่อัปเดตของคุณ:

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


ไม่จริงฉันพยายามทำให้พวกเขามีขนาดอัตโนมัติเป็นความกว้างของ ".loginForm" เช่นjsfiddle.net/4x2KP/7
peelz

คุณสามารถเปลี่ยนความกว้างของ. loggin แบบฟอร์มและอินพุตควรอยู่กึ่งกลาง
monika

ใช่มันใช้งานได้ แต่ฉันได้เพิ่มการเติม "ส่วนเสริม" ด้วยเหตุผล: ฉันไม่ต้องการให้ข้อความเริ่มต้น "ทันทีจากจุดเริ่มต้น" ดูรูปนี้: d.pr/i/xSH1 (เปรียบเทียบอินพุตอีเมลด้วยรหัสผ่านหนึ่งรายการ)
peelz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.