Ignorar o <br> com CSS?

114

Estou trabalhando em um site que tem quebras de linha inseridas como <br>em alguns dos títulos. Supondo que eu não possa editar o código-fonte HTML, há uma maneira com o CSS de ignorar essas quebras?

Estou otimizando o site para celular, então não quero usar JavaScript.

Evanss
fonte
1
@Ben Johnson mk2: A resposta à sua pergunta: "Eu gostaria de uma solução para a resposta de @Aneesh Karthik C para firefox e ópera" é que não é possível com o uso de brelementos! Os motivos já são explicados inúmeras vezes! Na minha resposta, mostrei um método alternativo para atingir o objetivo de forma válida, robusta e em vários navegadores.
Netsurfer

Respostas:

198

Com css, você pode "ocultar" as tags br e elas não terão efeito:

br {
    display: none;
}

Se você deseja ocultar apenas alguns dentro de um tipo de título específico, apenas torne seu css mais específico.

h3 br {
    display: none;
}
enobrev
fonte
11
Certifique-se de dar uma olhada na resposta de Aneesh também, ela é relevante e corrige um problema que enobrev não considerou na sua.
Rick Calder
3
Concordo, a resposta de Aneesh é uma adição fantástica. stackoverflow.com/a/18040142/14651
enobrev
2
Esta solução não funciona no Firefox. Se o <br/> não tiver espaço ao redor, ele combina as palavras ao redor <br/>. Aqui está o exemplo. Você pode ver a discussão sobre isso abaixo
shinesecret
1
Se o seu objetivo é um design responsivo, a única solução para vários navegadores é o @Netsurfer. Ele não responde à pergunta exatamente como afirmado, mas atinge o objetivo em todos os navegadores modernos.
Andrew Lundin
94

Observação: esta solução funciona apenas para navegadores Webkit, que aplicam pseudoelementos incorretamente a tags de fechamento automático.

Como adendo às respostas acima, é importante notar que, em alguns casos, é necessário inserir um espaço em vez de simplesmente ignorar <br>:

Por exemplo, as respostas acima irão virar

Monday<br>05 August

para

Monday05 August

como eu tinha verificado enquanto tentava formatar meu calendário de eventos semanais. É preferível inserir um espaço após "segunda-feira". Isso pode ser feito facilmente inserindo o seguinte no CSS:

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

Isso vai fazer

Monday<br>05 August

parece

Monday 05 August

Você pode alterar o contentatributo em br:afterpara ', 'se desejar separar por vírgulas ou inserir qualquer coisa que desejar ' 'para torná-lo o delimitador! A propósito

Monday, 05 August

parece legal ;-)

Veja aqui uma referência.

Como nas respostas acima, se você quiser torná-lo específico para tags, pode. Como se você quiser que essa propriedade funcione para tag <h3>, basta adicionar um h3each before bre br:after, por exemplo.

Ele funciona mais geralmente para uma pseudo-tag.

Host-website-on-iPage
fonte
2
muito, muito gênio!
jon
1
Muito bem, pensando nas consequências de simplesmente desativá-lo!
Rick Calder
10
Bom ponto, mas isso parece funcionar apenas com navegadores Webkit (Chrome e Safari) com Firefox e IE esta técnica não funciona, verifique o jsfiddle.net/nicooprat/ZHxNA com Firefox e IE ... alguma idéia de como substituir um br com um espaço para que funcione com todos os freios principais?
firepol de
6
@firepol: Na verdade, o Firefox e o IE estão fazendo as coisas "corretas", pois <br />é um elemento em que um pseudo-elemento não deve funcionar . E contentsó funciona com pseudoelementos.
ScottS
7
Esta é uma solução muito errada, principalmente por causa do que o @ScottS já escreveu. "Conteúdo" deve funcionar apenas com pseudoelementos, e pseudoelementos não devem funcionar com tags de fechamento automático. Isso pode funcionar por enquanto, mas não me atreveria a chamar essa solução à prova de futuro.
nd_macias
16

Se você adicionar no estilo

br{
    display: none;
}

Então isso vai funcionar. Não tenho certeza se funcionará em versões anteriores do IE.

Tim B James
fonte
3
isso foi postado anteriormente e tem menos votos .. como assim?
Mr_Green
Às vezes, simplesmente somos ignorados; (
Tim B James
@TimBJames não funciona no FIREFOX você pode conferir meu comentário detalhado acima
shinesecret
12

É assim que eu faço:

br { 
    display: inline;
    content: ' ';
    clear:none;
}
Neo
fonte
6

Você pode usar spanelementos em vez de brse quiser que o método de espaço em branco funcione, pois depende de pseudoelementos que "não estão definidos" para elementos substituídos.

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;}

DEMO

A quebra de linha é simplesmente alcançada definindo o elemento span apropriado para display:block.

Ao usar IDs e / ou classes em sua marcação HTML, você pode facilmente direcionar cada um ou combinação de elementos span por CSS ou usar seletores CSS como nth-child().

Assim, você pode, por exemplo, definir diferentes pontos de interrupção usando consultas de mídia para um layout responsivo.

E você também pode simplesmente adicionar / remover / alternar classes por Javascript (jQuery).

A "vantagem" deste método é a sua robustez - funciona em todos os navegadores que suportam pseudo-elementos (ver: Posso usar - Conteúdo gerado em CSS ).

Como alternativa, também é possível adicionar uma quebra de linha por meio de pseudoelementos:

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

DEMO

Netsurfer
fonte
4
Você perdeu esta parte da pergunta: "Presumindo que não posso editar o html de origem"?
ScottS
1
@ScottS: Não, não disse. Talvez você tenha perdido a parte: 'Eu gostaria de uma solução para a resposta de @Aneesh Karthik C para firefox e ópera' (já que quem começou o bounty não é o OP). E a resposta para isso é que não é possível com <br>, pelo menos não cross-browser. Então, mostrei uma alternativa.
Netsurfer
2
Não, eu não perdi essa parte (que OP é diferente de generosidade e o foco na resposta de Aneesh). Mas a resposta de Aneesh está no contexto de toda a questão, "Ignorar <br> com CSS?" Parece bastante óbvio que se alguém tem controle real do html, então simplesmente deletar os <br>elementos resolverá o problema (presumivelmente substituindo-os por espaços). Portanto, todo o problema com o qual a questão como um todo se preocupa é quando não se tem controle do html ; complicado pela estipulação adicional de que eles realmente não queriam usar javascript (por qualquer motivo) para resolvê-lo.
ScottS de
A pergunta "Como ignorar <br>com CSS?" já foi respondido. E somente se você estiver no controle do HTML, isso não significa que você deseja alterá-lo. Mas, no design responsivo, muitas vezes é desejável estar no controle das quebras de linha (além da quebra automática). E, em tais casos, o método de ter espaço em branco ou não controlado por CSS (consultas de mídia) é pelo menos "um método" para atingir o objetivo.
Netsurfer
Isso funcionou melhor para mim agora que as soluções acima não funcionam mais no firefox.
Christos Hrousis
3

Para mim fica melhor assim:

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>

Ruslan P
fonte
1

Para isso, você pode simplesmente fazer assim:

br{display: none;}

e se estiver dentro de alguma tag PRE, então você pode e se quiser que a tag PRE se comporte como um elemento de bloco regular, você pode usar este CSS:

pre {white-space: normal;}

Ou você pode seguir o estilo de Aneesh Karthik C como:

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

Eu acho que você percebeu

Dawadisuren
fonte
Eu acho que você perdeu o ponto que pseudo-elementos gostam ::beforee ::aftersão pelo menos "indefinidos" para "elementos substituídos" como br. Portanto, nunca haverá um comportamento de navegador consistente em que se possa confiar! A única coisa que você pode fazer é não usar pseudoelementos com esses elementos!
Netsurfer
1

De acordo com sua pergunta, para resolver este problema para Firefox e Opera usando a abordagem Aneesh Karthik C , você precisa adicionar o atributo "float" right ".

Veja o exemplo aqui. Este CSS funciona no Firefox (26.0), Opera (12.15), Chrome (32.0.1700) e Safari (7.0)

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

Espero que isso responda a sua pergunta !!

shinesecret
fonte
A propriedade de conteúdo só tem efeito em pseudoelementos CSS. Portanto, é absolutamente inútil em sua demonstração! E como "neutralizar" a brjá foi respondido (mais de uma vez). A questão é sobre o espaço em branco condicional . E como isso requer o uso de pseudoelementos, não funcionabr .
Netsurfer
Se você ler a pergunta com atenção. Você vai entender a resposta. Eu vi a resposta acima que é o melhor para evitar <br> apenas configurando-o para exibir: nenhum. Mas, de acordo com a segunda pergunta, ele quer descobrir como pode resolver o problema que está chegando na solução FF e Opera for Aneesh.
shinesecret
Eu li não apenas a pergunta, mas também todas as respostas e comentários com muito cuidado. Propriedade de conteúdo para bré simplesmente um absurdo! E ainda não consigo ver o que o resto da sua resposta tem a ver com "espaço em branco condicional e brekas de linha"? Talvez você possa explicar melhor, por favor?
Netsurfer
1
Seu exemplo é enganoso, pois você já tem espaços ao redor dos brelementos. Se você removê-los, verá que não está funcionando para adicionar qualquer espaço.
ScottS de
1
No seu exemplo, você tem três brelementos, com espaços antes e depois do primeiro e do último. São esses espaços que fazem parecer que sua solução está funcionando, quando na verdade não está. Quando você remove esses espaços, como fiz no meu exemplo revisado, pode ver que sua solução não está adicionando nenhum espaço no Firefox.
ScottS de
0

Embora esta questão pareça já ter sido resolvida, a resposta aceita não resolveu o problema para mim no Firefox. O Firefox (e possivelmente o IE, embora eu não tenha experimentado) pula os espaços em branco ao ler o conteúdo da tag "conteúdo". Embora eu entenda completamente por que o Mozilla faria isso, ele traz sua cota de problemas. A solução mais fácil que encontrei foi usar espaços inquebráveis ​​em vez de espaços regulares, conforme mostrado abaixo.

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

Dê uma olhada .

Santo Guevarra
fonte
1
Por que seu violino não tem o beforeelemento em a br? Você nem mesmo tem um brem seu html no violino. Parte do problema é que beforenão funciona brem alguns navegadores.
ScottS de
Esse é um comportamento bastante esperado, conforme declarado na especificação: 2.5.1 Expressões idiomáticas do analisador comum
Netsurfer
Isso é estranho, funciona quando eu aplico no meu projeto. Meu texto não é todo HTML, porém, o conteúdo que estou alterando vem de um banco de dados. Desculpe, minha resposta não ajudou, então.
Santo Guevarra
0

Sim, você pode ignorar isso <br>. Você pode precisar disso especialmente no caso de design responsivo, onde você precisa remover interrupções para dispositivos móveis.

HTML

<h2>

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

</h2>

CSS para exemplo de celular

/* Resize the browser window to check */

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

Confira este Codepen:
https://codepen.io/fluidbrush/pen/pojGQyM

escova de fluido
fonte
-1

Você pode simplesmente convertê-lo em um comentário.

Ou você pode fazer isso:

br {
display: none;
}

Mas se você não quer, por que está colocando isso aí?

BASE - Programação
fonte