Перехід до нового рядка з вбудованим блоком?


75

Я хочу видалити <br />'s і зробити лінії розриву через CSS. Якщо я зміню display:blockрозмах на ширину, вона піде на 100%, і мені потрібно, щоб ширина була точно такою ж довжиною тексту, як зараз. Будь-які пропозиції?

<div class="fullscreen">
    <p class="text">
        <span class="medium">We</span> <br />
        <span class="large">build</span> <br />
        <span class="medium">the</span> <br />
        <span class="large">Internet</span>
    </p>
</div>

.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.fullscreen .large {  font-size:80px }

Скрипка



1
=ARRAYFORMULA(UNIQUE(TEXT(INDIRECT("A1:A"&COUNTA(A1:A)), "mmm-yyyy")))- i.stack.imgur.com/lvbzL.png
гравець0

@ Player0 спасибі чувак
те ж саме

Відповіді:


119

Видаліть усі brтеги та використовуйте display: table.

.text span {
   background: rgba(165, 220, 79, 0.8);
   display: table;
   padding: 7px 10px;
   color: white;
}
.fullscreen .large { font-size: 80px }

Пояснення: Таблиця за замовчуванням обертає ширину свого вмісту, не встановлюючи ширини, але все ще є елементом рівня блоку. Ви можете отримати таку ж поведінку, встановивши ширину для інших елементів рівня блоку:

<span style="display:block;border:1px solid red;width:100px;">Like a default table.</span>
<code>null</code>

Зверніть увагу, що <code>елемент не тече в рядку так, <span>як це було б зазвичай. Перевірте це за допомогою обчислених стилів у ваших інструментах розробника. Ви побачите псевдополе праворуч від <span>. У будь-якому випадку, це те саме, що і таблиця, але таблиця має додаткову перевагу, завжди формуючи ширину свого вмісту.


8
Я думаю, що ця відповідь є більш актуальною, ніж прийнята відповідь. display: table діє як елемент вбудованого блоку, оскільки є таким же широким, як і вміст, який він містить, але також діє як елемент блоку, додаючи розрив рядка перед AND після елемента. Плаваючі символи не додають розрив рядка після елемента.
Паскалькулятор

також корисно додати кордон-згортання: окремо; мати прокладку
arekk

5
display: table;несе поведінку за межами рядка, що, ймовірно, призведе до порушення css Я знаю heightі widthне працюватиму
robisrob

4
Ця відповідь допомогла б отримати додаткові пояснення.
Пол Руні,

1
@PaulRooney Просто додав пояснення до свого запитання.
трохи менше

37

використовувати float: left;іclear: left;

http://jsfiddle.net/rtM6J/

.text span {
   background: rgba(165, 220, 79, 0.8);
   float: left;
   clear: left;
   padding: 7px 10px;
   color: #fff;
}

1
оскільки inline-block не дозволяє операційній програмі досягти того, що він хоче, float: left все ще робить те, для чого використовував inline-block (зробіть, щоб елемент обернув текст, а не на всю ширину). Я міг залишити display: inline-block, але float: left також невидимо встановлює display для блокування, чистіший код краще, ніж захаращений. Я припускаю, ви цього не знали, тому ви вирішили проголосувати проти. Зрештою, моя відповідь - це одна з можливих правильних відповідей (я впевнений, що є й інші способи цього досягти), і вона не відповідає індексації google ...
Лука

1
будь-які плаваючі набори для відображення: блок. Ось чому я думаю, що використання float тут, коли запитують про вбудований блок, є оманливим. Протиголосник під час його пошуку отримав високий рейтинг, проте не був корисним. Я думав, що мій попередній коментар це пояснив. Вибачте, якщо це було незрозуміло.
hakre

1
@hakre - це не зовсім правильно. Оскільки вони вже не в одному потоці з батьківським, ширина блоків згортається так, ніби вони відображаються: inline-block, що насправді є всім, що хоче OP. Це добре працювало для мене, вирішуючи ту ж проблему.
Дон МакКерді,

1
@Luca Також може бути варто зазначити, що вам може знадобитися чітке виправлення на батьківському інтервалі, наприклад .text { clear: left; overflow: auto; }.
Дон МакКерді,

13

Встановіть елементи display: inlineта використовуйте :after:

.text span { display: inline }
.break-after:after { content: '\A'; white-space:pre; }

і додайте клас у ваші html-інтервали:

<span class="medium break-after">We</span>

1
Потрібно було відрегулювати висоту лінії, щоб подолати певне перекриття ..., але добре зробив роботу
dj.cowan

Приємна відповідь. Це була єдина відповідь, яка спрацювала для мене у моїй конкретній ситуації.
wp-overwatch.com

Це найкраща відповідь, оскільки вона не порушує жодного стилю для вбудованого інтервалу (наприклад, border-bottom)
lueenavarro

9

Я думаю, що найкращий спосіб зробити це станом на 2018 рік - використовувати flexbox.

.text {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
/* same as original below */
.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.fullscreen .large {  font-size:80px }
<div class="fullscreen">
    <p class="text">
        <span class="medium">We</span> 
        <span class="large">build</span> 
        <span class="medium">the</span> 
        <span class="large">Internet</span>
    </p>
</div>


Найкраще працював для мене. Мені потрібно було вирівняти елементи зліва, по центру чи справа. Отже, я міг би використовувати align-items: flex-start, align-items: center& align-items: flex-end.
Рехмат

8

Ось ще одне рішення (перераховані лише відповідні декларації):

.text span {
   display:inline-block;
   margin-right:100%;
}

Коли поле виражається у відсотках, цей відсоток береться з ширини батьківського вузла, тому 100% означає ширину батьківського вузла, що призводить до того, що наступний елемент буде "висунутий" до нового рядка.


Не частина відповіді, але я вважав, що якесь пояснення буде доречним. Я хотів стилізувати <pre>блоки так, щоб вони мали межі, були лише такими широкими, як вміст, але не ширшими за батьківський вузол, і кожен з’являвся в новому рядку. З різних причин (я можу пояснити, якщо хтось зацікавлений), жодне з попередніх рішень не було задовільним у моєму випадку, тому я придумав своє. Це добре виглядає, коли батьківський вузол має обмежену ширину і overflow: visible; інакше це може призвести до непотрібної горизонтальної смуги прокрутки або порожнього місця.
ultracrepidarian

3

Я думаю, що плаваючі для вас тут можуть працювати найкраще, якщо ви не хочете, щоб елемент займав цілий рядок, плаваючий, що залишився, повинен працювати.

.text span {
       background:rgba(165, 220, 79, 0.8);
       float: left;
       clear: left;
       padding:7px 10px;
       color:white;
    }

Примітка: Видаліть <br/>'s перед використанням цього курсу.


2

Якщо ви в порядку з тим, що не використовуєте <p>s (лише <div>s і <span>s), це рішення може навіть дозволити вам вирівняти ваш inline-blocks-центр або праворуч, якщо хочете (або просто тримати їх ліворуч, як ви спочатку просили). Незважаючи на те, що рішення все ще може працювати з <p>s, я не думаю, що отриманий HTML-код буде цілком правильним , але це все одно залежить від вас.

Фокус полягає в тому, щоб обернути кожну з ваших <span>s відповідними <div>. Таким чином ми скористаємось розривом рядка, спричиненим символом <div>' display: block(за замовчуванням), зберігаючи при цьому візуальне зелене поле жорстким до меж тексту (з вашою display: inline-blockдекларацією).

.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.large {  font-size:80px }
<div class="text">
  <div><span class="medium">We</span></div>
  <div><span class="large">build</span></div>
  <div><span class="medium">the</span></div>
  <div><span class="large">Internet</span></div>
</div>


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.