วิธีสร้างความกว้างขององค์ประกอบ: 100% ลบด้วยการเติมเต็ม?


396

ฉันมีอินพุต html

อินพุตมีpadding: 5px 10px;ฉันต้องการให้เป็น 100% ของความกว้าง div ของผู้ปกครอง (ซึ่งเป็นของเหลว)

อย่างไรก็ตามการใช้width: 100%;ทำให้อินพุตเป็น100% + 20pxฉันจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร

ตัวอย่าง


1
ดูคำตอบนี้ฉันโพสต์เมื่อ 15 นาทีที่ผ่านมา: stackoverflow.com/questions/5219030/…สิ่งนี้ควรจะทำงานได้อย่างสมบูรณ์แบบสำหรับคุณยกเว้นว่าคุณต้องการให้ทำงานใน IE7
สามสิบ

หากคุณใช้วิธีการของฉันให้ดูการแก้ไขเล็กน้อยที่ฉันเพิ่งทำกับคำตอบของฉัน มันช่วยให้มั่นใจ "แม้การขยาย" ในบางเบราว์เซอร์
สามสิบ

@Hailwood i มีทางออกซึ่งการรักษาช่องว่างสำหรับการinputและสนับสนุน IE7
วลาดิเมีย Starkov

โปรดดูคำตอบด้านล่างโดยใช้ฟังก์ชั่นการคำนวณ
Daan

คำตอบ:


485

box-sizing: border-box เป็นวิธีที่รวดเร็วและง่ายต่อการแก้ไข:

สิ่งนี้จะใช้ได้กับเบราว์เซอร์รุ่นใหม่และ IE8 +

นี่คือตัวอย่าง: http://jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

เวอร์ชันที่นำหน้าเบราว์เซอร์ ( -webkit-box-sizingฯลฯ ) ไม่จำเป็นต้องใช้ในเบราว์เซอร์สมัยใหม่


5
ฉันไม่คิดว่านี่เป็นวิธีแก้ปัญหาที่ไม่ดี โดยทั่วไปองค์ประกอบการห่อใน div เสริมเป็นวิธีที่ดีในการวางองค์ประกอบโดยไม่ต้องกดความกว้างโดยรวมขององค์ประกอบนอกเหนือจากคอนเทนเนอร์หลัก
Jake Wilson

1
การแพ็ดดิ้งการตัดคำจะให้ผลลัพธ์ที่ไม่เหมือนกันในการเพิ่มการแพ็ดไปยังอินพุตโดยตรง
เฟลิกซ์ฟุง

@thirtydot ฉันมีโซลูชันที่ยืดหยุ่นและสวยงามมากขึ้นซึ่งทำให้ความกว้างของอินพุท
Vladimir Starkov

8
@thirtydot ใช่เพียงแค่ปล่อยให้มันเสียสำหรับ IE7 และให้ M $ แก้ไขที่ :)
Petr Peller

สิ่งนี้ยังช่วยรักษาขนาดการปรับขนาดข้อความอัตโนมัติสำหรับผู้ที่ jQuery คนใด ๆ กับสกรูขนาดกล่องขึ้นมาเว้นแต่คุณจะใช้สิ่งนั้นกับ div ที่ซ่อนอยู่
Michael J. Calkins

276

นี่คือเหตุผลที่เรามีbox-sizingใน CSS

ฉันได้แก้ไขตัวอย่างของคุณแล้วและตอนนี้ก็ใช้งานได้ใน Safari, Chrome, Firefox และ Opera ลองดูสิ: http://jsfiddle.net/mathias/Bupr3/ ทั้งหมดที่ฉันเพิ่มคือ:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

น่าเสียดายที่เบราว์เซอร์รุ่นเก่าเช่น IE7 ไม่รองรับสิ่งนี้ หากคุณกำลังมองหาโซลูชันที่ใช้งานได้กับ IEs รุ่นเก่าลองดูคำตอบอื่น ๆ


3
+1 แต่caniuse.com/#search=box-sizing IE 8 หรือไม่ นอกจากนี้github.com/Schepp/box-sizing-polyfill ก็ดูเหมือนจะเป็นทางออกสำหรับ IE 6-7
Alix Axel

1
+1 นี่เป็นสิ่งที่ดีถ้าคุณไม่สนใจ IE (เมื่อใช้ PhoneGap เป็นต้น)
ลุคบี

3
พ่อมดชนิดนี้คืออะไร? +1 สำหรับคำตอบและ +1 สำหรับความคิดเห็นด้านบน (นั่นคือสิ่งที่ฉันต้องการ)
Eduard Luca

20
นี่เป็นพฤติกรรมเริ่มต้น .. แทนที่จะเป็น +20 ถึงความกว้าง บางครั้ง CSS ดูเหมือนสับสนมาก
Soth

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

40

ใช้การขยายเป็นเปอร์เซ็นต์และลบออกจากความกว้าง:

การขยาย: 5%;
ความกว้าง: 90%;

19
Fyi โซลูชันนี้เหมาะสำหรับเค้าโครงที่ไม่มีความยืดหยุ่นเท่านั้น
muffs

+1, ปัญหาของเรื่องนี้น่าจะเป็นขอบเขตที่ฉันเดา ปกติแล้วพวกเขาจะดู "ถูกต้อง" โดยมีความยาวสูงสุด 1 ถึง 3 พิกเซล ผลลัพธ์ไม่สามารถคาดเดาได้มากเกินไปเมื่อพิจารณาถึงความไม่สอดคล้องกันของเบราว์เซอร์เกี่ยวกับการปัดเศษพิกเซลย่อย
Alix Axel

27

คุณสามารถทำมันได้โดยไม่ต้องใช้box-sizingและไม่ชัดเจนwidth~=99%แก้ปัญหาเช่น

สาธิตบน jsFiddle :
ป้อนคำอธิบายรูปภาพที่นี่

  • เก็บของpaddingและborder
  • เพิ่มในการป้อนข้อมูลเชิงลบแนวนอนmargin= border-width+horizontal padding
  • เพิ่มใน wrapper ของอินพุตตามแนวนอนpaddingเท่ากับmarginจากขั้นตอนก่อนหน้า

HTML มาร์กอัป:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}

4
นั่นเป็นเคล็ดลับที่ดีในการใช้มาร์จิ้นสำหรับอินพุทและแพ็ดดิ้งสำหรับห่อหุ้มเพื่อชดเชยการแพ็ดอินพุท
maulik13

เห็นด้วยทั้งหมด !!! ฉันใช้โซลูชันนี้และทำงานได้อย่างกว้างขวางโดยไม่มีลูกเล่นสกปรก! นี่จะต้องเป็นคำตอบสำหรับคำตอบเหล่านี้ทุกชนิด ..
อังเดรฟิเกนโดโด

ฉันไม่เข้าใจว่าบทบาทที่ติดลบนั้นมีเท่าไร - ทั้งหมดที่ฉันรู้คือถ้าค่าไม่ถูกต้องกล่องจะจบลงที่ด้านใดด้านหนึ่ง แต่อย่างใดขอบสมมาตรจะแก้ไขสิ่งนี้
Casebash

21

ใช้ css calc ()

ง่ายและสุดยอดมาก

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

เท่าที่เห็นที่นี่: ความกว้าง Div 100% ลบจำนวนพิกเซลคงที่
โดย webvitaly ( https://stackoverflow.com/users/713523/webvitaly )
แหล่งต้นฉบับ: http://web-profile.com.ua/css/dev/css กว้าง-100prc-ลบ 100px /

เพิ่งคัดลอกนี่ตรงนี้เพราะฉันเกือบจะพลาดในหัวข้ออื่น


คุณต้องตั้งโปรแกรมด้วยตนเองว่า เป็นการดีที่มันจะถูกกำหนดโดยอัตโนมัติ
JackHasaKeyboard

11

สมมติว่าฉันอยู่ในคอนเทนเนอร์ที่มีช่องว่างภายใน 15px นี่คือสิ่งที่ฉันมักจะใช้สำหรับส่วนด้านใน:

width:auto;
right:15px;
left:15px;

ที่จะยืดส่วนด้านในให้กว้างเท่าที่ควรจะน้อยกว่า 15px ทั้งสองข้าง


คุณช่วยโพสต์ตัวอย่างที่สมบูรณ์เกี่ยวwidth:autoกับinputฟิลด์ได้หรือไม่?
jakubiszon

นั่นเป็นเพียงครึ่งเดียวของคำตอบ ตำแหน่งเริ่มต้นขององค์ประกอบเป็นแบบคงที่ดังนั้นทางซ้ายและขวาจะไม่ทำอะไรที่นี่เลย และความกว้างอัตโนมัติยังเป็นค่าเริ่มต้นดังนั้น .. ทุกคำตอบนี้ไม่เป็นอะไร :)
honk31

5

คุณสามารถลองใช้เทคนิคการวางตำแหน่ง คุณสามารถใส่อินพุตใน div ด้วยposition: relativeและความสูงคงที่จากนั้นในอินพุตมีposition: absolute; left: 0; right: 0;และช่องว่างภายในที่คุณต้องการ

ตัวอย่างสด


เบราว์เซอร์ใดที่คุณทดสอบสิ่งนี้ :(
สามสิบ

อืมทำงานได้เฉพาะใน Chrome แต่ฉันรู้ว่าฉันมีบางสิ่งที่คล้ายกันมากกับการทำงานใน FF & IE เช่นกัน
เฟลิกซ์

ดูเหมือนว่ามันไม่ทำงานกับ<input>องค์ประกอบใน Firefox (idk เกี่ยวกับ IE) มันทำงานร่วมกับ<div>s แม้ว่า และไม่, display: blockในกรณีที่ใช้<input>ไม่ได้: - /
เฟลิกซ์

5

นี่คือคำแนะนำจากcodeontrack.comซึ่งมีตัวอย่างโซลูชันที่ดี:

แทนที่จะตั้งค่าความกว้างของ div เป็น 100% ให้ตั้งเป็น auto และตรวจสอบให้แน่ใจว่า<div>ตั้งค่าเป็น display: block (ค่าเริ่มต้นสำหรับ<div>)


3
คุณไม่ควรโพสต์ลิงค์โดยตรง คุณสามารถรวมข้อมูลจากลิงค์นั้น เหตุผลก็คืออาจจะไม่มีลิงค์ในวันพรุ่งนี้และคำตอบของคุณจะไม่สามารถใช้งานได้อีกต่อไป ..
Amnesh Goel

4

ย้ายช่องว่างภายใน 'ไปยังองค์ประกอบตัวหุ้ม

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

ดูตัวอย่างได้ที่นี่: http://jsfiddle.net/L7wYD/1/


2

เพียงแค่เข้าใจความแตกต่างระหว่างความกว้าง: อัตโนมัติ และความกว้าง: 100%; ความกว้าง: อัตโนมัติ; จะ (อัตโนมัติ) MATICALLY คำนวณความกว้างเพื่อให้พอดีกับที่ได้รับจากการห่อรวมถึงการแพ็ด ความกว้าง 100% ขยายความกว้างและเพิ่มการเสริมเต็ม


คุณสามารถใส่ตัวอย่างที่ใช้กับ <input> ได้ไหม มิฉะนั้นคุณจะส่งคนไปล่าห่านป่า
นาย Lister

0

สิ่งที่เกี่ยวกับการห่อไว้ในภาชนะ คอนเทนเนอร์ shoud มีสไตล์ที่ชอบ:

{
    width:100%;
    border: 10px solid transparent;
}


-1

สำหรับฉันใช้margin:15px;padding:10px 0 15px 23px;width:100%ผลลัพธ์คือนี่:

ป้อนคำอธิบายรูปภาพที่นี่

วิธีการแก้ปัญหาสำหรับฉันคือการใช้แทนwidth:auto width:100%รหัสใหม่ของฉันคือ:

margin:15px;padding:10px 0 15px 23px;width:auto. จากนั้นองค์ประกอบจัดตำแหน่งอย่างถูกต้อง:

ป้อนคำอธิบายรูปภาพที่นี่



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.