Как перенести строку из CSS без использования ‹br /›?

вывод:

hello
How are you

код:

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

Как добиться того же результата без <br>?


person Jitendra Vyas    schedule 24.04.2010    source источник


Ответы (25)


Невозможно с той же структурой HTML, у вас должно быть что-то отличать Hello от How are you.

Я предлагаю использовать spans, которые затем будут отображаться в виде блоков (как на самом деле <div>).

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

person Vincent Robert    schedule 24.04.2010
comment
также обратите внимание, сколько там дополнительной разметки - элемент <br /> существует по очень уважительной причине. Если вам нужен разрыв строки, потому что это отдельные абзацы, просто пометьте их как отдельные абзацы. - person Rowland Shaw; 24.04.2010
comment
Вам могут понадобиться структурированные строки без фактического использования абзацев. Чтобы разметить стихотворение, песню или адрес, например - person Vincent Robert; 27.04.2010
comment
@VincentRobert Верно, но стихотворение - это канонический пример того, когда <br> - правильная разметка. Отрывки для стихотворения были бы «неправильными». - person Alan H.; 25.06.2013
comment
Обратите внимание, что назначение display: block элементу приведет к разрыву строки до и после, поэтому это совсем не то же самое, что наличие одного разрыва строки. - person jerseyboy; 12.07.2013
comment
Определенно используйте элементы ‹p›. Элемент ‹span› НЕ ДОЛЖЕН превращаться в display: block, весь смысл ‹span› в том, что он встроен. Я бы сделал это так: ‹div› ‹p› hello ‹/p› ‹p› Как дела? ‹/P› ‹/div›. Никакого выверенного CSS не требуется. - person Miles; 31.10.2013
comment
Нет необходимости в использовании CSS. Возможно, вам все равно потребуется проверить высоту строки. - person ObjectMatrix; 19.09.2016

Вы можете использовать white-space: pre;, чтобы элементы работали как <pre>, что сохраняет символы новой строки. Пример:

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

Обратите внимание на IE, что это работает только в IE8 +.

person Joey Adams    schedule 24.04.2010
comment
часто лучше, чем pre, pre-line, что позволяет использовать перенос. - person Alan H.; 25.06.2013
comment
Подробнее о различиях между pre-line и pre-wrap см. для разработчиков. mozilla.org/en-US/docs/Web/CSS/white-space - person patrick; 05.11.2014
comment
В моем случае я предпочел pre, потому что я также могу использовать переполнение текста - person Greg; 31.01.2019
comment
Обратите внимание, что это не будет работать с response, потому что текст в конечном итоге будет объединен и будет помещен в ту же строку, что не вызовет white-space правило CSS. - person Vadorequest; 06.05.2020
comment
лучше, чем принятый ответ - person shelbypereira; 08.05.2021

Используйте <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) */
  }
}

Это полезно в адаптивном дизайне, когда вам нужно разделить текст на две строки с точным разрывом.

пример jsfiddle

person Simon_Weaver    schedule 11.05.2014
comment
Саймон, вы попали в точку - приведенный вами пример является точной причиной, по которой я исследовал этот вопрос, и решение display: none на сегодняшний день является наиболее подходящим и полезным. - person fullstackplus; 24.06.2014
comment
Обратите внимание, что в случаях, когда это может привести к слиянию слов, вы можете использовать что-то вроде display: inline-block; width: 1em; вместо none. - person Beejor; 11.08.2016
comment
Вы даже можете применить класс к <br class='foo'>, если вам нужно больше контроля, но не сходите с ума! - person Simon_Weaver; 27.11.2016
comment
Другой, почему я не подумал об этом ?! отвечать. <br/> великолепен в том, что делает; не нужно изобретать велосипед. Спасибо! - person rinogo; 24.10.2017
comment
Аналогичная концепция может быть применена к макету гибкого блока: stackoverflow.com/questions/29732575/ - person Simon_Weaver; 22.06.2018
comment
Несмотря на интересный ответ, спрашивающий хотел сделать это без ‹br›, то есть с соблюдением разрывов строк в HTML, что решается некоторыми другими ответами с пре-строкой и предварительным переносом CSS. - person amh15; 10.01.2019
comment
@ amh15 он не говорит, ПОЧЕМУ он хочет это сделать. А точнее что не так с BR. Это предварительно отформатированный текст из веб-службы прогнозов погоды или вопрос адаптивного дизайна. На момент ответа все предварительные / переносимые по словам ответы уже были на месте. Вы правы, что детали имеют значение, но мой ответ помог многим людям, которые нашли этот вопрос на основе ключевых слов, поэтому я не понимаю, почему вы должны быть такими придирчивыми. Я хотел бы знать, чем он действительно хотел заниматься. Но меня это тоже не волнует. - person Simon_Weaver; 10.01.2019

Есть несколько вариантов определения обработки пробелов и разрывов строк. Если можно поместить контент, например, с помощью тега <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

person petermeissner    schedule 05.02.2014
comment
идеально. должен быть выбранный ответ. - person Ben Lin; 30.09.2015
comment
Я считаю, что это то, что ищет OP. - person John Sardinha; 01.10.2016

Команда "\ a" в CSS генерирует возврат каретки. Это CSS, а не HTML, поэтому он должен быть ближе к тому, что вы хотите: без дополнительной разметки.

В цитате, приведенном ниже примере, отображаются и заголовок, и ссылка на источник, и они разделяются возвратом каретки ("\a"):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
person David Latapie    schedule 02.11.2012
comment
Причудливо, но совершенно не нужное для того, о чем был вопрос. - person YePhIcK; 06.02.2014
comment
+1, потому что это только CSS, и не рекомендуется использовать теги pre, br или изменять режим отображения на блок (что добавляет другое поведение, может сломаться, если родитель находится в display:flex и, следовательно, является взломом в этом контексте). На самом деле это не фантастика, это просто современная техника. Если вы хотите точно такую ​​же разметку, но на самом деле реагировать по-разному, это то, что вам нужно. - person renoirb; 02.07.2014
comment
Гениальная идея. Обратите внимание на " - не используйте простые кавычки ', потому что вы хотите, чтобы \a анализировался как специальный символ. - person Hafenkranich; 11.08.2016
comment
Я хочу поставить +1, но у меня это не работает на Chrome 55 - person pery mimon; 10.01.2017
comment
Я бы проголосовал за это, если бы был какой-то HTML и, возможно, Fiddle, чтобы помочь визуализировать то, что вы делаете. - person John; 20.07.2017

В CSS используйте код

p {
    white-space: pre-line;
}

С этим кодом css каждый ввод внутри тега P будет строкой разрыва в html.

person burunoh    schedule 22.07.2014
comment
Это именно то, что я искал! Отлично работает для содержимого элемента, сгенерированного из JS (например, результат JSON из запроса AJAX, angular-schema-form и т. Д.), Который передается через экранирование / дезинфекцию (например, нормальное поведение экранирования AngularJS, когда не используется ngBindHtml) - person Stefan Dragnev; 18.07.2016

Основываясь на том, что было сказано ранее, это чистое решение CSS, которое работает.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>
person cruzanmo    schedule 12.11.2014
comment
Я только что нашел вариант этого подхода, который может быть полезен для многострочных input type='text', wrapping the input, and then laying the text over it with a wrapper div. That also requires pointer-events: none; `на :before, чтобы по-прежнему можно было нажимать кнопку ниже. - person Eric Lease; 01.02.2016

Чтобы после этого у элемента был разрыв строки, присвойте ему:

display:block;

Неплавающие элементы после элемента уровня блока появятся на следующей строке. Многие элементы, такие как ‹p› и ‹div›, уже являются элементами уровня блока, так что вы можете просто использовать их.

Но хотя это полезно знать, на самом деле это больше зависит от контекста вашего контента. В вашем примере вы не захотите использовать CSS для принудительного разрыва строки. ‹Br /› подходит, потому что семантически тег p является наиболее подходящим для отображаемого текста. Больше разметки просто для того, чтобы повесить CSS, не нужно. Технически это не точно абзац, но тег ‹greeting› отсутствует, так что используйте то, что у вас есть. Хорошее описание вашего контента с помощью HTMl гораздо важнее - после того, как вы это сделаете, затем выясните, как сделать его красивым.

person Syntax Error    schedule 24.04.2010
comment
Но это делает его полной шириной контейнера, что может быть нежелательным побочным эффектом (особенно, если элемент является якорем / ссылкой). - person NickG; 20.08.2015
comment
Да, по умолчанию элементы уровня блока занимают всю ширину, если вы не задали ширину. Прочтите мой абзац о контексте - мышление в терминах семантического контекста, а не выбор вашего HTML на основе вашего дизайна, как правило, помогает предотвратить возникновение подобных проблем. - person Syntax Error; 20.08.2015
comment
Часто причина, по которой следует избегать тегов ‹br›, носит скорее технический, чем семантический характер. Теги ‹br› являются автономными, и вы не всегда можете их использовать, так как вы не знаете, будут ли элементы впереди существовать во время рендеринга страницы, поэтому вам могут не понадобиться пустые строки. Рассмотрим список ссылок ‹a› в вертикальном меню, где вы хотите, чтобы все они были на отдельной строке, но не можете использовать ‹br›, так как вы не знаете, какие ссылки будут скрыты из-за правил на стороне сервера. Скрытие ссылок привело бы к появлению пустых строк, если бы использовалось ‹br›. - person NickG; 21.08.2015
comment
..По этой причине люди часто используют список ‹ul›, а затем скрывают маркеры, но это довольно взломано. Было бы лучше, если бы было правило css, которое только что говорило всегда отображать в собственной строке. - person NickG; 21.08.2015
comment
В CSS есть такое правило. Это называется дисплей: блок. BTW ‹li› - это элементы уровня блока, поэтому они отображаются в отдельной строке. Есть также возможность плавания и очистки, но лично я думаю, что это беспорядок, если им злоупотребляют. Причина, по которой люди используют li и скрывают маркеры с помощью css, на самом деле семантическая - если они показывают список элементов, вы должны использовать тег элемента списка. Когда вы ставите семантику на первое место, все становится намного менее хакерским, даже если это кажется технически сложным - на самом деле вы получаете гораздо более простой код для работы. - person Syntax Error; 21.08.2015
comment
Но, как я сказал в своем первом комментарии, это имеет нежелательный побочный эффект, заключающийся в том, что элементы имеют полную ширину :) Мне просто нужны элементы в новой строке, а не на всю ширину. Если элемент представляет собой ссылку в дальнем левом углу страницы, это означает, что даже щелчки в дальнем правом углу экрана переходят по ссылке. - person NickG; 21.08.2015
comment
Это не нежелательно. Дело в том, как работает CSS, и поэтому теги ‹a› являются встроенными элементами. Это не по теме для этого вопроса и ответа, но вы справляетесь с этим, помещая тег ‹a› внутри элемента уровня блока для (просто текстовой ссылки) или явно устанавливая ширину, если вы хотите, чтобы это был уровень блока, (например, если вы хотите иметь возможность нажимать на большую область, включая отступы) Вы также можете установить inline-block и float и очистить их по мере необходимости в зависимости от того, что вы делаете. - person Syntax Error; 24.08.2015

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

OR

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

источник: https://stackoverflow.com/a/36191199/2377343

person T.Todua    schedule 07.03.2017

Вот плохое решение плохого вопроса, но оно буквально соответствует брифу:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
person Community    schedule 24.04.2010
comment
опечатка или что должно быть ex? p и e не так уж близки к клавиатуре, поэтому я спрашиваю - person MMachinegun; 12.06.2014
comment
Плохо это или нет, но на самом деле это довольно умно. - person Jonathan Dumaine; 14.07.2016

Может быть, у кого-то будет такая же проблема, как у меня:

Я был в элементе с display: flex, поэтому мне пришлось использовать flex-direction: column.

person Dorian    schedule 04.11.2013

Для списка ссылок

Другие ответы предоставляют несколько хороших способов добавления разрывов строк в зависимости от ситуации. Но следует отметить, что селектор :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">
  • Вы можете добавить несколько разрывов и даже текст префикса / суффикса
person Beejor    schedule 11.08.2016

Установка тега 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: ' ';}
}
person Bryan    schedule 15.01.2016
comment
Вы также можете рассмотреть возможность установки br на display: inline-block; width: 1em;, чтобы слова не сливались вместе при горизонтальном перемещении. - person Beejor; 11.08.2016
comment
Мне больше нравится ваше предложение. Я попробую это в следующий раз, когда столкнусь с этим. - person Bryan; 18.08.2016

Используйте overflow-wrap: break-word; нравиться :

.yourelement{
overflow-wrap: break-word;
}
person Den Pat    schedule 23.05.2018

Как насчет тега<pre>?

источник: http://www.w3schools.com/tags/tag_pre.asp

person stephan    schedule 02.04.2013
comment
Ой! Я понимаю что ты имеешь ввиду. Затем вы используете пробелы в своем <pre>, чтобы он разорвал строку. Что, если вы хотите, чтобы пробелы были обычными? - person Micha Mazaheri; 30.09.2013
comment
Тег pre будет интерпретировать возврат каретки, сделанный внутри. Поэтому, если вы разорвете строку между «привет» и «как дела» в теге pre, разрыв будет отображаться - person Godineau Félicie; 20.07.2017

Мне нравятся очень простые решения, вот еще одно

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

и css

p {
 display: flex;
 flex-direction: column;
}
person Jarek    schedule 23.03.2018

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

p{
    padding-right: 50%;
}

У меня отлично сработало в ситуации с адаптивным дизайном, когда только в пределах определенного диапазона ширины требовалось разделение текста.

person Alexxandar    schedule 26.11.2014
comment
Звучит неплохо, но увеличение отступов также увеличит общую ширину объекта. И это может иметь негативный эффект, особенно в случае отзывчивой страницы. - person itsols; 28.06.2015

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

\A означает символ перевода строки.

.class_name::after {
  content: "\A";
  white-space: pre;
}
person Jacek Krawczyk    schedule 22.02.2019

Ответы Винсента Роберта и Джои Адамса верны. Однако, если вы не хотите изменять разметку, вы можете просто вставить <br /> с помощью javascript.

Невозможно сделать это в CSS без изменения разметки.

person e-satis    schedule 24.04.2010
comment
Это не совсем так. Для этого можно использовать :after или :before. - person Artur Bodera; 20.06.2012

В моем случае мне нужна была кнопка ввода, чтобы перед ней был разрыв строки.
Я применил к кнопке следующий стиль, и он сработал:

clear:both;
person Gene Bo    schedule 30.09.2013

Если это кому-то поможет ...

Вы могли сделать это:

<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;
}
person Jay    schedule 22.06.2014

Использование &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>
person JPB    schedule 13.04.2016

Это работает в Chrome:

p::after {
    content: "-";
    color: transparent;
    display: block;
}
person Andi Giga    schedule 08.03.2017

Я предполагаю, что вы не хотели использовать точку останова, потому что она всегда прерывает строку. Это верно? Если да, то как насчет добавления точки останова <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/

person Krankit    schedule 06.06.2018
comment
Я только что заметил, что Simon_Weaver опубликовал ответ, похожий на мой. Извини, Саймон, твой ответ не был плагиатом. Я не прочитал все ответы, прежде чем опубликовал свои, и поэтому не заметил вашего. Мой плохой ... усвоенный урок ... Я прочитаю другие ответы, прежде чем размещать свой в будущем. - person Krankit; 06.06.2018
comment
Не стоит беспокоиться! Но ты должен написать мне стихотворение. Из w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems." - person Simon_Weaver; 22.06.2018

Код может быть

<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;
 }
person mad Man    schedule 10.06.2020