Zignorować <br> za pomocą CSS?


115

Pracuję na stronie, która ma podziały wierszy wstawione, jak <br>w niektórych nagłówkach. Zakładając, że nie mogę edytować źródłowego kodu HTML, czy jest sposób, aby w CSS zignorować te przerwy?

Optymalizuję witrynę pod kątem urządzeń mobilnych, więc nie chcę używać JavaScript.


1
@Ben Johnson mk2: Odpowiedź na Twoje pytanie: „Chciałbym znaleźć rozwiązanie odpowiedzi @Aneesh Karthik C na firefox i operę”, że nie jest to możliwe przy użyciu brelementów! Powody są już wyjaśnione wiele razy! W mojej odpowiedzi pokazałem alternatywną metodę osiągnięcia celu w prawidłowy, niezawodny i cross-przeglądarkowy sposób.
Netsurfer

Odpowiedzi:


198

Dzięki css możesz „ukryć” tagi br i nie będą one miały żadnego efektu:

br {
    display: none;
}

Jeśli chcesz ukryć tylko niektóre elementy w określonym typie nagłówka, po prostu wprowadź bardziej szczegółowy CSS.

h3 br {
    display: none;
}

11
Koniecznie przyjrzyj się również odpowiedzi Aneesha, jest ona istotna i rozwiązuje problem, którego enobrev nie uwzględnił w swoim.
Rick Calder

3
Zgoda, odpowiedź Aneesha to fantastyczny dodatek. stackoverflow.com/a/18040142/14651
enobrev

2
To rozwiązanie nie działa w przeglądarce Firefox. Jeśli <br/> nie ma wokół niego spacji, łączy słowa wokół <br/> razem. Oto próbka. Możesz zobaczyć dyskusję na ten temat poniżej
shinesecret

1
Jeśli Twoim celem jest responsywny projekt, jedynym rozwiązaniem dla różnych przeglądarek jest @ Netsurfer. Nie odpowiada na pytanie dokładnie tak, jak podano, ale osiąga cel we wszystkich nowoczesnych przeglądarkach.
Andrew Lundin,

94

Uwaga: to rozwiązanie działa tylko w przeglądarkach Webkit, które nieprawidłowo stosują pseudoelementy do samozamykających się tagów.

W uzupełnieniu powyższych odpowiedzi warto zauważyć, że w niektórych przypadkach należy wstawić spację zamiast po prostu ignorować <br>:

Na przykład powyższe odpowiedzi zmienią się

Monday<br>05 August

do

Monday05 August

jak zweryfikowałem, próbując sformatować mój tygodniowy kalendarz wydarzeń. Preferowane jest wstawienie spacji po wyrazie „poniedziałek”. Można to łatwo zrobić, wstawiając w CSS:

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

To sprawi

Monday<br>05 August

wygląda jak

Monday 05 August

Możesz zmienić contentatrybut w br:afterna, ', 'jeśli chcesz oddzielić przecinkami, lub umieścić w nim cokolwiek, co chcesz, ' 'aby był to separator! tak poza tym

Monday, 05 August

wygląda schludnie ;-)

Zobacz tutaj dla odniesienia.

Podobnie jak w powyższych odpowiedziach, jeśli chcesz, aby był on specyficzny dla tagu, możesz. Jeśli chcesz, aby ta właściwość działała dla tagu <h3>, po prostu dodaj na przykład h3każdą przed bri br:after.

Działa najbardziej ogólnie dla pseudotagów.


2
tak bardzo, bardzo genialne!
Jon

1
Dobra robota, właściwie myślę o konsekwencjach zwykłego wyłączenia go!
Rick Calder

10
Słuszna uwaga, ale wydaje się, że działa tylko z przeglądarkami Webkit (Chrome i Safari) z Firefox i IE ta technika nie działa, sprawdź jsfiddle.net/nicooprat/ZHxNA z Firefox i IE ... wszelkie pomysły, jak wymienić br z przestrzenią tak, aby działała ze wszystkimi głównymi braowserami?
firepol

6
@firepol: Właściwie to Firefox i IE robią rzeczy "poprawnie", ponieważ <br />jest jednym elementem, nad którym pseudoelement nie powinien działać . I contentdziała tylko na pseudo-elementów.
ScottS,

7
To bardzo złe rozwiązanie, głównie z powodu tego, co już napisał @ScottS. „Treść” ma działać tylko z pseudoelementami, a pseudoelementy nie powinny działać z samozamykającymi się tagami. Na razie to może działać, ale nie odważyłbym się nazwać tego rozwiązania przyszłościowym.
nd_macias

16

Jeśli dodasz w stylu

br{
    display: none;
}

Wtedy to zadziała. Nie jestem jednak pewien, czy zadziała w starszych wersjach IE.


3
to zostało wysłane wcześniej i ma mniej głosów… jak to się stało?
Mr_Green

Czasami po prostu jesteśmy ignorowani; (
Tim B James,

@TimBJames, nie działa w FIREFOX, możesz sprawdzić mój szczegółowy komentarz powyżej
shinesecret

12

Oto jak to robię:

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

7

Możesz użyć spanelementów zamiast metody, brjeśli chcesz, aby metoda białych znaków działała, ponieważ zależy to od pseudoelementów, które są „niezdefiniowane” dla zastępowanych elementów.

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

PRÓBNY

Przerwanie linii uzyskuje się po prostu przez ustawienie odpowiedniego elementu rozpiętości na display:block.

Używając identyfikatorów i / lub klas w znacznikach HTML, możesz łatwo kierować reklamy na każdy pojedynczy element lub kombinację elementów span przez CSS lub użyć selektorów CSS, takich jak nth-child().

Możesz więc np. Zdefiniować różne punkty przerwania, używając zapytań o media dla responsywnego układu.

Możesz także po prostu dodawać / usuwać / przełączać klasy za pomocą JavaScript (jQuery).

„Zaletą” tej metody jest jej solidność - działa w każdej przeglądarce obsługującej pseudoelementy (patrz: Czy mogę używać - zawartość generowana przez CSS ).

Alternatywnie można również dodać podział wiersza za pomocą pseudoelementów:

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

PRÓBNY


4
Czy przegapiłeś tę część pytania: „Zakładając, że nie mogę edytować kodu źródłowego html”?
ScottS,

1
@ScottS: Nie, nie zrobiłem. Może przegapiłeś część: „Chciałbym znaleźć rozwiązanie dla odpowiedzi @Aneesh Karthik C na firefox i operę” (ponieważ ten, który rozpoczął nagrodę, nie jest OP). Odpowiedź na to jest taka, że ​​nie jest to możliwe z <br>, a przynajmniej nie z różnymi przeglądarkami. Więc pokazałem alternatywę.
Netsurfer

2
Nie, nie przegapiłem tej części (ten OP różni się od nagrody i skupienia się na odpowiedzi Aneesh). Ale odpowiedź Aneesh jest w kontekście całego pytania, "Ignorować <br> z CSS?" Wydaje się dość oczywiste, że jeśli ktoś ma rzeczywistą kontrolę nad HTML, a następnie po prostu usuwanie tych <br>elementów rozwiązuje ten problem (prawdopodobnie zastępując je spacjami). Tak więc cała kwestia, o którą chodzi w pytaniu jako całości, polega na tym, że nie ma się kontroli nad kodem HTML ; skomplikowane przez dodatkowe zastrzeżenie, że tak naprawdę nie chcieli używać javascript (z jakiegokolwiek powodu) do rozwiązania tego problemu.
ScottS

Pytanie „Jak ignorować <br>w CSS?” został już odebrany. I tylko jeśli kontrolujesz HTML, nie oznacza to, że chcesz go zmienić. Jednak w projektowaniu responsywnym często pożądane jest kontrolowanie łamania linii (inne niż automatyczne zawijanie). I w takich przypadkach metoda posiadania białych znaków lub braku kontroli przez CSS (zapytania o media) jest co najmniej „jedną metodą” osiągnięcia celu.
Netsurfer

To działało lepiej dla mnie teraz, gdy powyższe rozwiązania nie działają już w przeglądarce Firefox.
Christos Hrousis

3

U mnie wygląda lepiej tak:

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

W tym celu możesz po prostu zrobić tak:

br{display: none;}

a jeśli jest wewnątrz jakiegoś tagu PRE, możesz i jeśli chcesz, aby tag PRE zachowywał się jak zwykły element blokowy, możesz użyć tego CSS:

pre {white-space: normal;}

Lub możesz podążać za stylem Aneesh Karthik C, na przykład:

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

Myślę, że masz to


Myślę, że przegapiłeś punkt, że pseudoelementy takie jak ::beforei ::aftersą co najmniej „niezdefiniowane” dla „elementów zastępowanych” br. Więc nigdy nie będzie spójnego zachowania przeglądarki, na którym można by polegać! Jedyne, co możesz zrobić, to nie używać pseudoelementów z tymi elementami!
Netsurfer

1

Jak na twoje pytanie, aby rozwiązać ten problem w Firefoksie i Operze przy użyciu podejścia Aneesh Karthik C , musisz dodać atrybut „float” right.

Sprawdź przykład tutaj. Ten CSS działa w przeglądarkach Firefox (26.0), Opera (12.15), Chrome (32.0.1700) i Safari (7.0)

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

Mam nadzieję, że to odpowie na Twoje pytanie !!


Właściwość content ma wpływ tylko na pseudoelementy CSS. Więc jest to absolutnie bezużyteczne w twoim demo! A jak „zneutralizować” odpowiedź brjest już (więcej niż raz). Pytanie dotyczy warunkowych białych znaków . A ponieważ wymaga to użycia pseudoelementów, nie działa zbr .
Netsurfer

Jeśli uważnie przeczytasz pytanie. Zrozumiesz odpowiedź. Widziałem powyżej odpowiedź, której najlepiej unikać <br> ustawiając ją na wyświetlanie: brak. Ale jeśli chodzi o drugie pytanie, w którym chce się dowiedzieć, jak może rozwiązać problem, który pojawia się w rozwiązaniu FF i Opera for Aneesh.
Shinesecret

Przeczytałem nie tylko pytanie, ale również wszystkie odpowiedzi i uwagi. Właściwość Content for brjest po prostu bzdurą! I nadal nie mogę zrozumieć, co pozostała część Twojej odpowiedzi ma wspólnego z „warunkowymi odstępami i przerwami liniowymi”? Może mógłbyś to dokładniej wyjaśnić, proszę?
Netsurfer

1
Twój przykład jest mylący, ponieważ masz już spacje wokół brelementów. Jeśli je usuniesz, zobaczysz, że dodawanie spacji nie działa.
ScottS

1
W twoim przykładzie masz trzy brelementy, ze spacjami przed i po pierwszym i ostatnim. To właśnie te przestrzenie sprawiają, że wydaje się, że Twoje rozwiązanie działa, podczas gdy w rzeczywistości tak nie jest. Kiedy usuniesz te spacje, tak jak to zrobiłem w moim poprawionym przykładzie, możesz zobaczyć, że twoje rozwiązanie w ogóle nie dodaje spacji w Firefoksie.
ScottS

0

Chociaż wydaje się, że to pytanie zostało już rozwiązane, zaakceptowana odpowiedź nie rozwiązała problemu w przeglądarce Firefox. Firefox (i prawdopodobnie IE, chociaż jeszcze tego nie próbowałem) pomija białe znaki podczas czytania zawartości tagu „content”. Chociaż całkowicie rozumiem, dlaczego Mozilla to zrobiła, powoduje to wiele problemów. Najłatwiejszym obejściem, jakie znalazłem, było użycie nierozerwalnych spacji zamiast zwykłych, jak pokazano poniżej.

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

Spójrz .


1
Dlaczego twoje skrzypce nie mają tego beforeelementu br? Nie masz nawet brw swoim html na skrzypcach. Częściowo problem polega na tym, beforeże nie działa brw niektórych przeglądarkach.
ScottS,

Jest to dość oczekiwane zachowanie, jak podano w specyfikacji: 2.5.1 Typowe idiomy parsera
Netsurfer.

To z pewnością dziwne, działa, gdy zastosuję go w moim projekcie. Mój tekst nie jest jednak w całości w formacie HTML, zawartość, którą zmieniam, pochodzi z bazy danych. Przepraszam, że moja odpowiedź nie pomogła.
Santo Guevarra

0

Tak, możesz to zignorować <br>. Może to być potrzebne zwłaszcza w przypadku projektowania responsywnego, w którym trzeba usunąć przerwy dla urządzeń mobilnych.

HTML

<h2>

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

</h2>

Przykład CSS dla urządzeń mobilnych

/* Resize the browser window to check */

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

Sprawdź ten Codepen:
https://codepen.io/fluidbrush/pen/pojGQyM


-1

Możesz po prostu przekonwertować go w komentarzu.

Lub możesz to zrobić:

br {
display: none;
}

Ale jeśli tego nie chcesz, dlaczego to umieszczasz?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.