Jak zapobiegać łamaniu linii w łącznikach we wszystkich przeglądarkach


106

Mamy ckeditor w naszym CMS. Nasi użytkownicy końcowi będą wprowadzać długie artykuły za pośrednictwem tego ckeditor. Potrzebujemy sposobu, aby zapobiec łamaniu linii w łącznikach w tych artykułach.

Czy w ogóle istnieje możliwość zapobiegania łamaniu linii w łącznikach we wszystkich przeglądarkach?

czy ckeditor ma opcję, aby temu zapobiec?


Możesz rozważyć zmianę zaakceptowanej odpowiedzi, ponieważ obecnie zaakceptowana odpowiedź ma przestarzałe rozwiązanie
inorganik

Odpowiedzi:


52

Obawiam się, że nie ma prostszego sposobu na zrobienie tego niezawodnie niż podzielenie tekstu na „słowa” (sekwencje znaków niebędących białymi znakami oddzielone spacjami) i zawijanie każdego „słowa”, które zawiera łącznik wewnątrz nobrznacznika. Więc dane wejściowe, takie jak bla bla foo-bar bla blazostałyby zwrócone bla bla <nobr>foo-bar</nobr> bla bla.

Możesz nawet rozważyć wstawienie nobrznaczników, ilekroć „słowo” zawiera wszystko oprócz liter i cyfr. Powodem jest to, że niektóre przeglądarki mogą nawet łamać ciągi znaków, takie jak „2/3” lub „f (0)” (zobacz moją stronę dotyczącą dziwnych przypadków łamania linii w przeglądarkach ).


36
nobrTag nie jest standardem, i zdecydowanie odradzane przez W3C. Zobacz w3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann

18
W przeciwieństwie do innych metod, nobrznaczniki działają we wszystkich przeglądarkach, działają nawet wtedy, gdy arkusze stylów są wyłączone i działają niezależnie od obsługi znaków specjalnych. Czy jest z tym prawdziwy problem?
Jukka K. Korpela

18
Dlaczego nie <span style = "white-space: nowrap"> </span>?
Brendan Byrd,

6
@ JukkaK.Korpela problem polega na tym, że współczesne przeglądarki mogą zdecydować o rezygnacji z jego obsługi i mogą to zrobić bez naruszania specyfikacji HTML. Jest to funkcja „powinna”, która jest jedynie sugerowaną rzeczą do zaimplementowania. Jeśli chodzi o arkusze stylów, jeśli użytkownik wyłączył arkusze stylów, oczekuje, że nie będzie miał żadnych stylów
mirhagk

3
Tworzę witryny od 10 lat i nawet nie wiedziałem, że MOŻESZ wyłączyć arkusze stylów w przeglądarce. Kto to naprawdę robi (poza ludźmi, którzy w podobny sposób wybraliby samobiczowanie polegające na domyślnym wyłączaniu JavaScript w dzisiejszych czasach)? Jeśli musimy być tak pedantyczni, gdzie jest oferowane alternatywne rozwiązanie?
John Rix

275

Możesz użyć ŁĄCZNIKA NIEŁAMANIAJĄCEGO Unicode (U + 2011).

HTML: &#x2011;lub&#8209;

Zobacz także: http://en.wikipedia.org/wiki/Hyphen#In_computing


4
Bardzo dziękuję za odpowiedź. Ale to, co musimy zrobić, to zapobiec łamaniu linii w ckeditor, gdzie cała zawartość zostanie wprowadzona przez użytkowników końcowych. nie możemy powiedzieć każdemu, aby wprowadzał nierozdzielający łącznik Unicode. Czy jest jakiś inny sposób, aby zapobiec przerwaniu linii? czy ckeditor ma opcję automatycznej konwersji łącznika? Jeszcze raz dziękuję
Alan

9
Można zrobić prostą wymianę strun, zastępując -z .
deceze

14
Uważaj na ograniczoną obsługę czcionek do U + 2011, patrz fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela

7
Chociaż jest to z pewnością bardziej eleganckie w teorii niż nakładanie tynków nobrna całym miejscu, w praktyce nie działa zbyt dobrze. IE wyświetla to jako półpauzę, Safari dodaje więcej miejsca wokół niego niż zwykła myślnik, a większość edytorów tekstu wyświetla go jako znak zapytania, ramkę lub inny bezsensowny znak.
Tgr

5
@jakev, z którym poszedłbym white-space: nowrapzgodnie z sugestią derekerdmanna. Przy okazji na FF / Win7 nieśmiała myślnik wydaje się być konwertowana na zwykłą myślnik podczas kopiowania i wklejania poza Firefox, nawet jeśli aplikacja docelowa obsługuje Unicode.
Tgr

88

Jednym z rozwiązań mogłoby być użycie dodatkowego spantagu i white-spacewłaściwości CSS. Po prostu zdefiniuj taką klasę:

.nowrap {
    white-space: nowrap;
}

A następnie dodaj rozpiętość z tą klasą wokół dzielonego tekstu.

<p>This is the <span class="nowrap">anti-inflammable</span> model</p>

To podejście powinno działać dobrze we wszystkich przeglądarkach - wymienione tutaj błędne implementacje dotyczą innych wartości white-spacewłaściwości: http://reference.sitepoint.com/css/white-space#compatibilitysection


1
Bardzo dziękuję za odpowiedź. Ale nasza zawartość tekstowa zostanie wprowadzona przez użytkowników końcowych za pośrednictwem ckeditor. nie możemy powiedzieć wszystkim, aby dodali <span> dookoła słowa. Czy jest inny sposób, aby to osiągnąć? W każdym razie dzięki
Alan

1
@Alan - Jakie treści dodają, które nie mogą się zepsuć? Jeśli jest to tytuł lub inny element, który zawsze będzie w jednym wierszu, zastosuj white-space: nowrapdo całego kontenera. W przeciwnym razie po prostu odpuść; po pierwsze, nie ma powodu, aby zapobiegać przerywaniu wierszy łącznikami w przypadku ogólnej treści, a po drugie, nie ma możliwości, aby to, czego szukasz, działo się automatycznie, chyba że chcesz zhakować CKEditor.
derekerdmann

10
Jest wiele sytuacji, w których podział wiersza po łączniku jest zły lub po prostu bardzo zły, jak w „F-1” lub kiedy myślnik jest używany jako jednoargumentowy minus, jak w „-42 °” (a ludzie używają go w ten sposób, ponieważ nie wiedzą o znaku minus).
Jukka K. Korpela

To działa, ale fakt, że działa, jest nieintuicyjny, ponieważ łączniki nie są spacjami. <nobr>jest znacznie jaśniejszy.
Dave Burton,

2

Nie możesz tego zrobić bez edycji każdej instancji HTML. W konsekwencji napisałem trochę JS, aby je zastąpić:

jQuery:

//replace hypens with no-breaking ones
$txt = $("#block-views-video-block h2");
$txt.text( $txt.text().replace(/-/g, '‑') );

Vanilla JS:

function nonBrHypens(id) {
    var str = document.getElementById(id).innerHTML; 
    var txt = str.replace(/-/g, '‑');
    document.getElementById(id).innerHTML = txt;
}

1
Podoba mi się ten pomysł, ponieważ nie wymaga edycji każdego fragmentu kodu HTML, który może zawierać łącznik. Podejrzewam jednak, że możesz napotkać problemy z wydajnością podczas przetwarzania każdego fragmentu tekstu na całej takiej stronie, zwłaszcza jeśli jest dużo elementów.
Sean the Bean

1

Użyj znaku łącznika słowa ( &#8288;) wokół łącznika. Działa również w IE.

https://en.wikipedia.org/wiki/Word_joiner

popraw określone łączniki ...

function fixicecream(text) {
    return text.replace(/ice-cream/g,'ice&#8288;-&#8288;cream'));
}

albo wszystko ...

function fixhyphens(text) {
    return text.replace(/(\S+)-(\S+)/g,'$1&#8288;-&#8288;$2'));
}

-1

Wypróbuj ten CSS:

word-break: break-all; 
-webkit-hyphens:none;
-moz-hyphens: none; 
hyphens: none;

7
Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie tłoczyć kodu komentarzami wyjaśniającymi, co zmniejsza czytelność zarówno kodu, jak i wyjaśnień!
Ashish Ahuja
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.