Comment éviter les sauts de ligne au niveau des tirets sur tous les navigateurs

105

Nous avons un ckeditor sur notre CMS. Nos utilisateurs finaux entreront de longs articles via cet éditeur. Nous avons besoin d'un moyen d'empêcher les sauts de ligne au niveau des tirets sur ces articles.

Existe-t-il de toute façon pour éviter les sauts de ligne aux tirets sur tous les navigateurs?

ou ckeditor a-t-il une option pour empêcher cela?

Alan
la source
Vous pourriez envisager de changer la réponse acceptée car la réponse acceptée actuelle a une solution obsolète
inorganik

Réponses:

51

J'ai peur qu'il n'y ait pas de moyen plus simple de le faire de manière fiable que de diviser le texte en «mots» (séquences de caractères non blancs séparés par des espaces) et d'encapsuler chaque «mot» qui contient un trait d'union dans le nobrbalisage. Donc, les données d'entrée comme bla bla foo-bar bla blaseraient utilisées bla bla <nobr>foo-bar</nobr> bla bla.

Vous pouvez même envisager d'insérer un nobrbalisage chaque fois que le «mot» contient autre chose que des lettres et des chiffres. La raison en est que certains navigateurs peuvent même casser des chaînes comme «2/3» ou «f (0)» (voir ma page sur les bizarreries de saut de ligne dans les navigateurs ).

Jukka K. Korpela
la source
36
Le nobrtag n'est pas standard, et fortement déconseillé par le W3C. Voir w3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann
18
Contrairement à toute autre approche, le nobrbalisage fonctionne sur tous les navigateurs, fonctionne même lorsque les feuilles de style sont désactivées et fonctionne indépendamment de la prise en charge des caractères spéciaux. Y a-t-il un vrai problème avec cela?
Jukka K. Korpela
18
Pourquoi pas <span style = "white-space: nowrap"> </span>?
Brendan Byrd
6
@ JukkaK.Korpela le problème avec cela est que les navigateurs modernes peuvent décider de supprimer la prise en charge, et peuvent le faire sans violer la spécification HTML. C'est une fonctionnalité "devrait", qui n'est qu'une suggestion à implémenter. En ce qui concerne les feuilles de style, si un utilisateur a désactivé les feuilles de style, il s'attend à ne pas avoir de styles
mirhagk
3
Je développe des sites depuis 10 ans et je ne savais même pas que vous POUVEZ désactiver les feuilles de style dans votre navigateur. Qui le fait vraiment (à part les gens qui opteraient de la même manière pour l'auto-flagellation de la désactivation de JavaScript par défaut à l'heure actuelle)? Si nous devons être aussi pédants, où est la solution alternative proposée?
John Rix
275

Vous pouvez utiliser qui est un Unicode NON-BREAKING HYPHEN (U + 2011).

HTML: &#x2011;ou&#8209;

Voir également: http://en.wikipedia.org/wiki/Hyphen#In_computing

déceler
la source
4
Merci beaucoup pour votre réponse. Mais ce que nous devons faire est d'empêcher les sauts de ligne sur ckeditor où tout le contenu sera saisi par les utilisateurs finaux. nous ne pouvons pas dire à tout le monde d'entrer un tiret unicode insécable. Existe-t-il un autre moyen d'éviter les sauts de ligne? ou ckeditor a-t-il une option pour convertir automatiquement le trait d'union? Merci encore
Alan
9
Vous pouvez effectuer un simple remplacement de chaîne, en remplaçant -par .
deceze
14
Méfiez-vous de la prise en charge limitée des polices pour U + 2011, voir fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela
7
Bien que ce soit certainement plus élégant en théorie que le plâtrage d' nobrétiquettes partout, cela ne fonctionne pas très bien dans la pratique. IE l'affiche sous forme de tiret en fr, Safari ajoute plus d'espace autour de lui qu'un tiret normal, et la plupart des éditeurs de texte l'affiche sous forme de point d'interrogation, de boîte ou de tout autre caractère dénué de sens.
Tgr
4
@jakev J'irais avec white-space: nowrapcomme suggéré par derekerdmann. Btw sur FF / Win7, le tiret timide semble être converti en un tiret normal lorsqu'il est copié et collé en dehors de Firefox, même si l'application cible est compatible Unicode.
Tgr
87

Une solution pourrait être d'utiliser une spanbalise supplémentaire et la white-spacepropriété CSS. Définissez simplement une classe comme celle-ci:

.nowrap {
    white-space: nowrap;
}

Et puis ajoutez une étendue avec cette classe autour de votre texte coupé.

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

Cette approche devrait fonctionner correctement dans tous les navigateurs - les implémentations de bogues répertoriées ici sont pour d'autres valeurs de la white-spacepropriété: http://reference.sitepoint.com/css/white-space#compatibilitysection

Derekerdmann
la source
1
Merci beaucoup pour votre réponse. Mais notre contenu textuel sera saisi par les utilisateurs finaux via un ckeditor. nous ne pouvons pas dire à tout le monde d'ajouter le <span> autour du mot. Y a-t-il un autre moyen d'y parvenir? Merci quand même
Alan
1
@Alan - Quel genre de contenu ajoutent-ils qui ne peut pas être brisé aux hypens? S'il s'agit d'un titre ou d'un autre élément qui sera toujours sur une seule ligne, appliquez-le white-space: nowrapà l'ensemble du conteneur. Sinon, laissez tomber; Premièrement, il n'y a aucune raison d'empêcher les sauts de ligne avec des traits d'union pour le contenu général, et deuxièmement, il n'y a aucun moyen que vous puissiez obtenir automatiquement ce que vous cherchez à moins que vous ne soyez prêt à pirater CKEditor.
derekerdmann
10
Il existe de nombreuses situations où un saut de ligne après un trait d'union est mauvais ou tout simplement très faux, comme dans «F-1» ou lorsqu'un trait d'union est utilisé comme un moins unaire, comme dans «-42 °» (et les gens l'utilisent de cette façon, puisqu'ils ne connaissent pas le signe moins).
Jukka K. Korpela
Cela fonctionne, mais le fait que cela fonctionne n'est pas intuitif, car les traits d'union ne sont pas des espaces blancs. <nobr>est beaucoup plus clair.
Dave Burton
2

Vous ne pouvez pas le faire sans modifier chaque instance HTML. Par conséquent, j'ai écrit quelques JS pour les remplacer:

jQuery:

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

Vanille JS:

function nonBrHypens(id) {
    var str = document.getElementById(id).innerHTML; 
    var txt = str.replace(/-/g, '‑');
    document.getElementById(id).innerHTML = txt;
}
Chris heureux
la source
1
J'aime l'idée ici, car elle n'implique pas de modifier chaque bit de HTML pouvant contenir un trait d'union. Cependant, je soupçonne que vous pourriez rencontrer des problèmes de performances en traitant chaque bit de texte sur une page entière comme celle-ci, surtout s'il y a beaucoup d'éléments.
Sean the Bean
0

Utilisez le caractère de menuisier mot ( &#8288;) autour du tiret. Cela fonctionne également dans IE.

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

corriger des traits d'union spécifiques ...

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

ou tout ...

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

Essayez ce CSS:

word-break: break-all; 
-webkit-hyphens:none;
-moz-hyphens: none; 
hyphens: none;
Ma Yubo
la source
7
Bien que cet extrait de code puisse résoudre la question, inclure une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, cela réduit la lisibilité du code et des explications!
Ashish Ahuja