Як відключити рядок від 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.