Как переводить строки из CSS, не используя <br />?

274

выход:

hello
Как вы

код:

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

Как добиться того же выхода без <br />?

Теги:

21 ответ

277
Лучший ответ

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

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

HTML:

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

CSS

p span 
{
    display: block;
}
  • 30
    обратите внимание также на то, какова дополнительная наценка - элемент <br /> существует по очень веской причине. Если вы хотите разрыв строки, потому что они являются отдельными абзацами, просто пометьте их как отдельные абзацы.
  • 8
    Вам могут понадобиться структурированные строки без использования абзацев. Разметить стихотворение, песню или адрес, например
Показать ещё 5 комментариев
221

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

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

Обратите внимание, что это не работает в IE6 или IE7. Я не знаю об IE8.

  • 109
    часто лучше, чем pre pre-line , что позволяет упаковывать.
  • 12
    Подробнее о различиях между предварительной строкой и предварительной упаковкой см. На developer.mozilla.org/en-US/docs/Web/CSS/white-space
Показать ещё 1 комментарий
84

Я бы ожидал, что большинство людей, которые находят этот вопрос, хотят использовать 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 решение не является наиболее подходящим и полезным.
  • 7
    Обратите внимание, что в тех случаях, когда слова могут запускаться вместе, вы можете использовать что-то вроде display: inline-block; width: 1em; вместо none .
Показать ещё 5 комментариев
66

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

  • 3
    идеально. должен быть выбранный ответ.
  • 1
    Я считаю, что это то, что ищет OP.
51

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

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

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
  • 0
    Причудливый, но совершенно ненужный для вопроса.
  • 15
    +1, потому что это только CSS, и он не рекомендует использовать теги pre, br или изменять режим отображения для блокировки (что добавляет другое поведение, может сломаться, если родительский элемент находится в display:flex и, следовательно, является хаком в этом контексте) , На самом деле это не модно, просто современная техника. Если вы хотите точно такую же разметку, но на самом деле реагируете по-другому, это путь.
Показать ещё 3 комментария
23

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

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

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

p {
    white-space: pre-line;
}

С этим кодом css каждый вход внутри тега P будет линией прерывания в html.

  • 1
    Это именно то, что я искал! Прекрасно работает с содержимым элемента, сгенерированным из JS (например, результат JSON из запроса AJAX, angular-schema-form и т. Д.), Который проходит через экранирование / санитарную обработку (например, нормальное поведение экранирования AngularJS, когда не используется ngBindHtml)
  • 0
    Это единственно правильное решение!
8

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

display:block;

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

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

  • 1
    Но это делает его полной шириной контейнера, что может быть нежелательным побочным эффектом (особенно, если элемент является якорем / ссылкой).
  • 0
    Да, по умолчанию элементы уровня блока занимают всю ширину, если вы не установите ширину. Прочитайте мой абзац о контексте - думая в терминах семантического контекста, а не выбирая html, основанный на вашем дизайне, обычно помогает избежать подобных проблем.
Показать ещё 5 комментариев
6

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

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
Показать ещё 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, вывод одинаков (vs. pre)
  • Никакие дополнительные дополнения не добавляются к элементам (см. комментарии NickG display:block)
  • Вы можете легко переключаться между горизонтальными и вертикальными списками ссылок с помощью некоторого общего CSS без перехода в каждый HTML файл для изменения стиля.
  • Нет float или clear стилей, влияющих на окружающий контент
  • Стиль отделен от содержимого (vs. <br/> или pre с жестко запрограммированными перерывами)
  • Это также может работать для свободных ссылок с использованием a.toc:after и <a class="toc">
  • Вы можете добавить несколько разрывов и даже текст префикса/суффикса
  • 0
    Спасибо, это работает для меня
4

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

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

3

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

p{
    padding-right: 50%;
}

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

  • 1
    Звучит неплохо, но увеличение отступов также увеличит общую ширину объекта. И это может иметь отрицательный эффект, особенно в случае адаптивной страницы.
3

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

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

  • 1
    Разве <pre> для неформатированного текста? Понравился код?
  • 0
    Ой! Я понимаю, что вы имеете ввиду. Затем вы используете пробелы в <pre> так что это разрывает строку. Что делать, если вы хотите иметь регулярные пробелы?
Показать ещё 1 комментарий
2
<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/questions/36191182/new-line-without-br-tag

2

Значение тега 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; что должно препятствовать тому, чтобы слова бежали вместе, идя горизонтально.
  • 1
    Мне больше нравится ваше предложение. Я попробую это в следующий раз, когда столкнусь с этим.
1

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

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

p::after {
    content: "-";
    color: transparent;
    display: block;
}
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;
}
  • 0
    или .on-new-line:before {content: ""; display: block;}
0

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

clear:both;
0

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

  • 3
    +1 Да, но если новая строка предназначена исключительно для презентации, используйте display: block; ,
  • 20
    Я не понимаю, почему этот ответ получил какие-либо голоса. Если бы у меня была возможность использовать разрыв строки, я бы не стал смотреть на этот вопрос.
0

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

В CSS нет способа сделать это без изменения разметки.

  • 0
    Это не точно. Можно использовать :after или :before сделать это.
  • 0
    Да, и это не будет работать в большинстве IE там.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню