ฉันจะลบช่องว่างระหว่างองค์ประกอบ inline / inline-block ได้อย่างไร


1066

รับ HTML และ CSS นี้:

span {
    display:inline-block;
    width:100px;
    background-color:palevioletred;
}
<p>
    <span> Foo </span>
    <span> Bar </span>
</p>

ดังนั้นจะมีช่องว่างกว้าง 4 พิกเซลระหว่างองค์ประกอบ SPAN

การสาธิต: http://jsfiddle.net/dGHFV/

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

<p>
    <span> Foo </span><span> Bar </span>
</p>

อย่างไรก็ตามฉันหวังว่าโซลูชัน CSS ที่ไม่ต้องการซอร์สโค้ด HTML จะต้องได้รับการแก้ไข

ฉันรู้วิธีแก้ปัญหานี้ด้วย JavaScript - โดยการลบโหนดข้อความจากองค์ประกอบภาชนะ (ย่อหน้า) เช่น:

// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();

ตัวอย่าง: http://jsfiddle.net/dGHFV/1/

แต่ปัญหานี้สามารถแก้ไขได้ด้วย CSS เท่านั้นหรือไม่


ดูคำตอบของฉันในคำถามนี้เพื่อดูตัวเลือกเต็มรูปแบบที่เกี่ยวข้องในขณะนี้: stackoverflow.com/questions/14630061/ …
ktamlyn


ที่เกี่ยวข้อง: stackoverflow.com/a/59357436/104380
vsync

คำตอบ:


1006

เนื่องจากคำตอบนี้ค่อนข้างเป็นที่นิยมฉันเขียนใหม่อย่างมีนัยสำคัญ

อย่าลืมคำถามจริงที่ถามไว้:

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

มันเป็นไปได้ที่จะแก้ปัญหานี้ด้วย CSS เพียงอย่างเดียว แต่ไม่มีสมบูรณ์แก้ไข CSS ที่แข็งแกร่ง

ทางออกที่ฉันมีในคำตอบเริ่มต้นคือการเพิ่มfont-size: 0องค์ประกอบผู้ปกครองแล้วประกาศความรู้สึกที่มีfont-sizeต่อเด็ก

http://jsfiddle.net/thirtydot/dGHFV/1361/

สิ่งนี้ใช้ได้กับเบราว์เซอร์รุ่นใหม่ล่าสุดทุกรุ่น มันทำงานได้ใน IE8 มันไม่ทำงานใน Safari 5 แต่มันไม่ทำงานใน Safari 6. Safari 5 เกือบตายเบราว์เซอร์ ( 0.33% สิงหาคม 2015 )

ปัญหาที่เป็นไปได้ส่วนใหญ่ที่มีขนาดตัวอักษรสัมพัทธ์ไม่ซับซ้อนในการแก้ไข

อย่างไรก็ตามในขณะที่นี่เป็นวิธีแก้ปัญหาที่เหมาะสมถ้าคุณต้องการแก้ไข CSS เท่านั้นโดยเฉพาะมันไม่ใช่สิ่งที่ฉันแนะนำถ้าคุณมีอิสระในการเปลี่ยน HTML ของคุณ (ส่วนใหญ่เราเป็น)


นี่คือสิ่งที่ฉันเป็นนักพัฒนาเว็บที่มีประสบการณ์พอสมควรจริง ๆ แล้วทำเพื่อแก้ไขปัญหานี้:

<p>
    <span>Foo</span><span>Bar</span>
</p>

ใช่ถูกแล้ว. ฉันลบช่องว่างใน HTML ระหว่างองค์ประกอบแบบอินไลน์บล็อก

มันเป็นเรื่องง่าย. มันง่ายมาก มันทำงานได้ทุกที่ มันเป็นวิธีแก้ปัญหาอย่างจริงจัง

บางครั้งคุณต้องพิจารณาอย่างรอบคอบว่าช่องว่างมาจากไหน การผนวกองค์ประกอบอื่นด้วย JavaScript จะเพิ่มช่องว่างหรือไม่ไม่ไม่ถ้าคุณทำอย่างถูกต้อง

ไปกันเถอะการเดินทางที่มหัศจรรย์ในหลาย ๆ วิธีเพื่อลบช่องว่างด้วย HTML ใหม่:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>
  • คุณสามารถทำสิ่งนี้ได้ตามปกติ:

    <ul>
        <li>Item 1</li><li>Item 2</li><li>Item 3</li>
    </ul>

    http://jsfiddle.net/thirtydot/dGHFV/1362/

  • หรือสิ่งนี้:

    <ul>
        <li>Item 1</li
        ><li>Item 2</li
        ><li>Item 3</li>
    </ul>
  • หรือใช้ความคิดเห็น:

    <ul>
        <li>Item 1</li><!--
        --><li>Item 2</li><!--
        --><li>Item 3</li>
    </ul>
  • หรือถ้าคุณใช้ PHP หรือสิ่งที่คล้ายกัน:

    <ul>
        <li>Item 1</li><?
        ?><li>Item 2</li><?
        ?><li>Item 3</li>
    </ul>
  • หรือคุณสามารถข้ามแท็กปิดบางส่วนได้ทั้งหมด (เบราว์เซอร์ทั้งหมดใช้ได้กับสิ่งนี้):

    <ul>
        <li>Item 1
        <li>Item 2
        <li>Item 3
    </ul>

ตอนนี้ที่ผมได้หายไปและเบื่อคุณไปสู่ความตายด้วย "หนึ่งพันวิธีที่แตกต่างกันเพื่อลบช่องว่างโดย thirtydot" font-size: 0หวังว่าคุณลืมเกี่ยวกับทุก


หรือคุณสามารถใช้ flexboxเพื่อให้ได้เลย์เอาต์หลายแบบที่คุณอาจเคยใช้แบบอินไลน์บล็อกสำหรับ: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


7
มันทำงานได้ใน FF3.6, IE9RC, O11, Ch9 อย่างไรก็ตามใน Safari 5 ยังคงมีช่องว่างกว้าง 1px:(
Šime Vidas

7
@thirtydot คุณช่วยตรวจสอบความคิดเห็นของคำตอบนี้ได้ไหม อาจเป็นได้ว่าfont-size:0เคล็ดลับนี้ไม่ใช่ความคิดที่ดีหลังจากนั้น ...
--ime Vidas

25
ฉันรู้ว่าผู้โพสต์กำลังมองหาวิธีแก้ปัญหา CSS แต่วิธีนี้ - ซึ่งได้รับการโหวตมากที่สุด (30 โหวตเทียบกับ 5 ในขณะที่ฉันเขียน) - มีผลข้างเคียงที่รุนแรงและไม่ทำงานข้ามเบราว์เซอร์ ณ จุดนี้มันเป็นประโยชน์มากกว่าที่จะเพียงแค่ลบช่องว่างที่มีปัญหาใน HTML ของคุณ
Steph Thirion

10
การแก้ปัญหานี้จะทำงานเฉพาะถ้าคุณไม่ทำงานร่วมกับส่ง EMS ขนาดคอนเทนเนอร์ของคุณ
แม้ว

6
สิ่งนี้จะทำลายองค์ประกอบย่อยที่มีขนาดตัวอักษรที่เกี่ยวข้อง
Daniel

156

สำหรับ CSS3 ที่สอดคล้องกับเบราว์เซอร์ white-space-collapsing:discard

ดู: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing


คุณไม่ต้องการใช้trim-innerมากกว่านี้discardใช่ไหม
spb

49
นี้ถูกลบออกจากข้อความ Level 3 แต่ข้อความระดับที่ 4 มี ถึงปี 2559 แล้วและยังไม่มีการสนับสนุน text-space-collapse:discard
Oriol

1
@MrLister: โซลูชันอื่น ๆ ใช้ไม่ได้ในทุกกรณี ตัวอย่างเช่นฉันไม่ทราบเกี่ยวกับวิธีแก้ปัญหาใด ๆ ซึ่งจะลบช่องว่างต่อท้ายออกจาก<p>A long text...</p>ที่ซึ่งแท็กเปิดและปิดอยู่ในบรรทัดที่แยกจากกันกว่าเนื้อหาข้อความ นั่นคือสิ่งที่ฉันทำตลอดเวลาเพื่อให้ไฟล์ HTML ของฉันเป็นระเบียบและสามารถอ่านได้
Robert Kusznier

@Robertfloat
Mr Lister

@MrLister Floating ลบส่วนท้ายแน่นอน แต่มีผลข้างเคียงที่ร้ายแรง - เปลี่ยนตำแหน่งขององค์ประกอบทั้งหมดในเลย์เอาต์ของคอนเทนเนอร์โดยสิ้นเชิง ฉันจะทำเช่นนั้นได้อย่างไรเมื่อการลอยองค์ประกอบทำลายโครงสร้างของฉัน (ซึ่งมักจะเป็นกรณี)?
Robert Kusznier

94

แก้ไข:

วันนี้เราก็ควรจะใช้flexbox


คำตอบเดิม:

ตกลงแม้ว่าฉันได้ upvoted ทั้งสองfont-size: 0;และnot implemented CSS3 featureคำตอบหลังจากที่พยายามผมพบว่าไม่มีของพวกเขาเป็นวิธีการแก้ปัญหาที่แท้จริง

อันที่จริงไม่มีวิธีแก้ปัญหาแม้แต่ข้อเดียวโดยไม่มีผลข้างเคียงที่รุนแรง

จากนั้นฉันตัดสินใจที่จะลบช่องว่าง (คำตอบนี้เกี่ยวกับอาร์กิวเมนต์นี้) ระหว่างinline-blockdiv จากHTMLแหล่งที่มาของฉัน( JSP) เปลี่ยนเป็น:

<div class="inlineBlock">
    I'm an inline-block div
</div>
<div class="inlineBlock">
    I'm an inline-block div
</div>

สำหรับสิ่งนี้

<div class="inlineBlock">
    I'm an inline-block div
</div><div class="inlineBlock">
    I'm an inline-block div
</div>

ที่น่าเกลียด แต่ทำงาน

แต่รอสักครู่ ... สิ่งที่ถ้าฉันสร้าง divs ภายในของฉันTaglibs loops( Struts2, JSTLฯลฯ ... )?

ตัวอย่างเช่น:

<s:iterator begin="0" end="6" status="ctrDay">
    <br/>
    <s:iterator begin="0" end="23" status="ctrHour">
        <s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}">
            <div class="inlineBlock>
                I'm an inline-block div in a matrix 
                (Do something here with the pushed object...)
           </div>
       </s:push>
    </s:iterator>
</s:iterator>

มันไม่ได้คิดที่จะอินไลน์ทุกสิ่งนั้นมันจะหมายถึง

<s:iterator begin="0" end="6" status="ctrDay">
    <br/>
    <s:iterator begin="0" end="23" status="ctrHour"><s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"><div class="inlineBlock>
                I'm an inline-block div in a matrix             
                (Do something here with the pushed object...)
           </div></s:push></s:iterator>
</s:iterator>

ที่อ่านไม่ได้ยากต่อการเข้าใจและอื่น ๆ

วิธีแก้ปัญหาที่ฉันพบ:

ใช้ความคิดเห็น HTML เพื่อเชื่อมต่อจุดสิ้นสุดของ div หนึ่งไปยังจุดเริ่มต้นของอีกอัน!

<s:iterator begin="0" end="6" status="ctrDay">
   <br/>
   <s:iterator begin="0" end="23" status="ctrHour"><!--
    --><s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"><!--
        --><div class="inlineBlock>
                I'm an inline-block div in a matrix             
                (Do something here with the pushed object...)
           </div><!--
    --></s:push><!--
--></s:iterator>
</s:iterator>

วิธีนี้คุณจะมีโค้ดที่อ่านได้และเยื้องอย่างถูกต้อง

และเป็นผลข้างเคียงในเชิงบวกHTML sourceถึงแม้ว่าการรบกวนจากความคิดเห็นที่ว่างเปล่าจะส่งผลการเยื้องอย่างถูกต้อง

ลองมาตัวอย่างแรก ในความเห็นต่ำต้อยของฉันนี้:

    <div class="inlineBlock">
        I'm an inline-block div
    </div><!--
 --><div class="inlineBlock">
        I'm an inline-block div
    </div>

ดีกว่านี้:

    <div class="inlineBlock">
         I'm an inline-block div
    </div><div class="inlineBlock">
         I'm an inline-block div
    </div>

1
โปรดทราบว่านี่อาจทำให้ฟังก์ชันการพับโค้ดในโปรแกรมแก้ไขของคุณเสียหายด้วยเช่นกัน
jknotek

44

เพิ่มความคิดเห็นระหว่างองค์ประกอบเพื่อไม่มีช่องว่าง สำหรับฉันมันง่ายกว่าการรีเซ็ตขนาดตัวอักษรเป็นศูนย์จากนั้นตั้งค่ากลับมา

<div>
    Element 1
</div><!--
--><div>
    Element 2
</div>

นี่คือแฮ็คที่เราไม่ควรใช้ในปี 2020: ใช้ flexbox แทนcaniuse.com/#feat=flexbox
tonygatta

คำตอบถูกเขียนขึ้นในปี 2013 และในขณะที่ flexbox ไม่ใช่คำตอบสำหรับคำถามที่ว่านี้ก็ไม่ใช่ แต่ทำงานด้วยเช่นกัน: stackoverflow.com/a/37512227/1019850
David

42

เทคนิคการกำจัดอวกาศทั้งหมดสำหรับdisplay:inline-blockแฮ็กที่น่ารังเกียจ ...

ใช้Flexbox

มันยอดเยี่ยมแก้รูปแบบบล็อกแบบอินไลน์ได้ทั้งหมดนี้และในปี 2017 มีการสนับสนุนเบราว์เซอร์ 98% (ยิ่งถ้าคุณไม่สนใจ IE เก่า)


1
การแฮ็กที่น่ารังเกียจอาจเป็นไปได้ แต่ขนาดตัวอักษร: 0 ใช้งานได้กับเบราว์เซอร์ 100% และการใช้การแสดงผล: อินไลน์เฟล็กซ์ยังไม่กำจัดช่องว่างพิเศษแม้แต่ในเบราว์เซอร์ที่รองรับ!
แพทริค

@patrick Flexbox แก้ปัญหาได้อย่างแน่นอนคุณเพียงแค่ทำผิด inline-flex ไม่ได้หมายถึงการแสดงรายการ flex แบบอินไลน์ - มันใช้เฉพาะกับภาชนะบรรจุ ดูstackoverflow.com/a/27459133/165673
Yarin

7
"font-size: 0" ไม่ทำงานบนเบราว์เซอร์ 100% (การตั้งค่าเบราว์เซอร์ขนาดอักษรขั้นต่ำ) และคำตอบนี้ดีจริงๆ
ViliusL

35

เพิ่มdisplay: flex;ไปยังองค์ประกอบหลัก นี่คือทางออกที่มีคำนำหน้า:

รุ่นที่ง่าย👇

p {
  display: flex;
}

span {
  width: 100px;
  background: tomato;
  font-size: 30px;
  color: white;
  text-align: center;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>


แก้ไขด้วยคำนำหน้า👇

p {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
}
span {
  float: left;
  display: inline-block;
  width: 100px;
  background: blue;
  font-size: 30px;
  color: white;
  text-align: center;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>


1
นั่นเป็นคำตอบที่ยอดเยี่ยม! แม้ว่าฉันคิดว่ามันจะเป็นเรื่องเรียบร้อยที่จะวางเวอร์ชันที่เรียบง่ายไว้ด้านบนเพื่อให้เป็นสิ่งแรกที่ผู้อ่านเห็น หรืออาจลบเวอร์ชันที่ไม่ง่ายออกก็ได้
Stefnotch

1
@Stefnotch เสร็จสิ้น✅ขอบคุณสำหรับคำแนะนำที่มีคุณค่าของคุณ :-)
โม

31

นี่คือคำตอบเดียวกับที่ฉันบอกไปในสิ่งที่เกี่ยวข้อง: Display: Inline block - พื้นที่นั้นคืออะไร?

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

@font-face{ 
    font-family: 'NoSpace';
    src: url('../Fonts/zerowidthspaces.eot');
    src: url('../Fonts/zerowidthspaces.eot?#iefix') format('embedded-opentype'),
         url('../Fonts/zerowidthspaces.woff') format('woff'),
         url('../Fonts/zerowidthspaces.ttf') format('truetype'),
         url('../Fonts/zerowidthspaces.svg#NoSpace') format('svg');
}

body {
    font-face: 'OpenSans', sans-serif;
}

.inline-container {
    font-face: 'NoSpace';
}

.inline-container > * {
    display: inline-block;
    font-face: 'OpenSans', sans-serif;
}

เหมาะกับการลิ้มรส นี่คือการดาวน์โหลดตัวอักษรที่ฉันเพิ่งทำขึ้นมาในฟอนต์ฟอร์จและแปลงด้วยเครื่องกำเนิดไฟฟ้า FontSquirrel webfont ใช้เวลาทั้งหมด 5 นาที ซีเอสเอ@font-faceประกาศจะรวม: ศูนย์ความกว้างของตัวอักษรพื้นที่ซิป อยู่ใน Google Drive ดังนั้นคุณจะต้องคลิกไฟล์> ดาวน์โหลดเพื่อบันทึกลงในคอมพิวเตอร์ของคุณ คุณอาจต้องเปลี่ยนพา ธ แบบอักษรเช่นกันหากคุณคัดลอกประกาศไปยังไฟล์ css หลักของคุณ


1
ฉันเห็นคุณโพสต์นี้ในCSS Tricksฉันคิดว่าและสำหรับฉันนี่คือคำตอบที่ดี มันเบาใช้งานง่ายและข้ามเบราว์เซอร์ (เท่าที่การทดสอบของฉันได้แสดง) ฉันไปกับ flexbox โดยสิ้นเชิงจนกระทั่งฉันรู้ว่า Firefox จะไม่รองรับflex-wrapจนถึงอย่างน้อย v28 ( srsly? ) แต่นี่เป็นทางเลือกที่สมบูรณ์แบบจนกระทั่งถึงตอนนั้น
indextwo

16
นี่เป็นกรณีที่เลวร้ายที่สุดของการเติมเต็มมากเกินไปที่ฉันเห็นในระยะเวลานาน ดาวน์โหลดแบบอักษรทั้งหมดเพียงเพื่อลบช่องว่างหรือไม่ โธ่
นาย Lister

3
@MrLister คุณรู้หรือไม่ว่าไฟล์ฟอนต์นั้นเล็กมาก? มันไม่ได้ทำให้ร่ายมนตร์ภายใน ฉันจะเถียงมากกว่าที่จะรวมมันเป็น base64 เข้ารหัสต่อไปดังนั้นเราจึงกำจัดการร้องขอเช่นกัน
Robert Koritnik

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

22

สองตัวเลือกเพิ่มเติมตามCSS Text Module Level 3 (แทนที่จะwhite-space-collapsing:discardถูกลบจากร่างข้อมูลจำเพาะ):

  • word-spacing: -100%;

ในทางทฤษฎีมันควรจะทำสิ่งที่ต้องการ - ตัดช่องว่างระหว่าง 'คำพูด' ให้สั้นลงโดย 100% ของความกว้างของอักขระเว้นวรรคคือ 0 แต่ดูเหมือนว่าจะไม่สามารถทำงานได้ทุกที่โชคไม่ดีและคุณลักษณะนี้มีการทำเครื่องหมาย 'ที่มีความเสี่ยง' (สามารถตกจากสเปคได้เช่นกัน)

  • word-spacing: -1ch;

มันทำให้ช่องว่างระหว่างคำสั้นลงตามความกว้างของตัวเลข '0' ในฟอนต์แบบอวกาศควรจะเท่ากับความกว้างของอักขระเว้นวรรค (และอักขระอื่น ๆ เช่นกัน) สิ่งนี้ใช้ได้ใน Firefox 10+, Chrome 27+ และเกือบจะใช้ได้ใน Internet Explorer 9+

ซอ


+1 สำหรับการเว้นวรรคคำแม้ว่า -0.5ch เป็นค่าที่ถูกต้องโดยข้อความ -1ch ที่ไม่มีช่องว่างจะไม่สามารถอ่านได้ แต่ -0.5ch จะทำงานเหมือนขนาดตัวอักษร: 0; ด้วยขนาดชุดที่ชัดเจนที่องค์ประกอบข้อความ :)
Dennis98

6
@ Dennis98, -1ch ทำงานเฉพาะสำหรับแบบอักษร monospace (เช่น Courier New) เพราะตัวของพวกเขาทุกคนมีความกว้างเท่ากันรวมทั้งและ' ' '0'ในฟอนต์ที่ไม่ใช่แบบ monospace นั้นไม่มีสัดส่วนเวทย์มนตร์ที่เหมาะสมทั้งหมดระหว่างความกว้าง ' 'และ'0'ตัวอักษรดังนั้นจึงchไม่มีประโยชน์มากนัก
Ilya Streltsyn

แทนที่จะใช้word-spacingเราสามารถใช้letter-spacingกับค่าลบขนาดใหญ่ตามอำเภอใจดังที่แสดงในคำตอบของฉัน
S.Serpooshan

20

น่าเสียดายที่มันคือ 2019 และwhite-space-collapseยังไม่ได้ใช้งาน

ในระหว่างนี้ให้มอบองค์ประกอบหลักfont-size: 0;และตั้งค่าให้font-sizeกับเด็ก ๆ สิ่งนี้ควรทำเคล็ดลับ


16

ใช้ flexbox และย้อนกลับ (จากคำแนะนำด้านบน) สำหรับเบราว์เซอร์รุ่นเก่า:

ul {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
}

13

ง่าย:

item {
  display: inline-block;
  margin-right: -0.25em;
}

ไม่จำเป็นต้องแตะองค์ประกอบหลัก

เงื่อนไขที่นี่เท่านั้น: ต้องไม่กำหนดขนาดแบบอักษรของรายการ (ต้องเท่ากับขนาดแบบอักษรของพาเรนต์)

0.25em เป็นค่าเริ่มต้น word-spacing

W3Schools - คุณสมบัติการเว้นวรรคคำ


0.25em ไม่ใช่ "การเว้นวรรคคำเริ่มต้น" แต่เป็นความกว้างของอักขระช่องว่างในแบบอักษร Times New Roman ที่เพิ่งจะเป็นแบบอักษรเริ่มต้นในระบบปฏิบัติการยอดนิยมบางระบบ แบบอักษรที่เป็นที่นิยมอื่น ๆ เช่น Helvetica มักจะมีช่องว่างที่กว้างขึ้นดังนั้นการลบเพียง 0.25em ออกจากนั้นจึงไม่เพียงพอในการกำจัดช่องว่าง
Ilya Streltsyn

12

font-size: 0; อาจเป็นเรื่องยุ่งยากเล็กน้อยในการจัดการ ...

ฉันคิดว่าเส้นคู่ต่อไปนี้ดีกว่าและใช้งานได้อีกมากและประหยัดเวลากว่าวิธีอื่น ๆ ฉันใช้สิ่งนี้เป็นการส่วนตัว:

.inline-block-wrapper>.inline-block-wrapper,
.inline-block-wrapper{letter-spacing: -4px;}
.inline-block-wrapper>*{letter-spacing: 0;display: inline-block;}

/* OR better shorter name...*/
.items>.items,
.items{letter-spacing: -4px;}
.items>*{letter-spacing: 0;display: inline-block;}

จากนั้นคุณสามารถใช้มันดังต่อไปนี้ ...

<ul class="items">
   <li>Item 1</li>
   <li>Item 2</li>
   <li>Item 3</li>
</ul>

เท่าที่ฉันรู้ (ฉันอาจจะผิด) แต่เบราว์เซอร์ทั้งหมดรองรับวิธีนี้

คำอธิบาย :

งานนี้ (อาจ -3px อาจจะดีกว่า) ตรงตามที่คุณคาดว่าจะทำงาน

  • คุณคัดลอกและวางรหัส (หนึ่งครั้ง)
  • จากนั้นใน html ของคุณเพียงใช้class="items"กับพาเรนต์ของแต่ละ inline-block

คุณไม่จำเป็นต้องกลับไปที่ css และเพิ่มกฎ css อีกอันสำหรับบล็อกอินไลน์ใหม่ของคุณ

การแก้ไขสองประเด็นในครั้งเดียว

โปรดสังเกตด้วย>(ยิ่งกว่าเครื่องหมาย) ซึ่งหมายความว่า * / เด็กทุกคนควรอยู่ในบล็อก

http://jsfiddle.net/fD5u3/

หมายเหตุ: ฉันได้ปรับเปลี่ยนเพื่อรองรับการสืบทอดระยะห่างตัวอักษรเมื่อ wrapper มี wrapper ลูก


แทน-4pxสำหรับletter-spacingซึ่งอาจจะไม่เพียงพอสำหรับขนาดใหญ่ตัวอักษรขนาดเช่น: ดูซอนี้เราสามารถใช้เป็นค่าที่มีขนาดใหญ่เช่นเดียวกับในการโพสต์ของฉัน
S.Serpooshan

12

แม้ว่าเทคนิคจะไม่ได้คำตอบสำหรับคำถาม: "ฉันจะลบช่องว่างระหว่างองค์ประกอบแบบอินไลน์บล็อกได้อย่างไร"

คุณสามารถลองใช้วิธีการแก้ปัญหา flexbox และใช้รหัสด้านล่างและพื้นที่จะถูกลบ

p {
   display: flex;
   flex-direction: row;
}

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมันได้ที่ลิงค์นี้: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


ในขณะที่ในทางเทคนิคไม่ได้เป็นคำตอบ "ฉันสามารถทำเช่นนี้กับอินไลน์บล็อก" นี้ดูเหมือนว่าฉันจะเป็นทางออกที่สวยงาม ...
ลูคัส

10

ฉันไม่แน่ใจว่าถ้าคุณต้องการสร้างสีน้ำเงินสองช่วงโดยไม่มีช่องว่างหรือต้องการจัดการพื้นที่สีขาวอื่น ๆ แต่ถ้าคุณต้องการลบช่องว่าง:

span {
    display: inline-block;
    width: 100px;
    background: blue;
    font-size: 30px;
    color: white;
    text-align: center;

    float: left;
}

และเสร็จแล้ว


9

โดยทั่วไปเราใช้องค์ประกอบเช่นนี้ในบรรทัดที่แตกต่างกัน แต่ในกรณีของ display:inline-blockใช้แท็กในบรรทัดเดียวกันจะลบช่องว่าง แต่ในบรรทัดที่แตกต่างกันจะไม่

ตัวอย่างที่มีแท็กในบรรทัดอื่น:

p span {
  display: inline-block;
  background: red;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>

ตัวอย่างที่มีแท็กในบรรทัดเดียวกัน

p span {
  display: inline-block;
  background: red;
}
<p>
  <span> Foo </span><span> Bar </span>
</p>


อีกวิธีที่มีประสิทธิภาพคืองาน CSS ที่ใช้font-size:0กับองค์ประกอบหลักและมอบให้font-sizeกับองค์ประกอบย่อยเท่าที่คุณต้องการ

p {
  font-size: 0;
}
p span {
  display: inline-block;
  background: red;
  font-size: 14px;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>

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


ข้อเสียสำหรับวิธีนี้คือเราจำเป็นต้องรู้และทำซ้ำขนาดตัวอักษรเริ่มต้น (เช่น 14px) เพื่อตั้งค่ากลับเป็นปกติในองค์ประกอบของเด็ก!
S.Serpooshan

8

ฉันมีปัญหานี้ในตอนนี้และจากfont-size:0;ฉันพบว่าใน Internet Explorer 7 ปัญหายังคงอยู่เพราะ Internet Explorer คิดว่า "Font Size 0?!?! WTF คุณเป็นคนบ้าเหรอ?" - ดังนั้นในกรณีของฉันฉันได้รีเซ็ต CSS ของ Eric Meyer และfont-size:0.01em;ฉันมีความแตกต่าง 1 พิกเซลจาก Internet Explorer 7 ถึง Firefox 9 ดังนั้นฉันคิดว่านี่เป็นวิธีแก้ปัญหา


7

p {
  display: flex;
}
span {
  float: left;
  display: inline-block;
  width: 100px;
  background: red;
  font-size: 30px;
  color: white;
}
<p>
  <span> hello </span>
  <span> world </span>
</p>


1
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ โปรดอย่าพยายามทำให้รหัสของคุณแน่นเกินไปด้วยคำอธิบายที่อธิบายซึ่งจะช่วยลดความสามารถในการอ่านของทั้งรหัสและคำอธิบาย!
Ashish Ahuja

ฉันเดาว่าfloatและdisplay:inline-blockสำหรับspans มีความหมายว่าเป็นทางเลือกสำหรับกรณีที่flexไม่ได้รับการสนับสนุน แต่floatจะทิ้งผลอย่างมีประสิทธิภาพinline-blockดังนั้นหลังดูเหมือนซ้ำซ้อน
Ilya Streltsyn

6

ฉันได้รับการแก้ปัญหานี้เมื่อเร็ว ๆ นี้และแทนที่จะของการตั้งผู้ปกครองfont-size:0แล้วการตั้งค่าด้านหลังของเด็กให้เป็นค่าที่เหมาะสมฉันได้รับผลที่สอดคล้องกันโดยการตั้งค่าภาชนะผู้ปกครองแล้วเด็กกลับไปletter-spacing:-.25emletter-spacing:normal

ในเธรดอื่นฉันเห็นผู้วิจารณ์พูดถึงว่าfont-size:0ไม่เหมาะเสมอไปเพราะผู้ใช้สามารถควบคุมขนาดแบบอักษรขั้นต่ำในเบราว์เซอร์ได้

การใช้ ems ปรากฏขึ้นเพื่อใช้งานโดยไม่คำนึงว่าขนาดตัวอักษรที่ระบุคือ 100%, 15pt หรือ 36px

http://cdpn.io/dKIjo


ใน Firefox สำหรับ Android ฉันเห็นช่องว่าง 1px ระหว่างกล่อง
Šime Vidas

5

ฉันคิดว่ามีวิธีง่าย ๆ / เก่าสำหรับสิ่งนี้ซึ่งได้รับการสนับสนุนโดยเบราว์เซอร์ทั้งหมดแม้ IE 6/7 เราสามารถตั้งค่าletter-spacingเป็นค่าลบขนาดใหญ่ในพาเรนต์แล้วตั้งค่ากลับเป็นnormalองค์ประกอบย่อย:

body { font-size: 24px }
span { border: 1px solid #b0b0c0; } /* show borders to see spacing */

.no-spacing { letter-spacing: -1em; } /* could be a large negative value */
.no-spacing > * { letter-spacing: normal; } /* => back to normal spacing */
<p style="color:red">Wrong (default spacing):</p>

<div class="">
  <span>Item-1</span>
  <span>Item-2</span>
  <span>Item-3</span>
</div>

<hr/>

<p style="color:green">Correct (no-spacing):</p>

<div class="no-spacing">
  <span>Item-1</span>
  <span>Item-2</span>
  <span>Item-3</span>
</div>


สิ่งเดียวกันที่เกิดขึ้นที่นี่คุณต้องกำหนดletter-spacing:normalองค์ประกอบทั้งหมดของเด็ก
Gaurav Aggarwal

@GauravAggarwal แต่letter-spacingเป็น 99.99% normalของเวลาที่เป็น ขนาดตัวอักษรไม่ได้มีค่าคงที่และขึ้นอยู่กับการออกแบบ มันอาจเป็นค่าเล็กหรือใหญ่ตามตัวอักษรตระกูลและสิ่งอื่น ๆ ... ฉันไม่เคยจำในชีวิตของฉันที่จะเห็น / ใช้ค่าพิเศษ (นอกเหนือจาก 0 / ปกติ) สำหรับletter-spacingดังนั้นฉันคิดว่ามันปลอดภัยและ ตัวเลือกที่ดีกว่า
S.Serpooshan

ฉันไม่เห็นด้วยกับเรื่องนี้ ... ใช้ตัวอักษรเว้นวรรคเป็นปกติกับองค์ประกอบทั้งหมดและการใช้ขนาดตัวอักษรเกินไป (ถ้าจำเป็น) ไม่ได้มีประโยชน์เลยในขณะที่คุณกำลังเขียนโค้ดคู่ที่คุณต้องเปลี่ยนขนาดตัวอักษร การใช้ขนาดตัวอักษรจะไม่สร้างรหัสสองเท่าและสามารถใช้กับขนาดมาตรฐานและขนาดที่กำหนดเองอื่น ๆ ได้ ฉันขอแนะนำให้คุณทำ google และตรวจสอบการใช้ขนาดตัวอักษรเป็นสิ่งที่ยอมรับได้มากที่สุดในวันนี้ โซลูชันเปลี่ยนตามเวลา :)
Gaurav Aggarwal

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

ฉันคิดว่าวิธีนี้ไม่เป็นที่นิยมมาก่อนเพราะมันไม่ได้ทำงานใน Opera / Presto และในปัจจุบันเรามีตัวเลือกอื่น ๆ ที่ไม่ต้องการวิธีแก้ปัญหาเช่นใช้ Flexbox แทน inline-blocks
Ilya Streltsyn



2

ฉันจะขยายคำตอบของ user5609829 เล็กน้อยเพราะฉันเชื่อว่าโซลูชันอื่น ๆ ที่นี่ซับซ้อนเกินไป / ทำงานมากเกินไป การใช้ a margin-right: -4pxกับองค์ประกอบบล็อกแบบอินไลน์จะลบระยะห่างและรองรับโดยเบราว์เซอร์ทั้งหมด ดูซอปรับปรุงที่นี่ สำหรับผู้ที่เกี่ยวข้องกับการใช้อัตรากำไรเชิงลบลองให้นี้อ่าน


4
สิ่งนี้จะไม่ทำงานหากผู้ใช้เปลี่ยนขนาดตัวอักษรเริ่มต้นของเบราว์เซอร์ ใช้ดีกว่า -0.25em
Martin Schneider

1

ข้อกำหนดคุณสมบัติCSS Text Module Level 4 กำหนดtext-space-collapseสถานที่ให้บริการซึ่งจะช่วยให้การควบคุมวิธีการสีขาวภายในพื้นที่และรอบ ๆ เป็นองค์ประกอบที่มีการประมวลผล

ดังนั้นเกี่ยวกับตัวอย่างของคุณคุณจะต้องเขียนสิ่งนี้:

p {
  text-space-collapse: discard;
}

แต่น่าเสียดายที่เบราว์เซอร์ที่ไม่มีการใช้คุณสมบัตินี้เลย ( ณ กันยายน 2016) ตามที่กล่าวไว้ในการแสดงความคิดเห็นกับคำตอบของ HBP


1

ฉันพบโซลูชัน CSS บริสุทธิ์ที่ทำงานได้ดีสำหรับเบราว์เซอร์ทั้งหมด:

span {
    display: table-cell;
}

คำถามนี้เกี่ยวกับ inline-block
Madan Bhandari

@ MadanBhandari ถูกต้อง แต่ดูเหมือนว่าจะลบความต้องการของแฮ็กที่สกปรกทั้งหมด
David

1

เพิ่มwhite-space: nowrapในองค์ประกอบภาชนะ:

CSS:

* {
    box-sizing: border-box;
}
.row {
    vertical-align: top;
    white-space: nowrap;
}
.column{
    float: left;
    display: inline-block;
    width: 50% // Or whatever in your case
}

HTML:

<div class="row">
    <div class="column"> Some stuff</div>
    <div class="column">Some other stuff</div>
</div>

นี่คือPlunker


ไม่ทำงานหากไม่มีการลอย - ซึ่งขาดหายไปในพลั่วของคุณ ดังนั้น "white-space: nowrap" ดูเหมือนจะไม่เป็นคำตอบที่ใช้งานได้
David

1

มีจำนวนมากของการแก้ปัญหาเป็นเหมือนfont-size:0, word-spacing, margin-left, letter-spacingและอื่น ๆ

ปกติฉันชอบใช้letter-spacingเพราะ

  1. ดูเหมือนว่าตกลงเมื่อเรากำหนดค่าที่ใหญ่กว่าความกว้างของพื้นที่พิเศษ (เช่น-1em)
  2. แต่ก็จะไม่โอเคกับword-spacingและเมื่อเรากำหนดค่าที่ใหญ่กว่าเช่นmargin-left-1em
  3. การใช้font-sizeไม่สะดวกเมื่อเราพยายามใช้emเป็นfont-sizeหน่วย

ดังนั้นletter-spacingดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด

อย่างไรก็ตามฉันต้องเตือนคุณ

เมื่อคุณใช้letter-spacingคุณจะดีขึ้นเมื่อใช้-0.3emหรือ-0.31emไม่

* {
  margin: 0;
  padding: 0;
}
a {
  text-decoration: none;
  color: inherit;
  cursor: auto;
}
.nav {
  width: 260px;
  height: 100px;
  background-color: pink;
  color: white;
  font-size: 20px;
  letter-spacing: -1em;
}
.nav__text {
  width: 90px;
  height: 40px;
  box-sizing: border-box;
  border: 1px solid black;
  line-height: 40px;
  background-color: yellowgreen;
  text-align: center;
  display: inline-block;
  letter-spacing: normal;
}
<nav class="nav">
    <span class="nav__text">nav1</span>
    <span class="nav__text">nav2</span>
    <span class="nav__text">nav3</span>
</nav>

หากคุณใช้ Chrome (รุ่นทดสอบ 66.0.3359.139) หรือ Opera (รุ่นทดสอบ 53.0.2907.99) สิ่งที่คุณเห็นอาจเป็น:

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

หากคุณใช้ Firefox (60.0.2) IE10 หรือ Edge สิ่งที่คุณเห็นอาจเป็น:

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

นั่นดูน่าสนใจ. ดังนั้นฉันตรวจสอบmdn-letter-spacingและพบสิ่งนี้:

ความยาว

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

ดูเหมือนว่านี่คือเหตุผล


1

เพิ่มcss letter-spacing:-4px;หลักpและเพิ่มลงletter-spacing:0px;ในspancss ของคุณ

span {
  display:inline-block;
  width:100px;
  background-color:palevioletred;
  vertical-align:bottom;
  letter-spacing:0px;
}

p {
  letter-spacing:-4px;
}
<p>
    <span> Foo </span>
    <span> Bar </span>
</p>


1

ฉันคิดว่าฉันจะเพิ่มสิ่งใหม่ให้กับคำถามนี้แม้ว่าคำตอบที่ให้ไว้ในปัจจุบันนั้นมีมากเกินพอ & มีความเกี่ยวข้องมีคุณสมบัติ CSS ใหม่ซึ่งสามารถบรรลุผลลัพธ์ที่สะอาดมากพร้อมการสนับสนุนอย่างเต็มที่ในเบราว์เซอร์ทั้งหมดและเล็กน้อย ไม่มี 'แฮ็ก' สิ่งนี้จะย้ายออกไปinline-blockแต่จะให้ผลลัพธ์เหมือนกับคำถามที่ถาม

คุณสมบัติ CSS เหล่านี้คือ grid

CSS Grid ได้รับการสนับสนุนอย่างสูง ( CanIUse ) นอกเหนือจาก IE ซึ่งต้องการเพียงส่วน-ms-นำหน้าเพื่อให้สามารถใช้งานได้

CSS ตารางยังมีความยืดหยุ่นสูงและใช้เวลาทั้งหมดส่วนที่ดีจากtable, flexและinline-blockองค์ประกอบและนำพวกเขาเข้าไปในสถานที่แห่งหนึ่ง

เมื่อสร้าง a gridคุณสามารถระบุช่องว่างระหว่างแถวและคอลัมน์ ช่องว่างเริ่มต้นถูกตั้งค่าไว้แล้ว0pxแต่คุณสามารถเปลี่ยนค่านี้เป็นสิ่งที่คุณต้องการ

หากต้องการลดความสั้นลงคุณควรยกตัวอย่างการทำงานที่เกี่ยวข้อง:

body {
  background: lightblue;
  font-family: sans-serif;
}

.container {
  display: grid;
  grid-template-columns: 100px 100px;
  grid-column-gap: 0; /* Not needed but useful for example */
  grid-row-gap: 0; /* Not needed but useful for example */
}

.box {
  background: red;
}
.box:nth-child(even) {
  background: green;
}
<div class="container">
  <div class="box">
    Hello
  </div>
  <div class="box">
    Test
  </div>  
</div>


เพียงแค่แสดงความคิดเห็นเพื่อชี้ให้เห็นเนื้อหาของdisplay:gridองค์ประกอบที่ถูกปิดกั้นดังนั้นจึงไม่มากที่แสดง: กริดช่วยให้คุณทำงานกับรูปแบบบล็อกแบบอินไลน์ แต่มันช่วยให้คุณแทนที่การทำงานinline-blockกับสิ่งที่คุณสามารถควบคุม 'gutters' เป็น คำถามนี้ต้องการ นอกจากนี้ฉันยังแปลกใจจริงๆที่ยังไม่มีใครตอบกลับด้วยโซลูชัน CSS Grid Layout ก่อนหน้านี้
TylerH

inline-blockจะทำให้มันชัดเจนนี้คือการเปลี่ยนแปลงจาก และใช่ฉันรู้สึกประหลาดใจเช่นกันเดาว่าไม่มีใครgridเคยมีประสบการณ์มาก่อนเลย ได้เล่นกับมันเล็กน้อยและเจอคำถามนี้จึงคิดว่าทำไมไม่: P
Stewartside

0

อีกวิธีหนึ่งที่ฉันพบคือการใช้ระยะขอบซ้ายเป็นค่าลบยกเว้นองค์ประกอบแรกของแถว

span { 
 display:inline-block;
 width:100px;
 background:blue;
 font-size:30px;
 color:white; 
 text-align:center;
 margin-left:-5px;
}
span:first-child{
 margin:0px;
}

0

ทุกคำถามที่พยายามลบช่องว่างระหว่างinline-blocks ดูเหมือนจะเป็น<table>ฉัน ...

ลองสิ่งนี้:

p {
  display: table;
}
span {
  width: 100px;
  border: 1px solid silver; /* added for visualization only*/
  display: table-cell;
}
<p>
  <span> Foo </span>
  <span> Bar </span>
</p>

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