Додайте простір між елементами HTML лише за допомогою CSS


105

У мене є декілька однакових елементів 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

Я не хочу використовувати JavaScript

Необов'язкова вимога: останній проміжок може бути НЕ ОСТАНОЙ ДИТИКОМИ батьківського тегу, але це буде ОСТАННЯ СПАНА батьківського тегу. Інші теги між прольотами не мають.


Можливо, вам варто подумати про використання таблиці. Залежить від того, які дані потрапляють уtext
Привид

Чи spanзмінна кількість s?
тридцятьдот

@ Останнім засобом правди повинні бути таблиці.
Тім Джойс

Ці spanелементи створюються веб - служби не мають доступу. Тому я не можу змінити розмітку. Однак я можу повністю використовувати CSS
Dan

З такими питаннями ви завжди повинні вказувати потрібну вам підтримку браузера. "Мені потрібна підтримка IE7", я отримаю зовсім інші відповіді на "Я лише використовую Chrome".
тридцятьдот

Відповіді:


244

Хороший спосіб зробити це:

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

Кожен, який spanпередує span(таким чином, кожен, spanкрім першого), матиме margin-left: 10px.

Ось більш детальна відповідь на подібне запитання: роздільники між елементами без злому


10
Це приємне рішення, хоча якщо ваш контейнер перекинеться на кілька рядків, він вийде з ладу.
Савас Ведова

Він також працює з класами, як це:.sidebar-img + .sidebar-text { margin-left: 40px; }
розбір

2
Як ви поводитесь, коли елементи переходять у наступний рядок?
thoan

@thdoan: Це залежить від вашого розташування, і т.д. Ви можете спробувати що - щось на зразок цього .
тридцятьдот

1
Я віддаю перевагу рішення Reddtoric, використовуючи сітку та сітку-проміжок.
Олексій Саломон

29

Просто використовуйте запас або підкладку.

У вашому конкретному випадку ви можете використовувати margin:0 10pxлише на 2-му <span>.

ОНОВЛЕННЯ

Ось приємне рішення 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.


У вас є чудова відповідь, Сімоне, але ви можете, будь ласка, вирішити питання, не вказуючи останнього spanвручну? Це має бути завданням CSS
Dan

це безкористувальний хак, це властивість "інтервал між словами" для: w3schools.com/cssref/pr_text_word-spacing.asp перевірити відповідь Бена
arieljuod

ОП хотів простір між прольотами, тому нормально давати рішення для вбудованих елементів, властивості поля / padding / first / last тут не потрібні і лише додають складності
arieljuod

Насправді, ОП заявив, що він буде використовувати 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. ~є загальним селектором, де не потрібно безпосередньо слідувати іншому.
Ерік

10

Ви можете скористатися тим, що spanє вбудованим елементом

span{
     word-spacing:10px;
}

Однак це рішення буде порушено, якщо у вас є більше одного тексту тексту



3

Ви можете написати так:

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

2

<span>є вбудованим елементом, тому ви не можете робити інтервали на них, не роблячи його рівнем блоку. Спробуйте це

Горизонтальний

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

Вертикальний

span{
    margin-bottom: 10px;
}

Сумісний із усіма браузерами.


2

Ви повинні загортати елементи в контейнер, а потім використовувати нові функції CSS3, такі як css grid , безкоштовний курс , а потім використовувати 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
@Dan це насправді чудово, всі кілька браузерів останніх років охоплені. Але мушу визнати, що рішення yzoja ще розумніше :)
jalooc

Це рішення є кращим у конкретному випадку, якщо ви також збираєтеся включати межі між елементами як роздільники (наприклад, наприклад, UL у nav, наприклад, UL), оскільки воно належним чином розмістить кордон посередині інтервалу.
Мир

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

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

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
Хоча цей код може відповісти на питання, надаючи додатковий контекст стосовно того, чому та / або як цей код відповідає на питання, покращує його довгострокове значення.
β.εηοιτ.βε
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.