Come prevenire l'interruzione di riga ai trattini su tutti i browser


104

Abbiamo un ckeditor sul nostro CMS. I nostri utenti finali inseriranno alcuni articoli lunghi tramite quel ckeditor. Abbiamo bisogno di un modo per evitare l'interruzione di riga ai trattini su quegli articoli.

Esiste comunque per prevenire l'interruzione di riga ai trattini su tutti i browser?

o ckeditor ha un'opzione per impedirlo?


Potresti prendere in considerazione la possibilità di modificare la risposta accettata poiché l'attuale risposta accettata ha una soluzione obsoleta
inorganik

Risposte:


50

Temo che non ci sia modo più semplice per farlo in modo affidabile che dividere il testo in "parole" (sequenze di caratteri non di spazi separati da spazi) e racchiudere ogni "parola" che contiene un trattino all'interno del nobrmarkup. Quindi i dati di input come bla bla foo-bar bla blasarebbero rivolti a bla bla <nobr>foo-bar</nobr> bla bla.

Potresti anche prendere in considerazione l'inserimento di nobrmarkup ogni volta che la "parola" contiene qualsiasi cosa tranne lettere e cifre. Il motivo è che alcuni browser possono persino interrompere stringhe come "2/3" o "f (0)" (vedere la mia pagina sulle stranezze delle interruzioni di riga nei browser ).


35
Il nobrtag non è standard e fortemente sconsigliato dal W3C. Vedi w3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann

18
A differenza di qualsiasi altro approccio, il nobrmarkup funziona su tutti i browser, funziona anche quando i fogli di stile sono disabilitati e funziona indipendentemente dal supporto ai caratteri speciali. C'è un vero problema con esso?
Jukka K. Korpela

18
Perché non <span style = "white-space: nowrap"> </span>?
Brendan Byrd

6
@ JukkaK.Korpela, il problema è che i browser moderni possono decidere di abbandonare il supporto e possono farlo senza violare le specifiche HTML. È una funzionalità "dovrebbe", che è semplicemente una cosa suggerita da implementare. Per quanto riguarda i fogli di stile, se un utente ha disabilitato i fogli di stile, si aspetta di non avere alcuno stile
mirhagk

3
Sviluppo siti da 10 anni e non sapevo nemmeno che POTREBBE disattivare i fogli di stile nel browser. Chi lo fa veramente (a parte le persone che allo stesso modo opterebbero per l'auto-flagellazione della disabilitazione di JavaScript per impostazione predefinita in questo giorno ed età)? Se dobbiamo essere così pedanti, dov'è la soluzione alternativa offerta?
John Rix

274

È possibile utilizzare un Unicode NON-BREAKING HYPHEN (U + 2011).

HTML: &#x2011;o&#8209;

Vedi anche: http://en.wikipedia.org/wiki/Hyphen#In_computing


4
Grazie mille per la risposta. Ma quello che dobbiamo fare è prevenire l'interruzione di riga su ckeditor in cui tutto il contenuto verrà inserito dagli utenti finali. non possiamo dire a tutti di inserire un trattino unico unicode. C'è un altro modo per prevenire l'interruzione di riga? o ckeditor ha un'opzione per convertire automaticamente il trattino? Grazie ancora
Alan

9
Puoi fare una semplice sostituzione della stringa, sostituendo -con .
inganno

14
Attenzione al supporto dei font limitato a U + 2011, vedere fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela

7
Sebbene questo sia certamente più elegante in teoria rispetto all'intonacatura di nobretichette ovunque , in pratica non funziona molto bene. IE lo visualizza come un trattino, Safari aggiunge più spazio attorno ad esso rispetto a un normale trattino e la maggior parte degli editor di testo lo visualizza come un punto interrogativo o una casella o un altro carattere privo di significato.
Tgr

4
@jakev vorrei andare con white-space: nowrapcome suggerito da derekerdmann. Btw su FF / Win7 il trattino timido sembra essere convertito in un trattino normale quando viene copiato e incollato fuori da Firefox, anche se l'applicazione di destinazione è compatibile con Unicode.
Tgr

86

Una soluzione potrebbe essere quella di utilizzare un spantag aggiuntivo e la white-spaceproprietà CSS. Basta definire una classe come questa:

.nowrap {
    white-space: nowrap;
}

E poi aggiungi un intervallo con quella classe intorno al testo con trattino.

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

Questo approccio dovrebbe funzionare perfettamente in tutti i browser: le implementazioni con bug elencate qui sono per altri valori della white-spaceproprietà: http://reference.sitepoint.com/css/white-space#compatibilitysection


1
Grazie mille per la risposta. Ma il nostro contenuto di testo verrà inserito dagli utenti finali tramite un ckeditor. non possiamo dire a tutti di aggiungere lo <span> intorno alla parola. C'è un altro modo per ottenerlo? Grazie comunque
Alan

1
@Alan - Che tipo di contenuto stanno aggiungendo che non può essere interrotto con le trattini? Se è un titolo o un altro elemento che sarà sempre su una riga, applicalo white-space: nowrapall'intero contenitore. Altrimenti, lascialo andare; in primo luogo, non c'è motivo per evitare interruzioni di riga con trattini per il contenuto generale e, in secondo luogo, non è possibile che ciò che stai cercando avvenga automaticamente a meno che tu non sia disposto a hackerare su CKEditor.
derekerdmann

10
Ci sono molte situazioni in cui un'interruzione di riga dopo un trattino è errata o semplicemente molto sbagliata, come in "F-1" o quando un trattino è usato come meno unario, come in "-42 °" (e le persone lo usano in questo modo, dal momento che non conoscono il segno meno).
Jukka K. Korpela

Funziona, ma il fatto che funzioni non è intuitivo, perché i trattini non sono spazi bianchi. <nobr>è molto più chiaro.
Dave Burton

2

Non puoi farlo senza modificare ogni istanza HTML. Di conseguenza, ho scritto alcuni JS per sostituirli:

jQuery:

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

Vaniglia JS:

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

1
Mi piace l'idea qui, in quanto non comporta la modifica di ogni singolo bit di HTML che può contenere un trattino. Tuttavia, sospetto che potresti incorrere in problemi di prestazioni durante l'elaborazione di ogni bit di testo su un'intera pagina come questa, soprattutto se ci sono molti elementi.
Sean the Bean

0

Utilizza la parola carattere falegname ( &#8288;) attorno al trattino. Funziona anche in IE.

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

correggere trattini specifici ...

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

o tutto ...

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

-1

Prova questo CSS:

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

7
Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni!
Ashish Ahuja
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.