Chỉ thêm khoảng cách giữa các phần tử HTML bằng CSS


105

Tôi có một số phần tử HTML giống nhau nối tiếp nhau:

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

Tôi đang tìm cách tốt nhất để thêm không gian GIỮA các phần tử chỉ sử dụng CSS

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

Ngoài ra:

  • Vui lòng ghi lại khả năng tương thích với trình duyệt của biên nhận của bạn

CẬP NHẬT

Có vẻ như tôi đã không rõ ràng. Tôi không muốn sử dụng BẤT KỲ TIẾP THỊ HTML BỔ SUNG nào như

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

Tôi không muốn sử dụng bảng

Tôi muốn khoảng đầu tiên và khoảng cuối cùng được CSS nhắm mục tiêu tự động

Tôi không muốn sử dụng javascript

Yêu cầu tùy chọn: khoảng cuối không thể là CON CUỐI CÙNG của thẻ mẹ, nhưng nó sẽ là GIẢI CUỐI CÙNG của thẻ mẹ. Các nhịp không có bất kỳ thẻ nào khác giữa chúng.


Có lẽ bạn nên xem xét sử dụng một cái bàn. Phụ thuộc vào những gì dữ liệu đi vàotext
ma của Madara

Số lượng spans là biến?
ba mươi

Phương sách cuối cùng của @Truth phải là các bảng.
Tim Joyce

Các spanphần tử được tạo bởi dịch vụ web mà tôi không có quyền truy cập. Vì vậy, tôi không thể thay đổi đánh dấu. Tuy nhiên, tôi hoàn toàn có thể sử dụng CSS
Dan

Với những câu hỏi như thế này, bạn phải luôn chỉ định hỗ trợ trình duyệt mà bạn yêu cầu. "Tôi cần hỗ trợ IE7" sẽ nhận được câu trả lời hoàn toàn khác với "Tôi chỉ sử dụng Chrome".
ba mươi

Câu trả lời:


244

Một cách tốt để làm điều đó là:

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

Mọi spanđứng trước a span(vì vậy, mọi spanngoại trừ đầu tiên) sẽ có margin-left: 10px.

Đây là câu trả lời chi tiết hơn cho một câu hỏi tương tự: Dấu phân cách giữa các phần tử không có hack


10
Đây là một giải pháp tốt, mặc dù nếu vùng chứa của bạn kéo dài đến nhiều dòng thì nó không thành công.
Savas Vedova

Nó cũng làm việc với các lớp học, như thế này:.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer

2
Làm thế nào để bạn xử lý khi các mục bọc đến dòng tiếp theo?
thdoan

@thdoan: Nó phụ thuộc vào bố cục của bạn, v.v. Bạn có thể thử một cái gì đó như thế này .
ba mươi

1
Tôi thích giải pháp của reddtoric bằng cách sử dụng lưới và khoảng cách lưới.
Alex Salomon

28

Chỉ cần sử dụng ký quỹ hoặc đệm.

Trong trường hợp cụ thể của bạn, bạn chỉ có thể sử dụng margin:0 10pxvào ngày 2 <span>.

CẬP NHẬT

Đây là một giải pháp CSS3 hay ( jsFiddle ):

span {
    margin: 0 10px;
}

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

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

Lựa chọn yếu tố nâng cao sử dụng bộ chọn thích :nth-child(), :last-child, :first-of-typevv được hỗ trợ kể từ khi Internet Explorer 9.


Bạn có một câu trả lời tuyệt vời, Simone, nhưng bạn có thể vui lòng giải quyết câu hỏi mà không chỉ định câu cuối cùng spantheo cách thủ công không? Đây phải là công việc của CSS
Dan

Làm rõ một chút cho những người phản đối: câu trả lời của @ ba mươidot thật tuyệt vời và tôi rất thích nó, nhưng nó mang lại một bổ sung margin-leftở câu cuối cùng span, đó không phải là chính xác những gì OP muốn.
Simone

đây là một hack unneded, đó là "word-khoảng cách" tài sản cho: w3schools.com/cssref/pr_text_word-spacing.asp kiểm tra câu trả lời của Ben
arieljuod

OP muốn khoảng cách giữa nhịp, vì vậy nó là ok để đưa ra một giải pháp cho các yếu tố nội tuyến, lề / đệm / đầu / tài sản cuối cùng không cần thiết ở đây và chỉ thêm phức tạp
arieljuod

Trên thực tế, OP nói rằng ông ấy sẽ sử dụng spans và divs (là các phần tử khối). Giải pháp của bạn là anyway hợp lệ nếu bạn định nghĩa divnhư là các yếu tố nội tuyến ...
Simone

16

thêm các quy tắc này vào vùng chứa mẹ:

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

Tham khảo tốt: https://cssreference.io/

Khả năng tương thích của trình duyệt: https://gridbyexample.com/b browser /


2
grid-auto-columns="max-content"cũng có thể hữu ích. Nó sẽ làm cho kích thước của mục lưới phù hợp với nội dung. Ngoài ra, khả năng tương thích trình duyệt không phải là một vấn đề nữa: caniuse.com/#feat=css-grid
Alex Salomon

Đây phải là câu trả lời được chấp nhận. Tôi biết nhận xét không phải để cảm ơn, tôi chỉ sử dụng màn hình 'flex' cho đến bây giờ, và thứ 'lưới' này làm cho mọi thứ trở nên thật dễ dàng từ chính vùng chứa mẹ! Để không khiến nó hoàn toàn vô dụng, hãy thêm tài liệu tham khảo sau đây sẽ giúp ích rất nhiều cho bất kỳ ai muốn tìm hiểu thêm: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar

11

Thật dễ dàng.

Bạn có thể tạo kiểu cho các phần tử bằng cách loại trừ phần tử đầu tiên, chỉ trong một dòng mã:

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

và thực hiện, không có thao tác của lớp.


1
Cái này hoạt động perfekt. span + span không hoạt động nhưng span ~ span hoạt động như một sự quyến rũ! Cảm ơn
juliusmh

Trong trường hợp của tôi, tôi có một số nhịp, một số trong số đó có thể không chứa lớp "Đang hiển thị", vì vậy những gì tôi cần là span.Showing ~ span.Showingthay thế span.Showing + span.Showing. ~là bộ chọn anh chị em chung, nơi một người không cần phải theo dõi trực tiếp người khác.
Eric

10

Bạn có thể tận dụng thực tế spanlà một phần tử nội tuyến

span{
     word-spacing:10px;
}

Tuy nhiên, giải pháp này sẽ bị phá vỡ nếu bạn có nhiều hơn một từ văn bản trong khoảng thời gian của mình



3

Bạn có thể viết như thế này:

span{
 margin-left:10px;
}
span:first-child{
 margin-left:0;
}

2

<span>là một phần tử nội dòng, vì vậy bạn không thể tạo khoảng cách trên chúng mà không làm cho nó ở mức khối. Thử cái này

Ngang

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

Theo chiều dọc

span{
    margin-bottom: 10px;
}

Tương thích với tất cả các trình duyệt.


2

Bạn nên bọc các phần tử của mình bên trong một vùng chứa, sau đó sử dụng các tính năng CSS3 mới như lưới css , khóa học miễn phí và sau đó sử dụng grid-gap:valuecác phần tử đã được tạo cho vấn đề cụ thể của bạn

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>


Tôi đang tìm cách thêm khoảng cách giữa các phần tử của một lớp div bằng cách sử dụng kiểu css. Tôi đã sử dụng ví dụ của bạn để xây dựng mã của tôi cho điều đó. Làm việc như người ở. Cảm ơn bạn!
Elias Est StatisticsEU

1

Hoặc, thay vì đặt lợi nhuận và ghi đè nó, bạn có thể đặt nó đúng cách ngay lập tức với kết hợp sau:

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

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

Câu trả lời tốt, hạn chế là sự hỗ trợ của trình duyệt :first-of-type:last-of-typecác bộ chọn CSS.
Dan

... cũng kiểm tra nothỗ trợ trình duyệt biểu thức
Dan

1
@Dan thực sự tuyệt vời, tất cả các trình duyệt năm ngoái đều được bảo hiểm. Nhưng tôi phải thừa nhận, giải pháp của yzoja mà thậm chí còn thông minh hơn :)
jalooc

Giải pháp này ưu việt hơn trong trường hợp cụ thể là bạn cũng sẽ bao gồm đường viền giữa các phần tử làm dấu phân cách (ví dụ như UL trong điều hướng), vì nó sẽ đặt đường viền chính xác ở giữa khoảng cách.
Mir

0
span.middle {
    margin: 0 10px 0 10px; /*top right bottom left */
}

<span>text</span> <span class="middle">text</span> <span>text</span>

0

Nếu bạn muốn căn chỉnh các mục khác nhau và bạn muốn có cùng lề xung quanh tất cả các cạnh, bạn có thể sử dụng cách sau. Mỗi phần tử trong đó container, bất kể loại nào, sẽ nhận được cùng một biên xung quanh.

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

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

Nếu bạn muốn căn chỉnh các mục trong một hàng, nhưng phần tử đầu tiên chạm vào cạnh ngoài cùng bên trái của containervà để tất cả các phần tử khác cách đều nhau, bạn có thể sử dụng điều này:

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

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

2
Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh liên quan đến lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
β.εηοιτ.βε Ngày
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.