Dodaj odstępy między elementami HTML tylko za pomocą CSS

105

Mam kilka takich samych elementów HTML idących jeden po drugim:

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

Szukam najlepszego sposobu na dodanie przestrzeni MIĘDZY elementami używając tylko CSS

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

Do tego:

  • Prosimy o zapisanie zgodności rachunków z przeglądarkami

AKTUALIZACJA

Wygląda na to, że nie było jasne. Nie chcę używać ŻADNEGO DODATKOWEGO ZNACZNIKA HTML, takiego jak

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

Nie chcę używać tabel

Chcę, aby pierwszy i ostatni zakres był automatycznie kierowany przez CSS

Nie chcę używać javascript

Wymaganie opcjonalne: ostatni zakres NIE może być OSTATNIM DZIECKIEM tagu nadrzędnego, ale będzie to OSTATNI PASIĘĆ tagu nadrzędnego. Przedziały nie mają między sobą żadnych innych tagów.

Dan
źródło
Może powinieneś rozważyć użycie stołu. Zależy od tego, jakie dane text
Madara's Ghost
Czy liczba spans jest zmienna?
trzydzieści kropek
@Truth ostatnią deską ratunku powinny być tabele.
Tim Joyce
Te spanelementy są generowane przez serwis WWW nie mam dostępu. Więc nie mogę zmienić znaczników. Jednak mogę w pełni korzystać z CSS
Dan,
W przypadku takich pytań należy zawsze określić wymaganą obsługę przeglądarki. „Potrzebuję obsługi IE7” spowoduje wyświetlenie zupełnie innych odpowiedzi na pytanie „Używam tylko przeglądarki Chrome”.
trzydzieści kropek

Odpowiedzi:

244

Oto dobry sposób:

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

Każdy spanpoprzedzony a span( a więc każdy spanoprócz pierwszego) będzie miał margin-left: 10px.

Oto bardziej szczegółowa odpowiedź na podobne pytanie: Separatory między elementami bez hacków

trzydzieści kropek
źródło
10
To fajne rozwiązanie, ale jeśli twój kontener będzie obejmował wiele wierszy, zawiedzie.
Savas Vedova
Działa również z klasami, takimi jak:.sidebar-img + .sidebar-text { margin-left: 40px; }
parsecer
2
Jak sobie radzisz z zawijaniem elementów do następnego wiersza?
thdoan
@thdoan: To zależy od twojej itp układ, można spróbować coś jak ten .
trzydzieści kropek
1
Wolę rozwiązanie reddtoric wykorzystujące grid i grid-gap.
Alex Salomon,
29

Po prostu użyj marginesu lub dopełnienia.

W twoim konkretnym przypadku możesz użyć margin:0 10pxtylko 2<span> .

AKTUALIZACJA

Oto fajne rozwiązanie CSS3 ( jsFiddle ):

span {
    margin: 0 10px;
}

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

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

Zaawansowany wybór elementu z użyciem selektorów podoba :nth-child(), :last-child, :first-of-typeitd jest obsługiwany od Internet Explorer 9.

Simone
źródło
Masz świetną odpowiedź, Simone, ale czy mógłbyś rozwiązać pytanie bez spanręcznego określania ostatniego ? Powinno to być zadaniem CSS
Dan,
to jest nieoczekiwany hack, to jest właściwość "odstępów między wyrazami" dla: w3schools.com/cssref/pr_text_word-spacing.asp sprawdź odpowiedź Bena
arieljuod
OP potrzebował odstępu między rozpiętościami, więc można podać rozwiązanie dla elementów wbudowanych, właściwości margin / padding / first / last nie są tutaj potrzebne i tylko zwiększają złożoność
arieljuod
Właściwie OP powiedział, że będzie używał span s i divs (które są elementami blokowymi). Twoje rozwiązanie i tak jest poprawne, jeśli zdefiniujesz divs jako elementy wbudowane ...
Simone,
16

dodaj te reguły do ​​kontenera nadrzędnego:

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

Dobre odniesienie: https://cssreference.io/

Zgodność z przeglądarkami: https://gridbyexample.com/browsers/

reddtoric
źródło
2
grid-auto-columns="max-content"może być również przydatne. Sprawi, że rozmiar elementu siatki będzie pasował do zawartości. Ponadto kompatybilność przeglądarek nie powinna już stanowić problemu: caniuse.com/#feat=css-grid
Alex Salomon,
To powinna być akceptowana odpowiedź. Wiem, że komentarze nie są na podziękowanie, do tej pory korzystałem tylko z ekranu „flex”, a ta „siatka” sprawia, że ​​wszystko jest takie proste z samego kontenera nadrzędnego! Aby nie pozostawić go całkowicie bezużytecznym, dodałbym następujące odniesienie, które bardzo pomaga każdemu, kto chce dowiedzieć się więcej: css-tricks.com/snippets/css/complete-guide-grid
Rohan Kumar
11

To takie proste.

Możesz stylizować elementy z wykluczeniem pierwszego, tylko w jednej linii kodu:

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

i gotowe, bez manipulacji klasami.

Angie
źródło
1
Ten działa perfekcyjnie. span + span nie działa, ale span ~ span działa jak urok! Dzięki
juliusmh
W moim przypadku mam kilka zakresów, z których niektóre mogą nie zawierać klasy „Wyświetlanie”, więc span.Showing ~ span.Showingzamiast tego potrzebuję span.Showing + span.Showing. ~to ogólny selektor rodzeństwa, w którym nie trzeba bezpośrednio podążać za drugim.
Eric
10

Możesz wykorzystać fakt, że spanjest to element inline

span{
     word-spacing:10px;
}

Jednak to rozwiązanie nie zadziała, jeśli masz więcej niż jedno słowo tekstu w swoim zakresie

Ben
źródło
6
span:not(:last-child) {
    margin-right: 10px;
}
Vladyslav Savchenko
źródło
3

Możesz napisać tak:

span{
 margin-left:10px;
}
span:first-child{
 margin-left:0;
}
Sandeep
źródło
2

<span>jest elementem liniowym, więc nie można robić na nich odstępów bez ustawiania poziomu blokowego. Spróbuj tego

Poziomy

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

Pionowy

span{
    margin-bottom: 10px;
}

Kompatybilny ze wszystkimi przeglądarkami.

Moe Sweet
źródło
2

Powinieneś zawinąć swoje elementy w kontener, a następnie użyć nowych funkcji CSS3, takich jak siatka css , darmowy kurs , a następnie użyj grid-gap:valuetego, który został stworzony dla twojego konkretnego problemu

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>

John Balvin Arias
źródło
Chciałem dodać odstępy między elementami klasy div przy użyciu stylu css. Użyłem twojego przykładu, aby zbudować swój kod. Działał jak urok. Dziękuję Ci!
Elias EstatisticsEU
1

Lub zamiast ustawiać margines i zamiast go zastępować, możesz po prostu ustawić go poprawnie od razu za pomocą następującej kombinacji:

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

span:not(:last-of-type) {
    margin-right: 5px;
}
jalooc
źródło
Dobra odpowiedź, ograniczeniem jest obsługa przeglądarek :first-of-typei :last-of-typeselektory CSS.
Dan
... sprawdź także notobsługę przeglądarki Expressions
Dan
1
@Dan, to naprawdę świetne, wszystkie przeglądarki z ostatnich lat są objęte gwarancją . Ale muszę przyznać, że rozwiązanie Yzoja jest jeszcze mądrzejsze :)
jalooc
To rozwiązanie jest lepsze w konkretnym przypadku, gdy zamierzasz również uwzględnić granice między elementami jako separatory (na przykład jak UL w nawigacji), ponieważ prawidłowo umieści granicę w środku odstępu.
Mir
0
span.middle {
    margin: 0 10px 0 10px; /*top right bottom left */
}

<span>text</span> <span class="middle">text</span> <span>text</span>
Tim Joyce
źródło
0

Jeśli chcesz wyrównać różne elementy i chcesz mieć taki sam margines ze wszystkich stron, możesz użyć następującego. Każdy element container, niezależnie od typu, otrzyma taki sam margines otaczający.

wprowadź opis obrazu tutaj

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

Jeśli chcesz wyrównać elementy w rzędzie, ale pierwszy element dotyka skrajnej lewej krawędzi container, a wszystkie pozostałe elementy są równomiernie rozmieszczone, możesz użyć tego:

wprowadź opis obrazu tutaj

.container {
  display: flex;
}
.container > :first-child {
  margin-right: 5px;
}
.container > *:not(:first-child) {
  margin: 5px;
}
Stefan Zhelyazkov
źródło
2
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
β.εηοιτ.βε