Làm cách nào để xóa khoảng trắng giữa các thành phần nội tuyến / khối nội tuyến?


1067

Đưa ra HTML và CSS này:

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

Kết quả là, sẽ có một không gian rộng 4 pixel giữa các phần tử SPAN.

Bản trình diễn: http://jsfiddle.net/dGHFV/

Tôi hiểu lý do tại sao điều này xảy ra và tôi cũng biết rằng tôi có thể thoát khỏi không gian đó bằng cách xóa khoảng trắng giữa các thành phần SPAN trong mã nguồn HTML, như vậy:

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

Tuy nhiên, tôi đã hy vọng một giải pháp CSS không yêu cầu mã nguồn HTML bị giả mạo.

Tôi biết cách giải quyết vấn đề này bằng JavaScript - bằng cách loại bỏ các nút văn bản khỏi thành phần chứa (đoạn văn), như vậy:

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

Bản trình diễn: http://jsfiddle.net/dGHFV/1/

Nhưng vấn đề này có thể được giải quyết chỉ với CSS không?


Xem câu trả lời của tôi trong câu hỏi này để biết đầy đủ các tùy chọn có liên quan ngay bây giờ: stackoverflow.com/questions/14630061/
mẹo


Câu trả lời:


1006

Vì câu trả lời này đã trở nên khá phổ biến, tôi viết lại nó một cách đáng kể.

Chúng ta đừng quên câu hỏi thực tế đã được hỏi:

Làm thế nào để loại bỏ không gian giữa các yếu tố khối nội tuyến ? Tôi đã hy vọng một giải pháp CSS không yêu cầu mã nguồn HTML bị giả mạo. Vấn đề này có thể được giải quyết chỉ với CSS không?

Đó khả năng để giải quyết vấn đề này với một mình CSS, nhưng không có hoàn toàn sửa CSS mạnh mẽ.

Giải pháp tôi có trong câu trả lời ban đầu của mình là thêm font-size: 0vào phần tử cha mẹ, và sau đó khai báo một điều hợp lý font-sizevới con cái.

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

Điều này hoạt động trong các phiên bản gần đây của tất cả các trình duyệt hiện đại. Nó hoạt động trong IE8. Nó không làm việc trong Safari 5, nhưng nó không làm việc trong Safari 6. Safari 5 là gần một trình duyệt chết ( 0,33%, tháng 8 năm 2015 ).

Hầu hết các vấn đề có thể xảy ra với kích thước phông chữ tương đối không phức tạp để khắc phục.

Tuy nhiên, mặc dù đây là một giải pháp hợp lý nếu bạn đặc biệt chỉ cần sửa CSS, nhưng đó không phải là điều tôi khuyên nếu bạn có thể tự do thay đổi HTML của mình (như hầu hết chúng ta đều như vậy).


Đây là những gì tôi, với tư cách là một nhà phát triển web có kinh nghiệm hợp lý, thực sự làm để giải quyết vấn đề này:

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

Vâng đúng vậy. Tôi xóa khoảng trắng trong HTML giữa các thành phần khối nội tuyến.

Dễ thôi. Thật đơn giản. Nó hoạt động ở khắp mọi nơi. Đó là giải pháp thực dụng.

Đôi khi bạn phải xem xét cẩn thận khoảng trắng sẽ đến từ đâu. Sẽ nối thêm một phần tử khác với JavaScript thêm khoảng trắng? Không, không nếu bạn làm điều đó đúng.

Chúng ta hãy thực hiện một hành trình kỳ diệu theo nhiều cách khác nhau để xóa khoảng trắng, với một số HTML mới:

<ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>
  • Bạn có thể làm điều này, như tôi thường làm:

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

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

  • Hoặc, cái này:

    <ul>
        <li>Item 1</li
        ><li>Item 2</li
        ><li>Item 3</li>
    </ul>
    
  • Hoặc, sử dụng nhận xét:

    <ul>
        <li>Item 1</li><!--
        --><li>Item 2</li><!--
        --><li>Item 3</li>
    </ul>
    
  • Hoặc, nếu bạn đang sử dụng PHP hoặc tương tự:

    <ul>
        <li>Item 1</li><?
        ?><li>Item 2</li><?
        ?><li>Item 3</li>
    </ul>
    
  • Hoặc, bạn thậm chí có thể bỏ qua hoàn toàn các thẻ đóng nhất định (tất cả các trình duyệt đều ổn với điều này):

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

Bây giờ tôi đã đi và chán bạn đến chết với "một ngàn cách khác nhau để xóa khoảng trắng, bằng ba mươi phút", hy vọng bạn đã quên tất cả font-size: 0.


Ngoài ra, giờ đây bạn có thể sử dụng flexbox để đạt được nhiều bố cục mà trước đây bạn có thể đã sử dụng khối nội tuyến cho: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


7
Nó hoạt động trong FF3.6, IE9RC, O11, Ch9. Tuy nhiên, trong Safari 5 vẫn còn một khoảng cách rộng 1px:(
Vidime Vidas

7
@thentydot Bạn có thể kiểm tra bình luận của câu trả lời này . Rốt cuộc có thể là font-size:0mánh khóe này không phải là một ý tưởng hay ...
Šime Vidas

25
Tôi biết người đăng đang tìm kiếm một giải pháp CSS, nhưng giải pháp này - được bình chọn nhiều nhất (30 phiếu so với 5 khi tôi viết bài này) - có tác dụng phụ mạnh mẽ và thậm chí không hoạt động trên trình duyệt chéo. Tại thời điểm này, thực tế hơn là chỉ cần loại bỏ khoảng trắng có vấn đề trong HTML của bạn.
Steph Thirion

10
giải pháp này chỉ hoạt động nếu bạn không làm việc với EM cho kích thước thùng chứa của mình
meo

6
Điều này phá vỡ các yếu tố con với kích thước phông chữ tương đối.
Daniel

156

Đối với các trình duyệt tuân thủ CSS3, có white-space-collapsing:discard

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


Bạn có muốn sử dụng trim-innerhơn discardkhông?
spb

49
Điều này đã bị xóa khỏi Văn bản cấp 3, nhưng Văn bản cấp 4 thì có . Đó là năm 2016 và vẫn chưa có hỗ trợ. text-space-collapse:discard
Oriol

1
@MrLister: Các giải pháp khác không hoạt động trong mọi trường hợp. Ví dụ: tôi không biết về bất kỳ giải pháp nào sẽ loại bỏ khoảng trống ở đó <p>A long text...</p>, nơi các thẻ mở và đóng nằm trên các dòng riêng biệt hơn nội dung văn bản. Đó là điều tôi luôn làm để giữ cho các tệp HTML của mình gọn gàng và dễ đọc hơn.
Robert Kusznier

@Robertfloat
Mr Lister

@MrLister Floating thực sự loại bỏ không gian dấu, nhưng có tác dụng phụ nghiêm trọng - thay đổi hoàn toàn vị trí của thành phần trong bố cục của bộ chứa. Làm thế nào để tôi làm điều đó, khi nổi một phần tử phá hủy bố cục của tôi (thường là trường hợp)?
Robert Kusznier

94

BIÊN TẬP:

ngày nay, chúng ta chỉ nên sử dụng Flexbox .


TRẢ LỜI:

OK, mặc dù tôi đã đưa ra cả câu trả lời font-size: 0;not implemented CSS3 featurecâu trả lời, sau khi thử tôi phát hiện ra rằng không ai trong số chúng là giải pháp thực sự .

Trên thực tế, thậm chí không có một cách giải quyết nào mà không có tác dụng phụ mạnh.

Sau đó, tôi quyết định xóa khoảng trắng (câu trả lời này là về đối số này) giữa các inline-blockdiv khỏi HTMLnguồn của tôi ( JSP), biến điều này:

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

đến đây

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

đó là xấu xí, nhưng làm việc

Nhưng, chờ một phút ... những gì nếu tôi là tạo ra divs của tôi bên trong Taglibs loops( Struts2, JSTL, vv ...)?

Ví dụ:

<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>

Hoàn toàn không thể nghĩ đến nội tuyến tất cả những thứ đó, nó có nghĩa là

<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>

điều đó không thể đọc được, khó để hiểu và hiểu, v.v ...

Giải pháp tôi tìm thấy:

sử dụng các nhận xét HTML để kết nối phần cuối của một div với phần đầu của phần tiếp theo!

<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>

Bằng cách này, bạn sẽ có một mã thụt lề có thể đọc và chính xác.

Và, như một tác dụng phụ tích cực HTML source, mặc dù bị nhiễm bởi các bình luận trống rỗng, sẽ dẫn đến thụt lề chính xác;

hãy lấy ví dụ đầu tiên. Theo ý kiến ​​khiêm tốn của tôi, điều này:

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

tốt hơn thế này:

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

1
Lưu ý rằng điều này cũng có thể phá vỡ chức năng gấp mã trong trình chỉnh sửa của bạn.
jknotek

44

Thêm ý kiến giữa các yếu tố để KHÔNG có một khoảng trắng. Đối với tôi nó dễ hơn là đặt lại kích thước phông chữ về 0 và sau đó đặt lại.

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

Đây là một hack chúng tôi không nên sử dụng vào năm 2020: sử dụng flexbox thay vì caniuse.com/#feat=flexbox
tonygatta

câu trả lời đã được viết vào năm 2013. Và trong khi flexbox không phải là câu trả lời cho câu hỏi này thì câu này cũng không hoạt động: stackoverflow.com/a/37512227/1019850
David

42

Tất cả các kỹ thuật loại bỏ không gian cho display:inline-blocklà hack khó chịu ...

Sử dụng Flexbox

Thật tuyệt vời, giải quyết tất cả các bs bố cục khối nội tuyến này và đến năm 2017 có 98% hỗ trợ trình duyệt (nhiều hơn nếu bạn không quan tâm đến IE cũ).


1
hack khó chịu có thể, nhưng kích thước phông chữ: 0 hoạt động trên 100% trình duyệt và áp dụng hiển thị: inline-flex vẫn không thoát khỏi khoảng trắng thừa, ngay cả trên trình duyệt hỗ trợ nó!
patrick

@patrick Flexbox chắc chắn giải quyết được vấn đề, bạn đang làm sai. inline-flex không có nghĩa là hiển thị các mục flex nội tuyến - nó chỉ áp dụng cho các container. Xem stackoverflow.com/a/27459133/165673
Yarin

7
"cỡ chữ: 0" không hoạt động trên 100% trình duyệt. (cài đặt trình duyệt kích thước phông chữ tối thiểu). Và câu trả lời này thực sự tốt.
ViliusL

35

Thêm vào display: flex;phần tử cha. Đây là giải pháp có tiền tố:

Phiên bản đơn giản hóa

p {
  display: flex;
}

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


Khắc phục bằng tiền tố

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
Đó là một câu trả lời tuyệt vời! Mặc dù vậy, tôi nghĩ sẽ rất gọn gàng khi đặt phiên bản đơn giản hóa lên hàng đầu, để đó là điều đầu tiên người đọc nhìn thấy. Hoặc thậm chí có thể loại bỏ phiên bản không đơn giản hóa.
Stefnotch

1
@Stefnotch Xong ✅ Cảm ơn lời đề nghị có giá trị của bạn :-)

31

Đây là cùng một câu trả lời tôi đã đưa ra về liên quan: Hiển thị: Khối nội tuyến - Không gian đó là gì?

Thực sự có một cách thực sự đơn giản để loại bỏ khoảng trắng khỏi khối nội tuyến vừa dễ dàng vừa có ngữ nghĩa. Nó được gọi là phông chữ tùy chỉnh với khoảng trắng có độ rộng bằng 0, cho phép bạn thu gọn khoảng trắng (được trình duyệt thêm vào cho các thành phần nội tuyến khi chúng nằm trên các dòng riêng biệt) ở cấp độ phông chữ sử dụng phông chữ rất nhỏ. Khi bạn khai báo phông chữ, bạn chỉ cần thay đổi font-familytrên container và trở lại trên trẻ em và voila. Như thế này:

@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;
}

Phù hợp với khẩu vị. Đây là một bản tải xuống cho phông chữ tôi vừa nấu trong font-forge và được chuyển đổi với trình tạo webfont FontSquirrel. Mất tất cả 5 phút. @font-faceKhai báo css được bao gồm: phông chữ không gian có độ rộng bằng không được nén . Nó có trong Google Drive, vì vậy bạn sẽ cần nhấp vào Tệp> Tải xuống để lưu nó vào máy tính của mình. Có lẽ bạn cũng cần thay đổi đường dẫn phông chữ nếu bạn sao chép khai báo vào tệp css chính của mình.


1
Tôi thấy bạn đăng bài này trong CSS Tricks tôi nghĩ, và đối với tôi đây là một câu trả lời tuyệt vời . Đó là trọng lượng nhẹ, dễ thực hiện và trình duyệt chéo (cho đến nay các thử nghiệm của tôi đã cho thấy). Tôi đã hoàn toàn làm việc với flexbox cho đến khi tôi nhận ra rằng Firefox sẽ không hỗ trợ flex-wrapcho đến khi ít nhất là v28 (srsly ? ), Nhưng đây là một dự phòng hoàn hảo cho đến lúc đó.
indextwo

16
Đây là trường hợp tồi tệ nhất mà tôi thấy trong một thời gian dài. Tải xuống toàn bộ phông chữ chỉ để xóa một khoảng trắng? Trời ạ.
Ông Lister

3
@MrLister bạn có nhận ra rằng tập tin phông chữ đó là nhỏ không? Nó không lượn sóng bất kỳ glyphs bên trong. Tôi sẽ tranh luận để bao gồm nó được mã hóa base64 bằng mọi cách để chúng tôi cũng thoát khỏi yêu cầu.
Robert Koritnik

Điều này có lỗi tương tự như phông chữ biểu tượng, nghĩa là nó sẽ không hoạt động khi phông chữ Web bị chặn (ví dụ vì lý do băng thông hoặc bảo mật) hoặc bị ghi đè bởi phông chữ tùy chỉnh (ví dụ do nguyên nhân sức khỏe, chẳng hạn như chứng khó đọc, v.v.).
tomasz86

22

Hai tùy chọn khác dựa trên Mô-đun Văn bản CSS Cấp 3 (thay vì white-space-collapsing:discardđã bị loại khỏi dự thảo thông số kỹ thuật):

  • word-spacing: -100%;

Về lý thuyết, cần thực hiện chính xác những gì cần thiết - rút ngắn khoảng trắng giữa 'từ' bằng 100% chiều rộng ký tự khoảng trắng, tức là bằng không. Nhưng dường như không hoạt động ở bất cứ đâu, thật không may, và tính năng này được đánh dấu là 'có nguy cơ' (nó cũng có thể bị loại bỏ khỏi đặc điểm kỹ thuật).

  • word-spacing: -1ch;

Nó rút ngắn khoảng trắng giữa các từ bằng độ rộng của chữ số '0'. Trong một phông chữ đơn cách, nó phải chính xác bằng chiều rộng của ký tự khoảng trắng (và bất kỳ ký tự nào khác). Điều này hoạt động trong Firefox 10+, Chrome 27+ và gần như hoạt động trong Internet Explorer 9+.

Vĩ cầm


+1 cho khoảng cách từ, mặc dù -0,5ch là giá trị phù hợp, với văn bản -1ch không có khoảng trắng sẽ không thể đọc được, -0,5ch hoạt động giống như cỡ chữ: 0; với kích thước thiết lập rõ ràng tại các yếu tố văn bản. :)
Dennis98

6
@ Dennis98, -1ch chỉ hoạt động đối với phông chữ đơn cách (như Courier New), vì tất cả các ký tự của chúng có cùng chiều rộng, bao gồm ' ''0'. Trong các phông chữ không đơn cách, không có tỷ lệ ma thuật phù hợp giữa chiều rộng ' ''0'ký tự, vì vậy chkhông hữu ích chút nào.
Ilya Streltsyn

thay vì word-spacing, chúng ta có thể sử dụng letter-spacingvới giá trị âm lớn tùy ý như trong câu trả lời của tôi
S.Serpooshan

20

Thật không may, đó là năm 2019 và white-space-collapsevẫn chưa được thực hiện.

Trong khi đó, đưa ra yếu tố cha mẹ font-size: 0;và thiết lập font-sizecon cái. cái này cần phải dùng mẹo


16

Sử dụng flexbox và thực hiện dự phòng (từ các đề xuất ở trên) cho các trình duyệt cũ hơn:

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

13

Đơn giản:

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

Không cần phải chạm vào phần tử cha.

Chỉ có điều kiện ở đây: kích thước phông chữ của mục không được xác định (phải bằng kích thước phông chữ của cha mẹ).

0.25em là mặc định word-spacing

W3Schools - thuộc tính khoảng cách


0,25em không phải là "khoảng cách từ mặc định", đó là chiều rộng của ký tự khoảng trắng trong phông chữ Times New Roman chỉ là phông chữ mặc định trong một số HĐH phổ biến. Các phông chữ phổ biến khác như Helvetica thường có ký tự khoảng trắng rộng hơn, do đó, chỉ xóa 0,25em khỏi chúng sẽ không đủ để loại bỏ các khoảng trống.
Ilya Streltsyn

12

cỡ chữ: 0; có thể phức tạp hơn một chút để quản lý ...

Tôi nghĩ rằng các dòng sau đây là tốt hơn nhiều và có thể sử dụng lại nhiều hơn, và tiết kiệm thời gian hơn bất kỳ phương pháp nào khác. Cá nhân tôi sử dụng cái này:

.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;}

Sau đó, bạn có thể sử dụng nó như sau ...

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

Theo như tôi biết (tôi có thể sai) nhưng tất cả các trình duyệt đều hỗ trợ phương pháp này.

GIẢI THÍCH :

Điều này hoạt động (có thể -3px có thể tốt hơn) chính xác như bạn dự đoán nó sẽ hoạt động.

  • bạn sao chép và dán mã (một lần)
  • sau đó trên html của bạn chỉ cần sử dụng class="items"trên cha mẹ của mỗi khối nội tuyến.

Bạn sẽ KHÔNG cần phải quay lại css và thêm quy tắc css khác cho các khối nội tuyến mới của bạn.

Giải quyết hai vấn đề cùng một lúc.

Cũng lưu ý >(lớn hơn dấu) điều này có nghĩa là * / tất cả trẻ em phải là khối nội tuyến.

http://jsfiddle.net/fD5u3/

LƯU Ý: Tôi đã sửa đổi để phù hợp với kế thừa khoảng cách chữ cái khi một trình bao bọc có một trình bao bọc con.


thay vì -4pxcho letter-spacingđó có thể không đủ cho lớn font-kích thước ví dụ: xem fiddle này , chúng ta có thể sử dụng một giá trị lớn hơn như trong bài viết của tôi
S.Serpooshan

12

Mặc dù, về mặt kỹ thuật không phải là một câu trả lời cho câu hỏi: "Làm cách nào để xóa khoảng trắng giữa các thành phần khối nội tuyến?"

Bạn có thể thử giải pháp flexbox và áp dụng mã bên dưới và không gian sẽ bị xóa.

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

Bạn có thể tìm hiểu thêm về nó trên liên kết này: https://css-tricks.com/snippets/css/a-guide-to-flexbox/


Mặc dù về mặt kỹ thuật không phải là một câu trả lời cho "tôi có thể làm điều này với khối nội tuyến" thì đây dường như là một giải pháp tao nhã ...
Lucas

10

Tôi không chắc chắn nếu bạn muốn tạo hai nhịp màu xanh mà không có khoảng cách hoặc muốn xử lý khoảng trắng khác, nhưng nếu bạn muốn xóa khoảng cách:

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

    float: left;
}

Và thực hiện.


9

Nói chung, chúng tôi sử dụng các yếu tố như thế này trong các dòng khác nhau, nhưng trong trường hợp display:inline-blocksử dụng các thẻ trong cùng một dòng sẽ xóa khoảng trắng, nhưng trong một dòng khác thì không.

Một ví dụ với các thẻ trong một dòng khác nhau:

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

Ví dụ với các thẻ trong cùng một dòng

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


Một phương pháp hiệu quả khác là một công việc CSS đang sử dụng font-size:0cho phần tử cha và cung cấp cho font-sizephần tử con nhiều như bạn muốn.

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

Các phương pháp trên có thể không hoạt động ở đâu đó tùy thuộc vào toàn bộ ứng dụng, nhưng phương pháp cuối cùng là một giải pháp hoàn hảo cho tình huống này và có thể được sử dụng ở bất cứ đâu.


Một nhược điểm của phương pháp này là chúng ta cần biết và lặp lại kích thước phông chữ mặc định (ví dụ 14px) để đặt nó trở lại bình thường trong các phần tử con!
S.Serpoo Sơn

8

Tôi đã gặp vấn đề này ngay bây giờ và từ khi font-size:0;tôi phát hiện ra rằng trong Internet Explorer 7, vấn đề vẫn còn do Internet Explorer nghĩ rằng "Cỡ chữ 0?!?! WTF bạn có phải là người điên không?" - Vì vậy, trong trường hợp của tôi, tôi đã thiết lập lại CSS của Eric Meyer và với font-size:0.01em;tôi có sự khác biệt 1 pixel từ Internet Explorer 7 và Firefox 9, vì vậy, tôi nghĩ rằng đây có thể là một giải pháp.


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
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Xin vui lòng cố gắng không làm đông mã của bạn với các bình luận giải thích, điều này làm giảm khả năng đọc của cả mã và các giải thích!
Ashish Ahuja

Tôi đoán rằng floatdisplay:inline-blockđối với spans có nghĩa là dự phòng cho trường hợp nếu flexkhông được hỗ trợ, nhưng floatsẽ loại bỏ hiệu quả của hiệu quả inline-block, vì vậy cái sau có vẻ dư thừa.
Ilya Streltsyn

6

Gần đây tôi đã giải quyết vấn đề này và thay vì đặt cha mẹ font-size:0sau đó đặt con về giá trị hợp lý, tôi đã nhận được kết quả nhất quán bằng cách đặt thùng chứa cha mẹ letter-spacing:-.25emsau đó con quay lại letter-spacing:normal.

Trong một chủ đề thay thế, tôi thấy một nhà bình luận đề cập font-size:0không phải lúc nào cũng lý tưởng bởi vì mọi người có thể kiểm soát kích thước phông chữ tối thiểu trong trình duyệt của họ, phủ nhận hoàn toàn khả năng đặt kích thước phông chữ thành 0.

Sử dụng ems dường như hoạt động bất kể kích thước phông chữ được chỉ định là 100%, 15pt hay 36px.

http://cdpn.io/dKIjo


Trong Firefox cho Android, tôi thấy khoảng trống 1px giữa các hộp.
Vidime Vidas

5

Tôi nghĩ rằng có một phương pháp rất đơn giản / cũ cho phương pháp này được hỗ trợ bởi tất cả các trình duyệt ngay cả IE 6/7. Chúng ta có thể chỉ cần đặt letter-spacingthành một giá trị âm lớn trong phần gốc và sau đó đặt lại normalthành phần tử con:

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>


điều tương tự xảy ra ở đây bạn cần phải thiết lập letter-spacing:normaltrong tất cả các yếu tố con.
Gaurav Aggarwal

@GauravAggarwal nhưng letter-spacinglà 99,99% số lần normal. cỡ chữ không có giá trị cố định như vậy và phụ thuộc nhiều vào thiết kế. nó có thể là một giá trị nhỏ hoặc giá trị lớn dựa trên họ phông chữ và những thứ khác ... Tôi không bao giờ nhớ trong đời mình thấy / sử dụng một giá trị đặc biệt (khác 0 / bình thường) letter-spacing, vì vậy tôi nghĩ rằng nó an toàn hơn và choise tốt hơn
S.Serpooshan

tôi không đồng ý với điều này ... sử dụng khoảng cách chữ cái thành bình thường với tất cả các yếu tố và sử dụng cỡ chữ cũng vậy (Nếu cần) hoàn toàn không hữu ích vì bạn viết mã kép trong đó bạn cần thay đổi kích thước phông chữ. Sử dụng kích thước phông chữ sẽ không tạo mã kép và có thể được sử dụng o kích thước tiêu chuẩn và bất kỳ kích thước tùy chỉnh nào khác. Tôi đề nghị bạn làm google và kiểm tra sử dụng kích thước phông chữ là điều dễ chấp nhận nhất những ngày này. Giải pháp thay đổi theo thời gian :)
Gaurav Aggarwal

Tôi không thể hiểu ý của bạn là gì bởi "... và sử dụng cỡ chữ cũng vậy (Nếu cần) hoàn toàn không hữu ích vì bạn đang viết mã kép trong đó bạn cần thay đổi kích thước phông chữ." trong bài viết của tôi, không có cài đặt kích thước phông chữ! tất cả những gì tôi đã làm là khoảng cách chữ cái mà thường không ai đặt nó trong css của anh ấy (nó luôn luôn bình thường). Vì chúng tôi không thay đổi kích thước phông chữ, chúng tôi không cần biết kích thước phông chữ gốc để đặt lại
S.Serpooshan

Tôi cho rằng phương pháp này trước đây không trở nên phổ biến vì nó không hoạt động trong Opera / Presto. Và hiện tại chúng tôi có các tùy chọn khác không cần các workaroun như vậy, ví dụ như sử dụng Flexbox thay vì các khối nội tuyến.
Ilya Streltsyn


3

Với dấu ngoặc PHP:

ul li {
  display: inline-block;
}
    <ul>
        <li>
            <div>first</div>
        </li><?
        ?><li>
            <div>first</div>
        </li><?
        ?><li>
            <div>first</div>
        </li>
    </ul>


2

Tôi sẽ mở rộng câu trả lời của user5609829 một chút vì tôi tin rằng các giải pháp khác ở đây quá phức tạp / quá nhiều công việc. Áp dụng một margin-right: -4pxphần tử khối nội tuyến sẽ loại bỏ khoảng cách và được tất cả các trình duyệt hỗ trợ. Xem các fiddle cập nhật ở đây . Đối với những người quan tâm đến việc sử dụng lề âm, hãy thử đọc cái này .


4
Điều này sẽ không hoạt động nếu người dùng thay đổi kích thước phông chữ mặc định của trình duyệt của mình. Sử dụng tốt hơn -0,25em.
Martin Schneider

1

Đặc tả cấp 4 của Mô-đun văn bản CSS xác định một thuộctext-space-collapse tính, cho phép kiểm soát cách xử lý khoảng trắng bên trong và xung quanh một phần tử.

Vì vậy, liên quan đến ví dụ của bạn, bạn sẽ phải viết điều này:

p {
  text-space-collapse: discard;
}

Thật không may, chưa có trình duyệt nào đang triển khai thuộc tính này (kể từ tháng 9 năm 2016) như được đề cập trong các bình luận cho câu trả lời của HBP .


1

Tôi tìm thấy một giải pháp CSS thuần túy hoạt động tốt cho tôi trong tất cả các trình duyệt:

span {
    display: table-cell;
}

Câu hỏi này là về khối nội tuyến.
Madan Bhandari

@MadanBhandari đúng nhưng dường như loại bỏ sự cần thiết của tất cả các hack.
David

1

Thêm vào white-space: nowrapphần tử container:

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>

Đây là Plunker .


không hoạt động mà không có float - cái bị thiếu trong plunker của bạn. Vì vậy, "khoảng trắng: nowrap" dường như không bao giờ là một câu trả lời hiệu quả.
David

1

Có rất nhiều giải pháp như font-size:0, word-spacing, margin-left, letter-spacingvà vân vân.

Thông thường tôi thích sử dụng letter-spacing

  1. Có vẻ ổn khi chúng ta gán một giá trị lớn hơn chiều rộng của không gian thừa (ví dụ -1em).
  2. Tuy nhiên, nó sẽ không ổn với word-spacingmargin-leftkhi chúng ta đặt giá trị lớn hơn như thế nào -1em.
  3. Sử dụng font-sizekhông thuận tiện khi chúng ta cố gắng sử dụng emnhư font-sizeđơn vị.

Vì vậy, letter-spacingdường như là sự lựa chọn tốt nhất.

Tuy nhiên, tôi phải cảnh báo bạn

khi bạn sử dụng letter-spacingbạn đã sử dụng tốt hơn -0.3emhoặc -0.31emkhông sử dụng người khác.

* {
  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>

Nếu bạn đang sử dụng Chrome (phiên bản thử nghiệm 66.0.3359.139) hoặc Opera (phiên bản thử nghiệm 53.0.2907.99), những gì bạn thấy có thể là:

nhập mô tả hình ảnh ở đây

Nếu bạn đang sử dụng Firefox (60.0.2), IE10 hoặc Edge, những gì bạn thấy có thể là:

nhập mô tả hình ảnh ở đây

Nó thật thú vị. Vì vậy, tôi đã kiểm tra khoảng cách chữ cái và tìm thấy nó:

chiều dài

Chỉ định không gian liên ký tự bổ sung ngoài không gian mặc định giữa các ký tự. Các giá trị có thể âm, nhưng có thể có các giới hạn cụ thể thực hiện. Tác nhân người dùng không được tăng hoặc giảm thêm không gian giữa các ký tự để chứng minh văn bản.

Có vẻ như đây là lý do.


1

Thêm letter-spacing:-4px;vào pcss cha và thêm letter-spacing:0px;vào spancss của bạn .

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

Tôi nghĩ rằng tôi đã thêm một cái gì đó mới vào câu hỏi này vì mặc dù nhiều câu trả lời hiện được cung cấp không đầy đủ và phù hợp, có một số thuộc tính CSS mới có thể đạt được đầu ra rất rõ ràng, với sự hỗ trợ đầy đủ trên tất cả các trình duyệt và ít không 'hack'. Điều này không di chuyển khỏi inline-blocknhưng nó mang lại cho bạn kết quả giống như câu hỏi được yêu cầu.

Các thuộc tính CSS này là grid

CSS Grid được hỗ trợ cao ( CanIUse ) ngoài IE chỉ cần -ms-tiền tố để cho phép nó hoạt động.

CSS Lưới cũng là rất linh hoạt và có tất cả các phần tốt từ table, flexinline-blockcác yếu tố và đưa chúng vào một nơi.

Khi tạo một gridbạn có thể chỉ định các khoảng trống giữa các hàng và cột. Khoảng cách mặc định đã được đặt thành 0pxnhưng bạn có thể thay đổi giá trị này thành bất cứ điều gì bạn thích.

Để cắt ngắn một chút, đây là một ví dụ hoạt động có liên quan:

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>


Chỉ cần bình luận để chỉ ra nội dung của một display:gridphần tử bị chặn, vì vậy nó không hiển thị nhiều như vậy: lưới giúp bạn làm việc với bố cục khối nội tuyến, nhưng nó cho phép bạn thay thế làm việc inline-blockvới thứ gì đó mà bạn có thể điều khiển 'máng xối' như Câu hỏi này muốn. Ngoài ra, tôi thực sự ngạc nhiên khi chưa có ai phản hồi với giải pháp CSS Grid Layout trước đây.
TylerH

Sẽ làm cho nó rõ ràng hơn đây là một sự thay đổi từ inline-block. Và vâng, tôi cũng rất ngạc nhiên, đoán rằng không ai có gridkinh nghiệm thực sự đã đến với điều này trước đây. Đã chơi xung quanh với nó một chút và bắt gặp câu hỏi này vì vậy hãy nghĩ tại sao không: P
Stewartside

0

Một cách khác mà tôi tìm thấy là áp dụng lề trái làm giá trị âm trừ phần tử đầu tiên của hàng.

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

Mỗi câu hỏi, cố gắng loại bỏ khoảng cách giữa inline-blockcác s có vẻ như <table>đối với tôi ...

Hãy thử một cái gì đó như thế này:

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.