เหตุใด CSS จึงไม่รองรับการเว้นช่องว่างเชิงลบ


125

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

อัปเดต

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


28
เพราะมันไม่สมเหตุสมผลที่จะมีช่องว่างในเชิงลบ
Petah

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

9
หลายคนคงอยากได้ตัวอย่าง นี่คือของฉันและทำไมฉันถึงรู้สึกแย่กับช่องว่างเชิงลบ ใช้คุณลักษณะขอบภาพที่คุณอาจต้องการที่จะให้ชายแดนภาพเล็กน้อยทับซ้อนข้อความ (ตัวอย่างเช่นถ้าคุณกำลังทำฟอง highligted มันเป็นที่นิยมมากในเว็บ Theese วัน;))
Himmators

82
หากบางสิ่งบางอย่าง "ไม่สมเหตุสมผล" สำหรับใครบางคนก็ไม่มีข้อแก้ตัวที่จะไปขวางคนอื่น
Rolf

1
ฉันกำลังพยายามแสดงโค้ดใน<span>แท็กและวิธีการแยกวิเคราะห์จะเป็นการแบ่งบรรทัดพิเศษที่จุดเริ่มต้นของบล็อกโค้ด ด้วยการเว้นช่องว่างเชิงลบฉันสามารถทำให้พื้นที่พิเศษนี้หายไป
Steven Lu

คำตอบ:


87

เมื่อเร็ว ๆ นี้ฉันได้ตอบคำถามอื่นที่ฉันได้พูดคุยว่าทำไมรูปแบบกล่องถึงเป็นอย่างนั้น

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


2
ขอบคุณตา นั่นทำให้ฉันมีเหตุผลที่น่าพอใจ ไชโย :)
ikartik90

11
จะเกิดอะไรขึ้นหากคุณต้องการย่อขนาดเส้นขอบให้ใกล้กับข้อความตัวอย่างเช่นเมื่อคุณใช้รูปภาพขอบ
ฮิมเมเตอร์

5
บางครั้งการแก้ไข CSS ของลูกทั้งหมดของคอนเทนเนอร์อาจไม่เป็นประโยชน์ คุณอาจมี CSS ทั่วไปที่ใช้กับองค์ประกอบเหล่านี้ในเอกสารและคุณไม่ต้องการเปลี่ยนแปลงสำหรับเนื้อหาของคอนเทนเนอร์ใด ๆ ตัวอย่างเช่น
Rolf

15
เอ๊ะมันเป็นเหตุผล แต่ฉันจะไม่เรียกว่ามันเป็นที่น่าพอใจ นี่เป็นกรณีที่ข้อมูลจำเพาะเกินกว่าที่จะบอกวิธีกำหนดเพจของฉันและเริ่มบอกฉันว่าฉันควรกำหนดเพจของฉันอย่างไร หากฉันต้องการให้เนื้อหาของฉันซ้อนทับขอบพื้นหลังเส้นขอบและ / หรือระยะขอบของฉันนั่นควรเป็นสิทธิพิเศษของฉันจินตนาการของผู้กำหนดข้อมูลจำเพาะว่าเหตุใดฉันจึงอาจต้องการทำเช่นนั้น ขออภัยฉันรู้สึกหงุดหงิดเล็กน้อยที่ฉันต้องเพิ่ม syntactical cruft หรือที่แย่กว่านั้นคือภาพสีเดียวแบบกว้างพิกเซลเดียวเพื่อให้ได้ตัวคั่นขนาดเฉพาะที่เล็กกว่าความสูงของข้อความและอยู่กึ่งกลางในแนวตั้ง
Jason

1
@zzzzBov ฉันรู้สึกว่ามันมีความเกี่ยวข้องเนื่องจากตัวอย่างที่ฉันให้ไว้ตอนท้ายว่าทำไมฉันถึงอยากทำสิ่งนั้นซึ่งเป็นคำถามทั่วไปในความคิดเห็นในหน้านี้ เป็นที่ยอมรับว่าม้าของฉันสูงเพียงเล็กน้อยที่นำไปสู่จุดนั้น
Jason

4

Padding ตามความหมายคือจำนวนเต็มบวก (รวม 0)

ช่องว่างภายในเชิงลบจะทำให้เส้นขอบยุบลงในเนื้อหา (ดูหน้าโมเดลกล่องใน w3) ซึ่งจะทำให้พื้นที่เนื้อหาเล็กกว่าเนื้อหาซึ่งไม่สมเหตุสมผล


37
เส้นขอบที่ยุบลงในเนื้อหาเป็นผลที่ต้องการ คุณรู้วิธีอื่นในการได้รับผลกระทบนี้หรือไม่?
Rolf

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

4

ฉันอยากจะอธิบายตัวอย่างที่ดีมากว่าทำไมถึงnegative paddingมีประโยชน์และยอดเยี่ยม

อย่างที่พวกเรานักพัฒนา CSS ทุกคนทราบกันดีว่าการปรับขนาด div ในแนวตั้งแบบไดนามิกภายในอีกรูปแบบหนึ่งนั้นเป็นเรื่องยุ่งยากและส่วนใหญ่มองว่าเป็นไปไม่ได้ที่จะใช้ CSS เท่านั้น การรวมตัวกันnegative paddingสามารถเปลี่ยนแปลงสิ่งนี้ได้

โปรดตรวจสอบ HTML ต่อไปนี้:

<div style="height:600px; width:100%;">
    <div class="vertical-align" style="width:100%;height:auto;" >
        This DIV's height will change based the width of the screen.
    </div>
</div>

ด้วย CSS ต่อไปนี้เราจะสามารถจัดกึ่งกลางเนื้อหาของด้านในdivภายในด้านนอกในแนวตั้งdiv:

.vertical-align {
    position: absolute;
    top:50%;
    padding-top:-50%;
    overflow: visible;
}

ให้ฉันอธิบาย ...

การวางตำแหน่งด้านบนของ div ด้านในอย่างแน่นอนที่ 50% จะทำให้ขอบด้านบนของ div ด้านในอยู่ตรงกลาง div ด้านนอก ค่อนข้างเรียบง่าย เพราะนี่คือการวางตำแหน่งตามเปอร์เซ็นต์เมื่อเทียบกับขนาดภายในขององค์ประกอบหลัก

ร้อยละ padding ตามบนมืออื่น ๆ ที่อยู่บนพื้นฐานของมิติภายในขององค์ประกอบที่กำหนดเป้าหมาย ดังนั้นโดยการใช้คุณสมบัติของpadding-top: -50%;เราได้เลื่อนเนื้อหาของ div ชั้นในขึ้นโดยระยะทาง 50% ของความสูงของเนื้อหา div ภายในดังนั้นการจัดกึ่งกลางเนื้อหาของ div ภายในภายใน div ด้านนอกและยังคงให้มิติความสูงของ div ภายในให้มีชีวิตชีวา!

ถ้าคุณถามฉันว่า OP นี่เป็นกรณีการใช้งานที่ดีที่สุดและฉันคิดว่ามันควรจะใช้งานได้เพื่อที่ฉันจะได้แฮ็คนี้ ฮ่า ๆ. หรือควรแก้ไขฟังก์ชันการทำงานvertical-alignและให้เวอร์ชันvertical-alignที่ใช้ได้กับทุกองค์ประกอบ


1
ใช่ แต่เพื่อจุดประสงค์นั้นฉันอยากมีแอตทริบิวต์ใหม่สำหรับองค์ประกอบ html มากกว่าที่จะหักหลังพฤติกรรมของแอตทริบิวต์อื่น ๆ ตัวอย่างของคุณเรียกร้องให้มีแอตทริบิวต์ inner-top ใหม่ เช่นเดียวกับแอตทริบิวต์อันดับต้น ๆ ขององค์ประกอบที่อยู่ในตำแหน่งที่ค่อนข้างสูง แต่สัมพันธ์กับตัวเองไม่ใช่ระดับบนสุด การใช้ช่องว่างเชิงลบที่ดีอีกอย่างหนึ่งคือการสร้างองค์ประกอบตามสัดส่วนของการเติมความกว้างด้วยการเติมเต็ม 100% แต่การปล่อยให้องค์ประกอบเติบโตในแนวตั้งหากเนื้อหามากขึ้นล้นซึ่งเป็นไปไม่ได้หากเนื้อหาอยู่ในพี่น้อง abs-pos พิเศษ ช่องว่างภายในเชิงลบจะทำให้องค์ประกอบที่ยุบตัวของช่องว่างภายในกลับมามีขนาดเท่าเดิม
sergio

ในปี 2018 การจัดกึ่งกลางนั้นง่ายพอ ๆ กับการใช้ดิสเพลย์เฟล็กซ์พร้อมปรับเนื้อหาและจัดแนวรายการ ... โค้ด 3 บรรทัดเพื่อให้มี div ตรงกลางที่สมบูรณ์แบบ
kaiser

2

คุณถามว่าทำไมถึงไม่โกง:

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

เมื่อ html ได้รับการออกแบบนิตยสารก็ชอบการแสดงข้อความรอบ ๆ รูปภาพในตอนนั้นตอนนี้เกลียดเพราะวันนี้เรามีเทรนด์การสัมผัสและชอบสิ่งที่มีพื้นที่กว้างขวางและไม่มีอะไรให้อ่าน นั่นเป็นเหตุผลที่พวกเขากดดันการลอยมากกว่าการวางตรงกลางหรืออาจออกแบบบางอย่างเช่นmargin-top: fill;หรือmargin: average 0;เพียงแค่จัดแนวเนื้อหาให้อยู่ด้านล่างหรือกระจายพื้นที่เพิ่มเติมรอบ ๆ

ในกรณีนี้ฉันคิดว่ามันไม่ได้ถูกนำมาใช้เนื่องจากเหตุผลเดียวกับที่ทำให้ CSS ขาด:parentตัวเลือกหลอก: เพื่อป้องกันการประเมินแบบวนซ้ำ

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

นั่นเป็นเหตุผลที่ (ฉันเดา) ช่องว่างภายในคำนวณจากความกว้างเพราะนั่นคือค่าที่มีให้ในตอนที่เริ่มวาด

หากคุณมีค่าเป็นลบสำหรับช่องว่างภายในจะมีผลต่อขีด จำกัด ภายนอกซึ่งมีการกำหนด ALREADY ไว้แล้วเมื่อกำหนดระยะขอบแล้ว ฉันรู้ว่ายังไม่มีการทาสีใด ๆ แต่เมื่อคุณอ่านวิธีการวาดภาพที่สร้างโดยอัจฉริยะด้วยเทคโนโลยียุค 90 ฉันรู้สึกเหมือนกำลังถามคำถามโง่ ๆ และแค่พูดว่า "ขอบคุณ" ฮิฮิ

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

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

ดังนั้นการวาดภาพและคำนวณไปข้างหน้าและลืมเกี่ยวกับองค์ประกอบที่วาดครั้งเดียวตอนนี้ดูเหมือนว่าจะต้องเป็น


1

สิ่งนี้สามารถช่วยได้:

กล่องขนาดคุณสมบัติ CSS จะใช้ในการปรับเปลี่ยนรูปแบบกล่อง CSS เริ่มต้นที่ใช้ในการคำนวณความกว้างและความสูงขององค์ประกอบ

http://www.w3.org/TR/css3-ui/#box-sizing
https://developer.mozilla.org/En/CSS/Box-sizing


0

การติดตั้ง Iframe ภายในคอนเทนเนอร์จะไม่ตรงกับขนาดของคอนเทนเนอร์ เพิ่มช่องว่างภายในประมาณ 20px ขณะนี้ไม่มีวิธีง่ายๆในการแก้ไขปัญหานี้ คุณต้องใช้จาวาสคริปต์ ( http://css-tricks.com/snippets/jquery/fit-iframe-to-content/ )

ระยะขอบติดลบจะเป็นทางออกที่ง่าย


0

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

ใช่สิ่งนี้ยังคงเกี่ยวข้องกับ CSS3 ในปี 2019 case in point: เค้าโครง flexbox ระยะขอบของรายการ Flexbox จะไม่ยุบดังนั้นเพื่อที่จะเว้นระยะห่างเท่า ๆ กันและจัดแนวให้ตรงกับขอบที่มองเห็นของคอนเทนเนอร์เราต้องลบระยะขอบของรายการออกจากช่องว่างภายในของคอนเทนเนอร์ หากผลลัพธ์ใด ๆ เป็น <0 คุณต้องใช้ระยะขอบลบบนคอนเทนเนอร์หรือรวมค่าลบนั้นกับระยะขอบที่มีอยู่ กล่าวคือเนื้อหาขององค์ประกอบมีผลต่อการกำหนดระยะขอบขององค์ประกอบซึ่งเป็นการย้อนกลับ การสรุปไม่ได้ผลอย่างสมบูรณ์เมื่อเนื้อหาขององค์ประกอบแบบยืดหยุ่นมีระยะขอบที่กำหนดไว้ในหน่วยต่างๆหรือได้รับผลกระทบจากขนาดตัวอักษรที่แตกต่างกันเป็นต้น

ตัวอย่างด้านล่างนี้ควรมีการจัดตำแหน่งกล่องสีเทาและเว้นระยะเท่า ๆ กัน แต่น่าเสียดายที่กล่องเหล่านั้นไม่ได้

body {
  font-family: sans-serif;
  margin: 2rem;
}
body > * {
  margin: 2rem 0 0;
}
body > :first-child {
  margin-top: 0;
}
h1,
li,
p {
  padding: 10px;
  background: lightgray;
}
ul {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  padding: 0;/* just to reset */
  padding: -5px;/* would allow correct alignment */
}
li {
  flex: 1 1 auto;
  margin: 5px;
}
<h1>Cras facilisis orci ligula</h1>

<ul>
  <li>a lacinia purus porttitor eget</li>
  <li>donec ut nunc lorem</li>
  <li>duis in est dictum</li>
  <li>tempor metus non</li>
  <li>dapibus sapien</li>
  <li>phasellus bibendum tincidunt</li>
  <li>quam vitae accumsan</li>
  <li>ut interdum eget nisl in eleifend</li>
  <li>maecenas sodales interdum quam sed accumsan</li>
</ul>

<p>Fusce convallis, arcu vel elementum pulvinar, diam arcu tempus dolor, nec venenatis sapien diam non dui. Nulla mollis velit dapibus magna pellentesque, at tempor sapien blandit. Sed consectetur nec orci ac lobortis.</p>

<p>Integer nibh purus, convallis eget tincidunt id, eleifend id lectus. Vivamus tristique orci finibus, feugiat eros id, semper augue.</p>

ฉันพบปัญหาเล็กน้อยเหล่านี้มากพอในช่วงหลายปีที่การเว้นช่องว่างเชิงลบเล็กน้อยจะหายไปนาน แต่ฉันถูกบังคับให้เพิ่มมาร์กอัปที่ไม่ใช่ความหมายการใช้งานcalc()หรือตัวประมวลผลล่วงหน้า CSS ซึ่งจะใช้ได้เฉพาะเมื่อหน่วยเหมือนกัน ฯลฯ

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