ฉันจะป้องกันคุณสมบัติการขยายจากการเปลี่ยนความกว้างหรือความสูงใน CSS ได้อย่างไร


227

ฉันกำลังสร้างเว็บไซต์ด้วยDIVs ทุกอย่างทำงานได้ยกเว้นเมื่อฉันสร้าง DIV ฉันสร้างพวกเขาเช่นนี้ (ตัวอย่าง):

newdiv {
    width: 200px;
    height: 60px;
    padding-left: 20px;
    text-align: left;
}

เมื่อฉันเพิ่มpadding-leftคุณสมบัติความกว้างของการDIVเปลี่ยนแปลงเป็น 220px และฉันต้องการให้อยู่ที่ 200px

สมมติว่าฉันจะสร้างอีกDIVชื่อanotherdivเหมือนกับnewdivและวางไว้ภายในnewdivแต่newdivไม่มีช่องว่างและมีanotherdiv padding-left: 20pxฉันได้สิ่งเดียวกันnewdivความกว้างของมันจะเท่ากับ 220px

ฉันจะแก้ไขปัญหานี้ได้อย่างไร


3
ฉันเสียใจที่จะพูด แต่ฉันชอบวิธีที่ IE จัดการกับสิ่งนี้ ... ทำให้ฉันมีเหตุผลมากกว่านี้ ...
Nicu Surdu

คำตอบ:


390

เพิ่มคุณสมบัติ:

-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box;    /* Firefox, other Gecko */
box-sizing: border-box;         /* Opera/IE 8+ */

หมายเหตุ:สิ่งนี้จะไม่ทำงานใน Internet Explorer ด้านล่างเวอร์ชั่น 8


14
นี่เป็นทางออกที่ยอดเยี่ยมสำหรับชายแดน แต่วิธีนี้ช่วยในการขยายได้อย่างไร
Kato

6
นี่คือเวทมนตร์บริสุทธิ์! - แก้ไขรูปแบบกล่องที่เราทุกคนรู้และเกลียด! เช่นทำให้มันทำงานตามสัญชาตญาณแนะนำว่าควร - มากกว่ารายละเอียด - แต่เท่าที่ฉันรู้ไม่ทำลายรายละเอียดใด ๆ เช่น: D บทความนี้ชี้แจงได้ดี ... stackoverflow.com/questions/779434/
technicalbloke

2
@technicalbloke ลิงก์ของคุณเพิ่งกลับไปที่คำถามนี้
mhenry1384

11
อ๊ะอ่ะคัดลอกและแปะไก่ นี่คือลิงค์ที่ฉันต้องการแชร์ ... paulirish.com/2012/box-sizing-border-box-ftw
technicalbloke

1
พวกคุณหลายคนควรพิจารณาความกว้าง: เคล็ดลับอัตโนมัติด้านล่าง ใช้งานได้กับเบราว์เซอร์, รหัสน้อยลง, ฯลฯ
Ryan Shillington



11

หากคุณต้องการที่จะเยื้องข้อความภายใน div โดยไม่ต้องเปลี่ยนขนาดของ div ที่ใช้ใน CSS แทนtext-indentpadding-left

.indent {
  text-indent: 1em;
}
.border {
  border-style: solid;
}
<div class="border">
  Non indented
</div>

<br>

<div class="border indent">
  Indented
</div>


1
นี่เป็นทางออกเดียวที่ฉันพบว่าทำงานได้กับ div ความกว้างคงที่ของฉัน การปรับขนาดกล่องไม่ได้หยุดการขยายจากการกระทบความกว้างอย่างน่าเสียดายดังนั้นขอบคุณตันที่ชี้ให้เห็นคุณสมบัติเล็ก ๆ น้อย ๆ ที่น่าประทับใจนี้
Stevo


1

เมื่อฉันเพิ่มคุณสมบัติ padding-left ความกว้างของ DIV จะเปลี่ยนเป็น 220px

ใช่ว่าเป็นไปตามมาตรฐาน นั่นเป็นวิธีที่มันควรจะทำงาน

สมมติว่าฉันสร้างอีก DIV ชื่อ Anotherdiv เหมือนกับ newdiv และวางไว้ข้างใน newdiv แต่ newdiv ไม่มีช่องว่างภายในและ Anotherdiv มีช่องว่างด้านซ้าย: 20px ฉันได้สิ่งเดียวกันความกว้างของ newdiv จะเท่ากับ 220px;

ไม่ newdiv จะยังคงกว้าง 200px


2
Guffa นั้นไม่ได้เป็นมาตรฐานที่ควรจะทำงานเลย การเสริมเต็มไม่ควรส่งผลกระทบต่อขนาดขององค์ประกอบที่นำไปใช้ ด้วยความเคารพอย่างสูงสุดเป็นไปได้ไหมที่คุณทำให้ 'ช่องว่างภายใน' กับ 'ระยะขอบ' สับสน?
da5id

1
ใช่ช่องว่างภายในควรจะมีผลกับขนาดขององค์ประกอบอย่างแน่นอน ฉันคิดว่ามันเป็นคุณที่สับสน ... คุณจะเสนอว่าระยะขอบจะมีผลต่อขนาดขององค์ประกอบได้อย่างไร
Guffa

ที่จริงแล้วคุณรู้ไหมว่าฉันคิดว่าเราทั้งคู่กำลังถูกทางอยู่ ฉันคุ้นเคยกับการรับมือกับเอฟเฟกต์ที่ฉันลืมไปแล้วอย่างสิ้นเชิง ฉันพบคำอธิบายที่ดีที่นี่quirksmode.org/css/box.html
da5id

ดังนั้นขอโทษนาย Guffa แต่สำหรับวัตถุประสงค์ในทางปฏิบัติ (ซึ่งเป็นสิ่งที่เรากำลังพูดถึง) คำแนะนำของฉันก็ยังไม่ดี?
da5id

ดีที่คุณมีสิทธิเท่าที่ว่ามีข้อผิดพลาดกล่องรุ่น แต่ก็ไม่ได้นำไปใช้กับคำถามนี้ ... :)
Guffa

-1

เพียงแค่เปลี่ยนความกว้าง div ของคุณเป็น 160px หากคุณมี padding ที่ 20px มันจะเพิ่มความกว้างของ div ของคุณ 40px ดังนั้นคุณต้องลบ 40px ออกจากความกว้างเพื่อให้ div ของคุณดูปกติและไม่บิดเบี้ยวด้วยความกว้างที่เพิ่มขึ้น ข้อความของคุณทั้งหมดสับสน


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