Игнорировать <br> с помощью CSS?


115

Я работаю над сайтом, на котором вставлены разрывы строк, как <br>в некоторых заголовках. Предполагая, что я не могу редактировать исходный HTML, есть ли способ с помощью CSS игнорировать эти разрывы?

Я оптимизирую сайт для мобильных устройств, поэтому на самом деле я не хочу использовать JavaScript.


1
@Ben Johnson mk2: Ответ на ваш вопрос: «Я хотел бы, чтобы ответ @Aneesh Karthik C для firefox и opera» был невозможен с использованием brэлементов! Причины уже неоднократно объяснялись! В своем ответе я показал вам альтернативный метод достижения цели действительным, надежным и кросс-браузерным способом.
Netsurfer

Ответы:


198

С помощью css вы можете «скрыть» теги br, и они не будут иметь эффекта:

br {
    display: none;
}

Если вы хотите скрыть только некоторые элементы в определенном типе заголовка, просто сделайте свой CSS более конкретным.

h3 br {
    display: none;
}

11
Не забудьте также взглянуть на ответ Аниша, он актуален и устраняет проблему, которую Энобрев не рассматривал в своем.
Рик Колдер

3
Согласен, ответ Аниша - фантастическое дополнение. stackoverflow.com/a/18040142/14651
enobrev

2
Это решение не работает для Firefox. Если вокруг <br/> нет места, он объединяет слова вокруг <br/> вместе. Вот образец. Вы можете увидеть обсуждение этого ниже
shinesecret

1
Если ваша цель - адаптивный дизайн, единственным кроссбраузерным решением является @ Netsurfer. Он не отвечает на вопрос в точности так, как указано, но он позволяет достичь цели во всех современных браузерах.
Эндрю Лундин

94

Примечание. Это решение работает только для браузеров Webkit, которые неправильно применяют псевдоэлементы к самозакрывающимся тегам.

В качестве дополнения к приведенным выше ответам стоит отметить, что в некоторых случаях нужно вставить пробел, а не просто игнорировать <br>:

Например, приведенные выше ответы превратятся

Monday<br>05 August

к

Monday05 August

как я подтвердил, пытаясь отформатировать свой еженедельный календарь событий. Пробел после «понедельника» рекомендуется вставлять. Это легко сделать, вставив в CSS следующее:

br  {
    content: ' '
}
br:after {
    content: ' '
}

Это сделает

Monday<br>05 August

выглядит как

Monday 05 August

Вы можете изменить contentатрибут br:afterна, ', 'если хотите разделить его запятыми, или вставить что угодно, ' 'чтобы сделать его разделителем! Кстати

Monday, 05 August

выглядит аккуратно ;-)

См. Здесь для справки.

Как и в приведенных выше ответах, если вы хотите сделать его специфичным для тега, вы можете. Например, если вы хотите, чтобы это свойство работало для тега <h3>, просто добавьте h3каждый перед brи br:after, например.

Обычно это работает с псевдо-тегом.


2
так очень-очень гениально!
Джон

1
Молодец, собственно думаю о последствиях простого отключения!
Рик Колдер

10
Хороший момент, но похоже, что это работает только с браузерами Webkit (Chrome и Safari) с Firefox и IE, этот метод не работает, проверьте jsfiddle.net/nicooprat/ZHxNA с Firefox и IE ... любые идеи, как заменить br с пробелом, чтобы он работал со всеми основными браузерами?
firepol

6
@firepol: На самом деле Firefox и IE делают все «правильно», поскольку это <br />один из элементов, с которым псевдоэлемент не должен работать . И contentработает только с псевдоэлементами.
ScottS

7
Это очень неправильное решение, в основном из-за того, что уже написал @ScottS. «Контент» должен работать только с псевдоэлементами, а псевдоэлемент не должен работать с самозакрывающимися тегами. На данный момент это может сработать, но я бы не осмелился называть это решение перспективным.
nd_macias

16

Если добавить в стиль

br{
    display: none;
}

Тогда это сработает. Не уверен, что он будет работать в более старых версиях IE.


3
это было опубликовано ранее и набрало меньше голосов .. почему?
Mr_Green

Иногда нас просто игнорируют; (
Тим Би Джеймс

@TimBJames, это не работает в FIREFOX, вы можете проверить мой подробный комментарий выше
shinesecret


7

Вы можете использовать spanэлементы вместо, brесли хотите, чтобы метод пробелов работал, поскольку он зависит от псевдоэлементов, которые «не определены» для заменяемых элементов.

HTML

<p>
   To break lines<span class="line-break">in a paragraph,</span><span>don't use</span><span>the 'br' element.</span>
</p>

CSS

span {white-space: pre;}

span:after {content: ' ';}

span.line-break {display: block;}

span.line-break:after {content: none;}

ДЕМО

Разрыв строки просто достигается путем установки соответствующего элемента span на display:block.

Используя идентификаторы и / или классы в разметке HTML, вы можете легко настроить таргетинг на каждый отдельный или комбинацию элементов span с помощью CSS или использовать селекторы CSS, например nth-child().

Таким образом, вы можете, например, определять различные точки останова, используя медиа-запросы для адаптивного макета.

И вы также можете просто добавлять / удалять / переключать классы с помощью Javascript (jQuery).

«Преимуществом» этого метода является его надежность - он работает во всех браузерах, поддерживающих псевдоэлементы (см. Могу ли я использовать - контент, созданный CSS ).

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

span.break:before {  
    content: "\A";
    white-space: pre;
}

ДЕМО


4
Вы пропустили эту часть вопроса: «Предполагая, что я не могу редактировать исходный html»?
ScottS

1
@ScottS: Нет, не знал. Возможно, вы пропустили часть: «Я хотел бы получить решение для ответа @Aneesh Karthik C для Firefox и Opera» (поскольку тот, кто начал награду, не является OP). И ответ на это то, что это невозможно <br>, по крайней мере, с кроссбраузерностью. Итак, я показал альтернативу.
Netsurfer

2
Нет, я не пропустил эту часть (этот OP отличается от bounty и акцента на ответе Aneesh). Но ответ Аниша находится в контексте всего вопроса: «Игнорировать <br> с помощью CSS?» Это кажется довольно очевидным , что если один имеет фактический контроль над HTML, то просто удалите те <br>элементы , решает эту проблему ( по- видимому , заменив их пробелами). Итак, проблема, которая беспокоит вопрос в целом, заключается в том, что у кого- то нет контроля над html ; осложняется добавленным условием, что они действительно не хотят использовать javascript (по какой-либо причине) для ее решения.
ScottS

Вопрос "Как игнорировать <br>с помощью CSS?" уже был дан ответ. И только если вы контролируете HTML, это не значит, что вы хотите его изменить. Но в адаптивном дизайне часто желательно контролировать разрывы строк (кроме автоматического переноса). И в таких случаях метод наличия пробелов или отсутствия контроля с помощью CSS (медиа-запросов) является по крайней мере «одним из методов» для достижения цели.
Netsurfer

Теперь это сработало для меня лучше, когда вышеуказанные решения больше не работают в firefox.
Христос Хрусис, 01

3

Для меня лучше выглядит так:

Some text, Some text, Some text

br {
  display: inline;
  content: '';
}

br:after {
  content: ', ';
  display: inline-block;
}
<div style="display:block">
  <span>Some text</span>
  <br>
  <span>Some text</span>
  <br>
  <span>Some text</span>
</div>


1

Для этого вы можете сделать так:

br{display: none;}

и если он находится внутри некоторого тега PRE, вы можете, и если вы хотите, чтобы тег PRE вел себя как обычный блочный элемент, вы можете использовать этот CSS:

pre {white-space: normal;}

Или вы можете следовать стилю Aneesh Karthik C, например:

br  {content: ' '}
br:after {content: ' '}

Я думаю ты понял


Я думаю, вы упустили тот момент, что псевдоэлементы вроде ::beforeи ::afterпо крайней мере "не определены" для "замененных элементов" br. Так что никогда не будет постоянного поведения браузера, на которое можно положиться! Единственное, что вы можете сделать, - это не использовать с этими элементами псевдоэлементы!
Netsurfer

1

Согласно вашему вопросу, чтобы решить эту проблему для Firefox и Opera с использованием подхода Aneesh Karthik C, вам необходимо добавить атрибут "float" right.

Посмотрите пример здесь. Этот CSS работает в Firefox (26.0), Opera (12.15), Chrome (32.0.1700) и Safari (7.0).

br {
   content: " ";  
   float:right; 
}

Надеюсь, это ответит на ваш вопрос !!


Свойство content влияет только на псевдоэлементы CSS. Так что в вашем демо это абсолютно бесполезно! А как «нейтрализовать» brуже дан ответ (не раз). Вопрос в условных пробелах . И поскольку для этого требуется использование псевдоэлементов, он не работает сbr .
Netsurfer

Если внимательно прочитать вопрос. Вы поймете ответ. Я видел ответ выше, который лучше всего избегать <br>, просто установив для него display: none. Но что касается второго вопроса, где он хочет узнать, как он может решить проблему, которая возникает в FF и Opera для решения Aneesh.
shinesecret

Я очень внимательно прочитал не только вопрос, но и все ответы и комментарии. Содержимое собственности для br- это просто ерунда! И я до сих пор не понимаю, какое отношение ваш ответ имеет к «условным пробелам и линиям»? Может быть, вы можете объяснить это подробнее, пожалуйста?
Netsurfer

1
Ваш пример вводит в заблуждение, поскольку у вас уже есть пробелы вокруг brэлементов. Если вы удалите их, вы увидите, что не работает добавление места.
ScottS

1
В вашем примере у вас есть три brэлемента с пробелами до и после первого и последнего. Это те пробелы, которые создают впечатление, что ваше решение работает, хотя на самом деле это не так. Когда вы удалите эти пробелы, как я это сделал в моем исправленном примере, вы увидите, что ваше решение вообще не добавляет места в Firefox.
ScottS

0

Хотя этот вопрос, похоже, уже решен, принятый ответ не решил проблему для меня в Firefox. Firefox (и, возможно, IE, хотя я его не пробовал) пропускает пробелы при чтении содержимого тега «content». Хотя я полностью понимаю, почему Mozilla так поступила, это приносит свою долю проблем. Самый простой обходной путь, который я нашел, - использовать неразрывные пробелы вместо обычных, как показано ниже.

.noLineBreaks br:before{
content: '\a0'
}

Посмотри .


1
Почему на вашей скрипке нет beforeэлемента br? У вас даже нет brHTML-кода на скрипке. Часть проблемы в том , что beforeне работает на brнекоторых браузерах.
ScottS

Это вполне ожидаемое поведение, как указано в спецификации: 2.5.1 Общие идиомы синтаксического анализатора
Netsurfer

Это конечно странно, это работает, когда я применяю это в своем проекте. Однако мой текст - это не полностью HTML, содержимое, которое я изменяю, берется из базы данных. Тогда извини, что мой ответ не помог.
Санто Геварра,

0

Да, вы можете игнорировать это <br>. Это может вам понадобиться, особенно в случае адаптивного дизайна, когда вам нужно убрать паузы для мобильных устройств.

HTML

<h2>

  Where ever you go <br class="break"> i am there.

</h2>

CSS для мобильного примера

/* Resize the browser window to check */

@media (max-width: 640px) 
{
  .break {display: none;}
}

Посмотрите этот Codepen:
https://codepen.io/fluidbrush/pen/pojGQyM


-1

Вы можете просто преобразовать его в комментарий ..

Или вы можете сделать это:

br {
display: none;
}

Но если вы этого не хотите, зачем вы это кладете?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.