เพิ่มช่องว่างระหว่างองค์ประกอบ HTML โดยใช้ CSS เท่านั้น


109

ฉันมีองค์ประกอบ HTML ที่เหมือนกันหลายรายการต่อกัน:

<span>1</span>
<span>2</span>
<span>3</span>

ฉันกำลังมองหาวิธีที่ดีที่สุดในการเพิ่มพื้นที่ระหว่างองค์ประกอบโดยใช้CSS เท่านั้น

[no space]  [1]  [space 10px]  [2]  [space 10px]  [3]  [no space]

นอกจากนี้:

  • โปรดจดบันทึกความเข้ากันได้ของเบราว์เซอร์ของใบเสร็จของคุณ

อัปเดต

ดูเหมือนว่าฉันพูดไม่ชัด ฉันไม่ต้องการใช้มาร์กอัป HTML เพิ่มเติมใด ๆ เช่น

<span></span>  <span></span>  <span class="last_span"></span>

ฉันไม่ต้องการใช้ตาราง

ฉันต้องการให้ CSS กำหนดเป้าหมายช่วงแรกและช่วงสุดท้ายโดยอัตโนมัติ

ฉันไม่ต้องการใช้จาวาสคริปต์

ข้อกำหนดเพิ่มเติม: ช่วงสุดท้ายต้องไม่ใช่ LAST CHILD ของแท็กหลัก แต่จะเป็นช่วงสุดท้ายของแท็กหลัก Spans ไม่มีแท็กอื่น ๆ ระหว่างพวกเขา


บางทีคุณควรพิจารณาใช้ตาราง ขึ้นอยู่กับข้อมูลที่เข้าสู่text
ผีของมาดาระ

จำนวนspans ตัวแปรหรือไม่?
30

@ ทรูสุดท้ายทางเลือกสุดท้ายควรเป็นตาราง
Tim Joyce

spanองค์ประกอบจะถูกสร้างโดยบริการเว็บที่ผมไม่ได้มีการเข้าถึง เลยเปลี่ยนมาร์กอัปไม่ได้ อย่างไรก็ตามฉันสามารถใช้ CSS ได้อย่างเต็มที่
Dan

ด้วยคำถามเช่นนี้คุณควรระบุการสนับสนุนเบราว์เซอร์ที่คุณต้องการเสมอ "ฉันต้องการการสนับสนุน IE7" จะได้รับคำตอบที่แตกต่างกันโดยสิ้นเชิงสำหรับ "ฉันใช้ Chrome เท่านั้น"
30

คำตอบ:


250

วิธีที่ดีในการดำเนินการคือ:

span + span {
    margin-left: 10px;
}

ทุกคนspanนำโดยspan(เพื่อให้ทุกคนspanยกเว้นคนแรก) margin-left: 10pxจะมี

นี่คือคำตอบโดยละเอียดสำหรับคำถามที่คล้ายกัน: ตัวแยกระหว่างองค์ประกอบโดยไม่ต้องแฮ็ก


10
นี่เป็นทางออกที่ดีแม้ว่าคอนเทนเนอร์ของคุณจะขยายไปยังหลายบรรทัดก็จะล้มเหลว
Savas Vedova

นอกจากนี้ยังใช้งานได้กับคลาสเช่นนี้.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer

2
คุณจะจัดการอย่างไรเมื่อสินค้ามาถึงบรรทัดถัดไป?
thdoan

@thdoan: ขึ้นอยู่กับเลย์เอาต์ของคุณ ฯลฯ คุณสามารถลองสิ่งนี้ได้
thirtydot

1
ฉันชอบวิธีแก้ปัญหาของ reddtoric โดยใช้กริดและช่องว่างแบบกริด
Alex Salomon

29

เพียงใช้ขอบหรือช่องว่างภายใน

ในกรณีของคุณโดยเฉพาะคุณสามารถใช้margin:0 10pxเพียงที่ <span>2

อัปเดต

นี่คือโซลูชัน CSS3 ที่ดี ( jsFiddle ):

span {
    margin: 0 10px;
}

span:first-of-type {
    margin-left: 0;
}

span:last-of-type {
    margin-right: 0;
}

เลือกองค์ประกอบขั้นสูงโดยใช้ตัวเลือกชอบ:nth-child(), :last-child, :first-of-typeฯลฯ ได้รับการสนับสนุนตั้งแต่ Internet Explorer 9


คุณมีคำตอบที่ดี Simone แต่คุณช่วยแก้คำถามโดยไม่ต้องระบุคำตอบสุดท้ายspanด้วยตนเองได้ไหม นี่ควรจะเป็นงานของ CSS
Dan

นี่คือการแฮ็กที่ไม่มีการควบคุมนั่นคือคุณสมบัติ "ระยะห่างระหว่างคำ" สำหรับ: w3schools.com/cssref/pr_text_word-spacing.aspตรวจสอบคำตอบของ Ben
arieljuod

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

จริงๆแล้ว OP บอกว่าเขาจะใช้spans และdivs (ซึ่งเป็นองค์ประกอบบล็อก) โซลูชันของคุณใช้ได้อยู่แล้วหากคุณกำหนดdivs เป็นองค์ประกอบแบบอินไลน์ ...
Simone

16

เพิ่มกฎเหล่านี้ในคอนเทนเนอร์หลัก:

display: grid
grid-auto-flow: column
grid-column-gap: 10px

ข้อมูลอ้างอิงที่ดี: https://cssreference.io/

ความเข้ากันได้ของเบราว์เซอร์: https://gridbyexample.com/browsers/


2
grid-auto-columns="max-content"อาจมีประโยชน์ จะทำให้ขนาดของรายการตารางตรงกับเนื้อหา นอกจากนี้ความเข้ากันได้ของเบราว์เซอร์ก็ไม่ควรเป็นปัญหาอีกต่อไป: caniuse.com/#feat=css-grid
Alex Salomon

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ฉันรู้ว่าความคิดเห็นไม่ได้มีไว้เพื่อขอบคุณฉันใช้ประโยชน์จากการแสดงผล 'flex' เท่านั้นจนถึงตอนนี้และสิ่งที่ 'ตาราง' นี้ทำให้ทุกอย่างง่ายมากจากคอนเทนเนอร์หลัก! เพื่อไม่ให้มันไร้ประโยชน์โดยสิ้นเชิงจะเพิ่มข้อมูลอ้างอิงต่อไปนี้ที่ช่วยได้มากสำหรับทุกคนที่ต้องการเรียนรู้เพิ่มเติม: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar

11

คุณสามารถจัดรูปแบบองค์ประกอบโดยไม่รวมองค์ประกอบแรกในโค้ดบรรทัดเดียว:

span ~ span {
    padding-left: 10px;
}

ไม่ต้องเปลี่ยนคลาสใด ๆ


1
อันนี้ใช้งานได้ดี span + span ไม่ได้ผล แต่ span ~ span ใช้งานได้เหมือนมีเสน่ห์! ขอบคุณ
juliusmh

ในกรณีของฉันฉันมีหลายช่วงบางส่วนที่อาจไม่ประกอบด้วยชั้น "แสดง" ดังนั้นสิ่งที่ฉันต้องเป็นแทนspan.Showing ~ span.Showing เป็นตัวเลือกพี่น้องทั่วไปโดยที่หนึ่งไม่จำเป็นต้องติดตามโดยตรง span.Showing + span.Showing~
Eric

10

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่spanเป็นองค์ประกอบแบบอินไลน์

span{
     word-spacing:10px;
}

อย่างไรก็ตามวิธีนี้จะหยุดทำงานหากคุณมีข้อความมากกว่าหนึ่งคำในช่วงของคุณ




2

<span>เป็นองค์ประกอบแบบอินไลน์ดังนั้นคุณจึงไม่สามารถเว้นระยะห่างได้โดยไม่ทำให้ระดับบล็อก ลองทำตามนี้

แนวนอน

span{
    margin-right: 10px;
    float: left;
}

แนวตั้ง

span{
    margin-bottom: 10px;
}

เข้ากันได้กับทุกเบราว์เซอร์


2

คุณควรห่อองค์ประกอบของคุณในภาชนะแล้วใช้ CSS3 ใหม่ที่มีคุณสมบัติเช่นตาราง CSS , ฟรีหลักสูตรและจากนั้นใช้grid-gap:valueที่ถูกสร้างขึ้นสำหรับปัญหาเฉพาะของคุณ

span{
  border:1px solid red;
}
.inRow{
  display:grid;
  grid-template-columns:repeat(auto-fill,auto);
  grid-gap:10px /*This add space between elements, only works on grid items*/
}
.inColumn{
  display:grid;
  grid-template-rows:repeat(auto-fill,auto);
  grid-gap:15px;
}
<div class="inrow">
  <span>1</span>
  <span>2</span>
  <span>3</span>
</div>
<div class="inColumn">
  <span>4</span>
  <span>5</span>
  <span>6</span>
</div>


ฉันต้องการเพิ่มช่องว่างระหว่างองค์ประกอบของคลาส div โดยใช้สไตล์ css ฉันใช้ตัวอย่างของคุณเพื่อสร้างรหัสของฉันสำหรับสิ่งนั้น ทำงานอย่างมีเสน่ห์ ขอบคุณ!
Elias EstatisticsEU

1

หรือแทนที่จะตั้งค่าระยะขอบและลบล้างคุณสามารถตั้งค่าให้เหมาะสมได้ทันทีด้วยคำสั่งผสมต่อไปนี้:

span:not(:first-of-type) {
    margin-left:  5px;
}

span:not(:last-of-type) {
    margin-right: 5px;
}

คำตอบที่ดีข้อ จำกัด คือการรองรับเบราว์เซอร์:first-of-typeและ:last-of-typeตัวเลือก CSS
แดน

... ตรวจสอบnotการรองรับเบราว์เซอร์นิพจน์ด้วย
Dan

1
@ มันยอดเยี่ยมมากเบราว์เซอร์หลายปีที่ผ่านมาทั้งหมดได้รับการคุ้มครอง แต่ฉันต้องยอมรับว่าวิธีการแก้ปัญหาของ yzoja นั้นฉลาดกว่า :)
jalooc

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


0

หากคุณต้องการจัดแนวรายการต่างๆและต้องการให้มีระยะขอบเท่ากันทุกด้านคุณสามารถใช้สิ่งต่อไปนี้ แต่ละองค์ประกอบcontainerโดยไม่คำนึงถึงประเภทจะได้รับขอบรอบเดียวกัน

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

.container {
  display: flex;
}
.container > * {
  margin: 5px;
}

หากคุณต้องการจัดแนวรายการในแถว แต่ให้องค์ประกอบแรกแตะที่ขอบด้านซ้ายสุดcontainerและให้องค์ประกอบอื่น ๆ มีระยะห่างเท่า ๆ กันคุณสามารถใช้สิ่งนี้:

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

.container {
  display: flex;
}
.container > :first-child {
  margin-right: 5px;
}
.container > *:not(:first-child) {
  margin: 5px;
}

2
แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มคุณค่าในระยะยาว
β.εηοιτ.βε
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.