Trait d'union souple en HTML (<wbr> vs & shy;)

154

Comment résolvez-vous le problème des traits d'union souples sur vos pages Web? Dans un texte, il peut y avoir des mots longs que vous souhaiterez peut-être couper la ligne avec un tiret. Mais vous ne voulez pas que le trait d'union indique si le mot entier est sur la même ligne.

Selon les commentaires sur cette page, il <wbr> y a une "soupe aux balises inventée par Netscape" non standard. Il semble y &shy; avoir aussi des problèmes de conformité aux normes . Il semble qu'il n'y ait aucun moyen d'obtenir une solution fonctionnelle pour tous les navigateurs .

Quelle est votre façon de gérer les traits d'union souples et pourquoi l'avez-vous choisi? Existe-t-il une solution préférée ou une meilleure pratique?


Voir la discussion SO connexe ici .

Pontus
la source
Désolé d'avoir fermé plus tôt - c'est proche, mais pas tout à fait le même que l'autre. Je vais cependant quitter le lien.
Chris Marasti-Georg
2
Veuillez noter que ce <wbr>n'est pas du tout censé être un trait d'union.
Andreas Rejbrand
Pour tester les navigateurs: jsfiddle.net/k2hbrjz8/2 Soit & # 173; ou & timide; semble fonctionner comme vous le souhaitez pour l'affichage et le copier / coller. <wbr> ne sélectionne que la moitié du mot lors d'un double clic. La recherche trouve tout dans Firefox actuel (à partir de cette date de commentaire). Si & # 173; indexe mieux, utilisez-le.
karmakaze

Réponses:

132

Malheureusement, &shyle support de est tellement incohérent entre les navigateurs qu'il ne peut pas vraiment être utilisé.

QuirksMode a raison - il n'y a pas de bon moyen d'utiliser des tirets souples en HTML pour le moment. Voyez ce que vous pouvez faire pour vous en passer.

2013 edit: Selon QuirksMode , &shy;fonctionne maintenant / est pris en charge sur tous les principaux navigateurs.

Marco
la source
11
Malheureusement, ce n'est pas le cas. Essayez de rechercher un mot contenant un trait d'union souple dans votre navigateur. La plupart des navigateurs le traitent comme deux mots séparés, au lieu d'ignorer symboliquement le trait d'union souple.
gclj5
3
@ gclj5 Je viens de tester la recherche d'un &shy;mot dans Chrome v21, et il ignore correctement le trait d'union souple. Pas sûr de IE, FF et d'autres navigateurs cependant.
evanrmurphy
6
Cela fonctionne bien (c'est-à-dire que les mots peuvent être recherchés) dans FF, Chrome et Safari récents.
MMM
10
Mais copiez le texte avec & timide; dans le texte de retour Chrome avec tiret. Exemple: "uni & shy; plus tard & shy; al." copié comme "uni-later-al."
Enyby
2
Aujourd'hui, nous avons dû abandonner l' &shy;utilisation en raison de bogues spécifiques dans Webkit (affectant les dernières versions de Safari, Safari iOS et Chrome) provoquant un rendu de caractères étranges avec un nombre important de polices personnalisées (gratuites et commerciales)
Nico Pernice
58

Résumé de février 2015 (partiellement mis à jour en novembre 2017)

Ils fonctionnent tous plutôt bien, &#173;car Google peut toujours indexer les mots les contenant.

  • Dans les navigateurs: &shy; et les &#173;deux s'affichent comme prévu dans les principaux navigateurs (même l'ancien IE!). <wbr>n'est pas pris en charge dans les versions récentes d'IE (10 ou 11) et ne fonctionne pas correctement dans Edge.
  • Lorsqu'il est copié et collé à partir de navigateurs: (testé en 2015) comme prévu pour &shy;et &#173;pour Chrome et Firefox sur Mac, sous Windows (10), il conserve les caractères et colle les traits d'union dans le Bloc-notes et les traits d'union invisibles dans les applications qui les prennent en charge. IE (win7) colle toujours avec des tirets, même dans IE10, et les copies Safari (Mac) d'une manière qui colle comme des traits d'union dans certaines applications (par exemple MS Word), mais pas dans d'autres
  • La recherche sur la page fonctionne pour &shy;et &#173;sur tous les navigateurs sauf IE qui ne correspond qu'aux correspondances exactes copiées-collées (même jusqu'à IE11)
  • Moteurs de recherche: Google fait correspondre les mots contenant &#173;avec des mots tapés normalement. Depuis 2017, il semble ne plus correspondre aux mots contenant &shy;. Yandex semble être le même. Bing et Baidu semblent ne pas correspondre non plus.

Essaye-le

Pour des tests en direct à jour, voici quelques exemples de mots uniques avec des tirets souples.

  • &shy;- confumbabbl&shy;ication&shy;ism- confumbabblicationism
    • .................................................. .................................................. .......... confumbabblicationism
    • .................................................. .................................................. .............. confumbabblicationism

<wbr>- donfounbabbl<wbr>ication<wbr>ism. Ce site supprime <wbr/>de la sortie. Voici un extrait de jsbin.com à tester .

  • &#173;- eonfulbabbl&#173;ication&#173;ism- eonfulbabblicationism
    • .................................................. .................................................. ............. eonfulbabblicationism
    • .................................................. .................................................. ................ eonfulbabblicationism

Les voici sans traits d'union timides (c'est pour copier et coller dans les tests de recherche sur la page; écrit d'une manière qui ne cassera pas les tests des moteurs de recherche):

ZZZconfumbabblicationismZZZdonfounbabblicationismZZZeonfulbabblicationismZZZ

Affichage sur tous les navigateurs

Succès: affichage comme un mot normal, sauf là où il doit se casser, quand il se brise et se coupe à l'endroit spécifié.

Échec: affichage inhabituel ou échec de rupture à l'endroit prévu.

  • Chrome (40.0.2214.115, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Firefox (35.0.1, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Safari (6.1.2, Mac): &shy;succès, <wbr> pas encore testé , &#173;succès
  • Edge (Windows 10): &shy;succès, <wbr> échec (rupture mais pas de trait d'union), &#173;succès
  • IE11 (Windows 10): &shy;succès, <wbr> échec (pas de pause), &#173;succès
  • IE10 (Windows 10): &shy;succès, <wbr> échec (pas de pause), &#173;succès
  • IE8 (Windows 7): erratique - parfois, aucun d'entre eux ne fonctionne du tout et ils suivent tous simplement le CSS word-wrap. Parfois, ils semblent tous fonctionner. Pas encore trouvé de modèle clair pour expliquer pourquoi.
  • IE7 (Windows 7): &shy;succès, <wbr>succès, &#173;succès

Copier-coller dans les navigateurs

Succès: copier et coller le mot entier, sans trait d'union. (testé sur Mac collé dans la recherche du navigateur, MS Word 2011 et Sublime Text)

Échec: collage avec un trait d'union, un espace, un saut de ligne ou avec des caractères indésirables.

  • Chrome (40.0.2214.115, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Firefox (35.0.1, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Safari (6.1.2, Mac): &shy; échec dans MS Word (colle tout comme tiret), <wbr> échec du succès dans d'autres applications , &#173; échec dans MS Word (colle tout comme trait d'union), succès dans d'autres applications
  • IE10 (Win7): &shy; échoue colle tout comme tirets, <wbr> échoue , &#173; échoue colle tout comme traits d'union
  • IE8 (Win7): &shy; échoue colle tout comme tirets, <wbr> échoue , &#173; échoue colle tout comme traits d'union
  • IE7 (Win7): &shy; échoue colle tout comme tirets, <wbr> échoue , &#173; échoue colle tout comme traits d'union

Correspondance avec les moteurs de recherche

Mis à jour en novembre 2017. <wbr>non testé car le CMS de StackOverflow l'a supprimé.

Succès: recherche dans son ensemble, mot sans trait d'union trouver cette page.

Échec: les moteurs de recherche ne trouvent cette page que lors de la recherche des segments cassés des mots, ou d'un mot avec des tirets.

  • Google: &shy;échoue, &#173;réussit
  • Bing: &shy;échoue, &#173;échoue
  • Baidu: &shy;échoue, &#173;échoue (peut faire correspondre des fragments dans des chaînes plus longues mais pas les mots contenant un &#173;ou &shy;)
  • Yandex: &shy;échoue, &#173;réussit (bien qu'il soit possible qu'il corresponde à un fragment de chaîne comme Baidu, pas sûr à 100%)

Rechercher sur la page dans tous les navigateurs

Succès et échec en tant que moteur de recherche correspondant.

  • Chrome (40.0.2214.115, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Firefox (35.0.1, Mac): &shy;succès, <wbr>succès, &#173;succès
  • Safari (6.1.2, Mac): &shy;succès, <wbr>succès, &#173;succès
  • IE10 (Win7): &shy; échoue les correspondances uniquement lorsque les deux contiennent des tirets timides, <wbr>succès, &#173; échoue uniquement les correspondances lorsque les deux contiennent des tirets timides
  • IE8 (Win7): &shy; échoue les correspondances uniquement lorsque les deux contiennent des tirets timides, <wbr>succès, &#173; échoue uniquement les correspondances lorsque les deux contiennent des traits d'union timides
  • IE7 (Win7): &shy; échoue uniquement les correspondances lorsque les deux contiennent des tirets timides, <wbr>succès, &#173; échoue uniquement les correspondances lorsque les deux contiennent des traits d'union timides
user56reinstatemonica8
la source
Aujourd'hui, <wbr/>fonctionne dans Firefox et Chrome. (Et, pour être honnête, je soupçonne que même en février, du moins sous Windows.)
Andreas Rejbrand
1
J'utilise les dernières versions de Chrome et Firefox sur Windows 7 et <wbr/>fonctionne dans les deux. Veuillez noter que l' <wbr>élément n'est pas censé ajouter un trait d'union lorsqu'une rupture se produit. En d'autres termes, <wbr/>et ne&shy; sont pas censés faire la même chose .
Andreas Rejbrand
Ah, en regardant cela, il semble que le CMS de SE ait supprimé les <wbr/>s du balisage final, tout en les conservant dans le code source. Damn you SE! Will edit ..
user56reinstatemonica8
Étrange, je ne peux pas reproduire ce «bug».
Andreas Rejbrand
Y a-t-il un point à tester &shy;et &#173;? Une fois qu'ils atteignent le DOM, ils sont littéralement les mêmes ; ce n'est que dans le tokenizer HTML qu'ils sont différents.
gsnedders
32

Il y a un effort continu pour normaliser la césure dans CSS3 .

Certains navigateurs modernes, notamment Safari et Firefox, le prennent déjà en charge. Voici une bonne référence à jour sur la prise en charge des navigateurs .

Une fois la césure CSS implémentée universellement, ce serait la meilleure solution. En attendant, je peux recommander Hyphenator - un script JS qui explique comment couper votre texte de la manière la plus appropriée pour un navigateur particulier.

Césure:

  • s'appuie sur l' algorithme de césure de Franklin M. Liang , communément connu de LaTeX et OpenOffice.
  • utilise la césure CSS3 là où elle est disponible,
  • s'insère automatiquement &shy;sur la plupart des autres navigateurs,
  • prend en charge plusieurs langues,
  • est hautement configurable,
  • revient gracieusement au cas où javascript n'est pas activé.

Je l'ai utilisé et ça marche très bien!

Dominik
la source
Firefox prend en charge la propriété, mais ne fait rien lorsqu'elle est appliquée
bob0the0mighty
Je me suis trompé, Firefox fonctionne mais vous devez inclure un type de langue dans votre balise html.
bob0the0mighty
Le script Hyphenator ne semble plus maintenu, mais une nouvelle version du même auteur est disponible ici: github.com/mnater/Hyphenopoly
MattFisch
20

J'utilise &shy;, inséré manuellement si nécessaire.

Je trouve toujours dommage que les gens n'utilisent pas de techniques parce qu'il y a un navigateur - peut-être ancien ou étrange - qui ne les gère pas comme ils ont été spécifiés. J'ai trouvé que cela &shy;fonctionnait correctement dans les navigateurs Internet Explorer et Firefox récents, cela devrait suffire. Vous pouvez inclure une vérification du navigateur indiquant aux gens d'utiliser quelque chose de mature ou de continuer à leurs propres risques s'ils arrivent avec un navigateur étrange.

La syllabification n'est pas si simple et je ne peux pas recommander de la laisser à du Javascript . C'est un sujet spécifique à une langue et peut nécessiter d'être soigneusement révisé par le deskman si vous ne voulez pas que votre texte soit irritant. Certaines langues, comme l'allemand, forment des mots composés et sont susceptibles de conduire à des problèmes de décomposition. Par exemple Spargelder( germ. Argent économisé, pl.) Peut, par les règles de syllabification, être enveloppé à deux endroits ( Spar-gel-der). Cependant, l'enrouler dans la deuxième position, fait tourner la première partie pour qu'elle apparaisse comme Spargel-( germe. Asperges), activant un concept complètement trompeur dans la tête du lecteur et donc à éviter.

Et qu'en est-il de la corde Wachstube? Cela pourrait signifier «salle des gardes» ( Wach-stu-be) ou «tube de cire» ( Wachs-tu-be). Vous trouverez probablement d'autres exemples dans d'autres langues également. Vous devez viser à fournir un environnement dans lequel le deskman peut être aidé à créer un texte bien syllabifié, en relisant chaque mot critique.

Matthias Ronge
la source
6
L'exemple courant en anglais de Spar-gelder vs Spargel-der est "re-cord" vs "rec-ord" (homographes mais pas homophones). Le premier est un verbe, le second est un nom. Les algorithmes ne sont généralement pas assez intelligents pour cela, même en anglais (l'une des meilleures langues prises en charge en informatique).
Nicholas Shanks
38
Je suggérerais un échange d'experts vs un échange d'experts
CJ Dennis
13

Il est très important de noter que, à partir de HTML5, <wbr>et &shy; ne sont pas censés faire la même chose !

Trait d'union doux

&shy;est un trait d'union souple, c'est-à-dire U + 00AD: SOFT HYPHEN. Par exemple,

innehålls&shy;förteckning

pourrait être rendu comme

innehållsförteckning

ou comme

innehålls-
förteckning

À partir d'aujourd'hui, les traits d'union souples fonctionnent dans Firefox, Chrome et Internet Explorer.

L' wbrélément

L' wbrélément est une opportunité de saut de mots, qui n'affichera pas de trait d'union si un saut de ligne se produit. Par exemple,

ABCDEFG<wbr/>abcdefg

pourrait être rendu comme

ABCDEFGabcdefg

ou comme

ABCDEFG
abcdefg

À partir d'aujourd'hui, cet élément fonctionne dans Firefox et Chrome.

Andreas Rejbrand
la source
4

L' entité d' espace de largeur nulle peut être utilisée à la place d'une <wbr>balise de manière fiable sur pratiquement toutes les plates-formes.

&#8203;

Le mot entité joiner , qui peut être utilisé pour interdire une pause, est également utile . (Insérez entre chaque caractère d'un mot, sauf là où vous voulez la pause.)

&#8288;

Avec les deux, vous pouvez tout faire.

AVL geek
la source
1
Un espace de largeur nulle (ZWSP, U + 200B, &#8203;) est exactement ce qui a <wbr>fait (iirc; ça fait un moment) mais mieux supporté (universellement, de nos jours). C'est exactement ce que je cherchais, car il n'ajoute pas de trait d'union aux mots cassés, permettant par exemple aux valeurs séparées par des virgules de s'enrouler lors de l'exécution d'un s/,/,\&#8203;/gremplacement.
Adam Katz
2

C'est une solution de crossbrowser que je regardais il y a peu de temps qui s'exécute sur le client et en utilisant jQuery:

(function($) { 
  $.fn.breakWords = function() { 
    this.each(function() { 
      if(this.nodeType !== 1) { return; } 

      if(this.currentStyle && typeof this.currentStyle.wordBreak === 'string') { 
        //Lazy Function Definition Pattern, Peter's Blog 
        //From http://peter.michaux.ca/article/3556 
        this.runtimeStyle.wordBreak = 'break-all'; 
      } 
      else if(document.createTreeWalker) { 

        //Faster Trim in Javascript, Flagrant Badassery 
        //http://blog.stevenlevithan.com/archives/faster-trim-javascript 

        var trim = function(str) { 
          str = str.replace(/^\s\s*/, ''); 
          var ws = /\s/, 
          i = str.length; 
          while (ws.test(str.charAt(--i))); 
          return str.slice(0, i + 1); 
        }; 

        //Lazy Function Definition Pattern, Peter's Blog 
        //From http://peter.michaux.ca/article/3556 

        //For Opera, Safari, and Firefox 
        var dWalker = document.createTreeWalker(this, NodeFilter.SHOW_TEXT, null, false); 
        var node,s,c = String.fromCharCode('8203'); 
        while (dWalker.nextNode()) { 
          node = dWalker.currentNode; 
          //we need to trim String otherwise Firefox will display 
          //incorect text-indent with space characters 
          s = trim( node.nodeValue ).split('').join(c); 
          node.nodeValue = s; 
        } 
      } 
    }); 

    return this; 
  }; 
})(jQuery); 
Anthonyv
la source
2

Je suggère d'utiliser wbr, donc le code peut être écrit comme ceci:

<p>这里有一段很长,很长的<wbr
></wbr>文字;这里有一段</p>

Il ne fera pas d'espace entre les caractères, et &shy;n'arrêtera pas les espaces créés par les sauts de ligne.

Weijing Jay Lin
la source
2

J'ai utilisé avec succès le caractère unicode d'un trait d'union souple dans quelques navigateurs de bureau et mobiles pour résoudre le problème.

Le symbole unicode est \u00ADet est assez facile à insérer dans une chaîne unicode Python comme s = u'Языки и методы програм\u00ADми\u00ADро\u00ADва\u00ADния'.

Une autre solution consiste à insérer le caractère unicode lui-même, et la chaîne source aura l'air parfaitement ordinaire dans les éditeurs comme Sublime Text, Kate, Geany, etc. (le curseur sentira le symbole invisible cependant).

Les éditeurs hexadécimaux d'outils internes peuvent automatiser cette tâche facilement.

Un kludge facile est d'utiliser des caractères rares et visibles, comme ¦, qui sont faciles à copier et coller, et de les remplacer sur un trait d'union souple en utilisant, par exemple, un script frontal dans $(document).ready(...). Le code source comme s = u'Языки и методы про¦гра¦м¦ми¦ро¦ва¦ния'.replace('¦', u'\u00AD')est plus facile à lire que s = u'Языки и методы про\u00ADг\u00ADра\u00ADм\u00ADми\u00ADро\u00ADва\u00ADния'.

dmitry_romanov
la source
0

Parfois, les navigateurs Web semblent plus indulgents si vous utilisez la chaîne Unicode &#173;plutôt que l' &shy;entité.

Tommy Kronkvist
la source
0

Si vous n'avez pas de chance et que vous devez toujours utiliser JSF 1, la seule solution est d'utiliser & # 173 ;, & shy; ne marche pas.

Jaap D
la source
0

<wbr> et & timide;

Aujourd'hui, vous pouvez utiliser les deux.

<wbr> utilise pour casser et ne pas mettre plus d'informations.

Exemple, utilisez pour afficher les liens:

 https://stackoverflow.com/questions/226464/soft-hyphen-in-html-wbr-vs-shy

&timide;si nécessaire, à ce stade, le texte se brise et ajoute un trait d'union.

Exemple:

"Je suis & shy; pos & shy; sí & shy; vel pa & shy; ra um ho & shy; mem a & shy; pren & shy; der a & shy; qui & shy; lo que ele acha que já sa & shy; be."

div{
  max-width: 130px;
  border-width: 2px;
  border-style: dashed;
  border-color: #f00;
  padding: 10px;
}
<div>https://<wbr>stackoverflow.com<wbr>/questions/226464<wbr>/soft-hyphen-in-<wbr>html-wbr-vs-shy</div>

<div>É im&shy;pos&shy;sí&shy;vel pa&shy;ra um ho&shy;mem a&shy;pren&shy;der a&shy;qui&shy;lo que ele acha que já sa&shy;be.</div>

Roberto Góes
la source