Як відключити рядок від css, не використовуючи <br />?


398

вихід:

Здравствуйте
Як справи

код:

<p>hello <br> How are you </p>

Як досягти такого ж виходу без <br>?

Відповіді:


385

Неможливо з однаковою структурою HTML, ви повинні мати щось для розрізнення між Helloі How are you.

Я пропоную використовувати spans, який ви будете відображати як блоки (як і <div>насправді).

p span {
  display: block;
}
<p><span>hello</span><span>How are you</span></p>


37
зауважте також, скільки додаткової надбавки існує - <br />елемент існує з дуже вагомої причини. Якщо ви хочете перервати рядки, оскільки вони є окремими абзацами, то просто позначте їх як окремі абзаци.
Rowland Shaw

8
Можливо, вам знадобляться структуровані рядки, не використовуючи фактично абзаци. Для розмітки вірша, пісні чи адреси, наприклад
Вінсент Роберт

2
@VincentRobert Правильно, але вірш є канонічним прикладом, коли <br>правильна розмітка. Проміжки для поеми були б "неправильними".
Алан Г.

8
Зауважте, що присвоєння елементів display: block до елемента примусить розрив рядка до і після, і так зовсім не те, що один розрив рядка.
Джерсібой

17
Однозначно використовуйте елементи <p>. Елемент <span> НЕ повинен перетворюватися на дисплей: блок, вся суть <span> полягає в тому, що він вбудований. Я зробив би це так: <div><p>hello</p> <p> Як справи </p> </div> CSS не потребує виграшів.
Майлз

353

Ви можете використовувати, white-space: pre;щоб елементи діяли так <pre>, що зберігає нові рядки. Приклад:

p {
  white-space: pre;
}
<p>hello 
How are you</p>

Зауважте для IE, що це працює лише в IE8 +.


133
часто краще, ніж preє pre-line, що дозволяє обгортати.
Алан Х.

14
Більше про відмінності між попередньою лінією та попередньою обробкою на веб-сайті developer.mozilla.org/en-US/docs/Web/CSS/white-space
патрік

1
Я віддав перевагу перед моїм випадком, тому що я також можу використовувати переповнення тексту
Грег,

Зауважте, що це не працюватиме з реагуванням, оскільки текст у підсумку буде поєднаний і буде розміщений у тому ж рядку, що не запустить white-spaceправило CSS.
Vadorequest

119

Використовуйте <br/>як звичайне, але ховайте йогоdisplay: none коли цього не хочете.

Я б очікував, що більшість людей, які знайшли це питання, хочуть використовувати css / чуйний дизайн, щоб вирішити, чи з’являється перерва рядків у певному місці. (і нічого не маю проти <br/>)

Хоча не відразу видно, ви можете застосувати display:noneдо <br/>тегу , щоб приховати його, що дозволяє використовувати запити засобів масової інформації в тандемі з семантичними мітками BR.

 <div>
   The quick brown fox<br />
   jumps over the lazy dog
 </div>

 @media screen and (min-width: 20em) 
 {
    br 
    { 
       display: none;   // hide the BR tag for wider screens (i.e. disable the line break)
    }
 }

Це корисно в адаптивному дизайні, коли вам потрібно зв'язати текст у два рядки при точному перерві.

http://jsfiddle.net/nNbD3/1/


5
Саймоне, ти помічаєш місце - приклад, який ти називаєш, є точною причиною, коли я досліджував це питання, і display: noneрішення, безумовно, є найбільш підходящим і корисним.
abbottjam

8
Зауважте, що для випадків, коли це призведе до того, щоб слова запускалися разом, ви можете використовувати щось на зразок display: inline-block; width: 1em;замість none.
Beejor

2
Ви навіть можете застосувати клас до того, <br class='foo'>якщо вам потрібен більше контроль, але не ходіть занадто божевільним!
Simon_Weaver

Ще одне "чому я не придумав цього ?!" відповідь. <br/>чудово підходить до того, що робить; не потрібно винаходити колесо. Дякую!
rinogo

Аналогічна концепція може бути застосована до розведення гнучкого ящика: stackoverflow.com/questions/29732575 / ...
Simon_Weaver

106

Існує кілька варіантів визначення керованості пробілами та розривів ліній. Якщо можна помістити вміст, наприклад, a<p> Тег, то отримати його дуже легко.

Для збереження розривів рядків, але не пробілів, використовуйте pre-line(не pre), як у:

<style>
 p {
     white-space: pre-line; /* collapse WS, preserve LB */
   }
</style>

<p>hello
How are you</p>

Якщо потрібна інша поведінка, виберіть один із них (WS = WhiteSpace, LB = LineBreak):

     white-space: normal;   /* collapse WS, wrap as necessary, collapse LB */
     white-space: nowrap;   /* collapse WS, no wrapping,       collapse LB */
     white-space: pre;      /* preserve WS, no wrapping,       preserve LB */
     white-space: pre-wrap; /* preserve WS, wrap as necessary, preserve LB */
     white-space: inherit;  /* all as parent element */

ДЖЕРЕЛ: W3 Schools


4
досконалий. повинна бути обраною відповіддю.
Бен Лін

1
Я вважаю, що саме це шукає ОП.
Джон Сардінья

64

Команда "\ a" в CSS генерує повернення каретки. Це CSS, а не HTML, тому він повинен бути ближчим до того, що потрібно: без зайвої розмітки .

У блок-котировці наведений нижче приклад відображає заголовок та джерело посилання та розділяє два з поверненням каретки ( "\a"):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}

Фантазії, але абсолютно непотрібні для того, про що було питання.
YePhIcK

15
+1, оскільки лише його CSS, і не рекомендує використовувати теги pre, br, а також не змінювати режим відображення для блокування (що додає різну поведінку, може зламатися, якщо батько знаходиться, display:flexі, отже, хак в цьому контексті). Дійсно, це не просто сучасна техніка. Якщо ви хочете точно такої розмітки, але насправді реагувати інакше, це шлях.
перегляньте

Блискуча ідея. Зверніть увагу: "- не використовуйте простих лапок, 'оскільки ви хочете дозволити \aрозбиратися як спеціальний символ.
Хафенкраніч

2
Я хочу дати +1, але це не спрацює для chrome 55
pery mimon

4
Я б це проголосував, якби був якийсь HTML і, можливо, Загадка, яка допоможе візуалізувати те, що ви робите.
Джон

29

На CSS використовуйте код

p {
    white-space: pre-line;
}

З цим кодом css кожне введення всередині тегу P буде розривом у html.


1
Це саме те, що я шукав! Ідеально підходить для вмісту елементів, що генерується за допомогою JS (наприклад, результат JSON за запитом AJAX, форма кутової схеми тощо), який проходить через втечу / санітарію (наприклад, нормальна поведінка уникнення AngularJS при використанні ngBindHtml)
Стефан

28

Спираючись на сказане раніше, це чисте рішення CSS, яке працює.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>

Щойно я виявив, що цей підхід є корисним для багаторядкових input type='text', wrapping the input, and then laying the text over it with a wrapper поділок- . That also requires покажчиків: none; `на :before, щоб все-таки можна було натиснути кнопку нижче.
Ерік Оренда

10
<pre> <---------------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</pre> <--------------------------------------

АБО

<div style="white-space:pre">  <-----------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</div>                         <-----------------------------------

джерело: https://stackoverflow.com/a/36191199/2377343


9

Щоб згодом елемент перервав рядок, призначте його:

display:block;

Неплаваючі елементи після елемента рівня блоку з’являться у наступному рядку. Багато елементів, таких як <p> і <div>, вже є блоковими елементами, тому їх можна просто використовувати.

Але хоча це добре знати, це дійсно більше залежить від контексту вашого вмісту. У вашому прикладі ви не хочете використовувати CSS для примушування розриву лінії. <br /> підходить, оскільки семантично тег p є найбільш підходящим для тексту, який ви відображаєте. Більше розмітки просто для того, щоб звісити CSS від цього не потрібно. Технічно це не зовсім абзац, але тег <greeting> немає, тому використовуйте те, що у вас є. Описуючи своє утримання добре Html шлях більш важливо - після того, як у вас є що то з'ясувати , як змусити це виглядати красиво.


1
Але це робить його на повну ширину контейнера, що може бути небажаним побічним ефектом (особливо якщо предмет є якорем / ланкою).
NickG

Так, елементи за замовчуванням рівня блоку займають повну ширину, якщо не встановити ширину. Прочитайте мій параграф про контекст - мислення з точки зору семантичного контексту, а не вибору html на основі дизайну, як правило, допомагає запобігти вам не стикатися з подібними проблемами.
Помилка синтаксису

1
Часто причина, яку потрібно уникати тегів, - це більше технічна, ніж семантична. Теги <br> є окремими, і ви не можете їх обов'язково використовувати, оскільки ви не знаєте, чи будуть елементи спереду існувати під час візуалізації сторінки, тому вам можуть не потрібні порожні рядки. Розгляньте перелік <a> посилань у вертикальному меню, де ви хочете, щоб усі вони були у їхньому власному рядку, але не можете використовувати <br>, оскільки ви не знаєте, які посилання будуть приховані через правила на стороні сервера. Приховування посилань спричинило б порожні рядки, якщо використовуватиметься <br>.
NickG

1
.. З цієї причини люди часто використовують <ul> список і потім приховують кулі, але це досить хакі. Було б краще, якби існувало правило css, яке просто говорило "завжди відображати у власному рядку".
NickG

1
Але як я вже говорив у своєму першому коментарі - це має небажаний побічний ефект, коли елементи мають повну ширину :) Мені просто потрібні елементи в новому рядку, без їх повної ширини. Якщо елемент є посиланням у крайній лівій частині сторінки, це означає, що навіть натискання клавіші в крайній правій частині екрана переходять за посиланням.
NickG

8

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

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}

1
друкарська помилка чи що має exбути? pі eчи не так близько на клавіатурі, тому я запитую
MMachinegun


1
Погано чи ні, це насправді досить розумно.
Джонатан Дюман

5

Для переліку посилань

Інші відповіді пропонують кілька хороших способів додавання розривів рядків, залежно від ситуації. Але слід зазначити, що :afterселектор є одним з кращих способів зробити це для управління CSS над списками посилань (і подібних речей) з причин, зазначених нижче.

Ось приклад, припускаючи зміст:

<style type="text/css">
    .toc a:after{ content: "\a"; white-space: pre; }
</style>

<span class="toc">
    <a href="#a1">Item A1</a> <a href="#a2">Item A2</a>
    <a href="#b1">Item B1</a> <a href="#b2">Item B2</a>
</span>

А ось техніка Simon_Weaver, яка простіша і сумісніша. Це не відокремлює стиль і контент настільки, вимагає більше коду, і можуть бути випадки, коли ви хочете додати перерви після факту. Але все-таки чудове рішення, особливо для старих IE.

<style type="text/css">
    .toc br{ display: none; } /* comment out for horizontal links */
</style>

<span class="toc">
    <a href="#a1">Item A1</a><br/> <a href="#a2">Item A2</a><br/>
    <a href="#b1">Item B1</a><br/> <a href="#b2">Item B2</a><br/>
</span>

Зверніть увагу на переваги вищезазначених рішень:

  • Незалежно від місця пробілів у HTML, результат виходить однаковим (порівняно pre )
  • До елементів не додано додаткових накладок (див. Статті NickG display:block Коментарі )
  • Ви можете легко переходити між горизонтальним та вертикальним списками посилань із деяким спільним CSS, не входячи у кожен HTML-файл для зміни стилю
  • Ні floatабоclear стилі , що впливають на навколишнє зміст
  • Стиль є окремим від змісту (порівняно <br/>, абоpre з жорстко закодованими перервами)
  • Це також може працювати за допомогою вільних посилань a.toc:after та<a class="toc">
  • Ви можете додати кілька перерв і навіть текст префікса / суфікса

4

Можливо, хтось матиме те саме питання, що і я:

Я був у стихії, display: flexтому довелося використовувати flex-direction: column.


4

Встановлення brтегу наdisplay: none корисно, але тоді ви можете закінчити WordsRunTogether. Мені було корисніше замінити його на пробіл, наприклад:

HTML:

<h1>
    Breaking<br />News:<br />BR<br />Considered<br />Harmful!
</h1>

CSS:

@media (min-device-width: 1281px){
    h1 br {content: ' ';}
    h1 br:after {content: ' ';}
}

2
Ви могли б також розглянути питання про створення brв display: inline-block; width: 1em;якому повинні заважати слова від роботи разом, ідучи по горизонталі.
Beejor

1
Мені більше подобається ваша пропозиція. Я спробую це наступного разу, коли зіткнусь із цим.
Брайан

3

Як щодо <pre>тегу?

джерело: http://www.w3schools.com/tags/tag_pre.asp


Ой! Я бачу, що ти маєш на увазі. Тоді ви використовуєте пробіли у вашому, <pre>щоб вони порушили лінію. Що робити, якщо ви хочете мати регулярні пробіли?
Micha Mazaheri

Попередній тег інтерпретуватиме повернення перевезення, зроблені всередині. Тож якщо ви перервете лінію між "привіт" та "як вам" у попередньому тезі, перерва буде
виведена

2

Ви можете додати багато прокладки та змусити текст розбити, наприклад, до нового рядка

p{
    padding-right: 50%;
}

Мені непогано працювало в ситуації з чуйним дизайном, коли лише в певному діапазоні ширини було потрібно розбиття тексту.


1
Звучить приємна ідея, але збільшення оббивки також збільшить загальну ширину предмета. І це може мати негативний ефект, особливо у випадку чуйної сторінки.
itsols

1

Мені подобаються дуже прості рішення, ось ще одне

<p>hello <span>How are you</span></p>

і css

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

1

Використовуйте overflow-wrap: break-word; подібно до :

.yourelement{
overflow-wrap: break-word;
}

1

Вам потрібно задекларувати вміст всередині <span class="class_name"></span> . Після нього лінія буде розірвана.

\A означає характер подачі рядка.

.class_name::after {
  content: "\A";
  white-space: pre;
}

0

І Вінсент Роберт, і Джої Адамс відповіді справедливі. Якщо ви не хочете змінити розмітку, ви можете просто вставити за <br />допомогою JavaScript.

Неможливо зробити це в CSS без зміни розмітки.


Це не точно. Можна було б скористатися :afterчи :beforeзробити це.
Артур Бодера

0

У моєму випадку мені потрібна була кнопка введення, щоб перервати рядок перед цим.
Я застосував наступний стиль до кнопки, і вона спрацювала:

clear:both;

0

Якщо це допоможе комусь ...

Ви можете це зробити:

<p>This is an <a class="on-new-line">inline link</a>?</p>

З цим css:

a.on-new-line:before { 
  content: '&nbsp;'; 
  font-size:0; 
  display:block;
  line-height:0;
}

або.on-new-line:before {content: ""; display: block;}
meuwka

0

Використання &nbsp;замість пробілів запобіжить перерву.

<span>I&nbsp;DONT&nbsp;WANT&nbsp;TO&nbsp;BREAK&nbsp;THIS&nbsp;LINE&nbsp;UP, but this text can be on any line.</span>


0

Я здогадуюсь, що ви не хотіли використовувати точку перерви, тому що вона завжди буде порушувати лінію. Це правильно? Якщо так, як про те, як додати точку розриву <br />до тексту, а потім надати йому такий клас, як <br class="hidebreak"/>потім, використовуючи медіа-запит прямо над розміром, який ви хочете, щоб він зламався, щоб приховати<br /> щоб він на певну ширину, але залишався в рядку вище цієї ширини.

HTML:

<p>
The below line breaks at 766px.
</p>

<p>
 This is the line of text<br class="hidebreak"> I want to break.
</p>

CSS:

@media (min-width: 767px) {
  br.hidebreak {display:none;}
}

https://jsfiddle.net/517Design/o71yw5vd/


Я щойно помітив, що Simon_Weaver розмістив відповідь, аналогічну моїй. Вибачте Саймон, не намагався плагіатувати вашу відповідь. Я не прочитав усіх відповідей до того, як розмістив свою, і тому не помітив вашої. Мій поганий ... урок, засвоєний .. Я прочитаю інші відповіді, перш ніж розміщувати свої.
Кранкіт

Не хвилюйтесь! Але ти мусиш написати мені вірш. Від w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver

0

Код може бути

<div class="text-class"><span>hello</span><span>How are you</span></div>

CSS був би

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }

-1

Не варто. Якщо ви хочете перервати жорстку лінію, використовуйте її.


3
+1 Так, але якщо новий рядок призначений виключно для використання у презентації display: block;.
Web_Designer

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