Trattino soft in HTML (<wbr> vs. & shy;)


154

Come risolvi il problema con trattini morbidi sulle tue pagine web? In un testo possono esserci parole lunghe che potresti voler interrompere con un trattino. Ma non vuoi che il trattino mostri se l'intera parola è sulla stessa riga.

Secondo i commenti di questa pagina <wbr> è un "tag soup" non standard inventato da Netscape. Sembra che &shy; abbia anche problemi con la conformità standard . Sembra che non ci sia modo di ottenere una soluzione funzionante per tutti i browser .

Qual è il tuo modo di gestire i trattini morbidi e perché l'hai scelto? Esiste una soluzione preferita o una migliore pratica?


Vedi la relativa discussione SO qui .


Ci scusiamo per la chiusura anticipata: questo è vicino, ma non è lo stesso dell'altro. Andando a lasciare il link però.
Chris Marasti-Georg,

2
Si noti che <wbr>non dovrebbe essere affatto un trattino.
Andreas Rejbrand,

Per testare i browser: jsfiddle.net/k2hbrjz8/2 O & # 173; o & timido; sembra funzionare come desiderato per visualizzare e copiare / incollare. <wbr> seleziona solo la metà della parola quando si fa doppio clic. La ricerca trova tutto nell'attuale Firefox (a partire da questa data di commento). Se & # 173; indicizza meglio, usalo.
karmakaze,

Risposte:


132

Sfortunatamente, &shyil supporto è così incoerente tra i browser che non può essere realmente utilizzato.

QuirksMode ha ragione: non c'è un buon modo per usare trattini morbidi in HTML in questo momento. Guarda cosa puoi fare per andare senza di loro.

Modifica del 2013: secondo QuirksMode , &shy;ora funziona / è supportato su tutti i principali browser.


11
Sfortunatamente no. Prova a cercare una parola contenente un trattino morbido nel browser. La maggior parte dei browser lo considera come due parole separate, invece di ignorare semplicemente il trattino morbido.
gclj5,

3
@ gclj5 Ho appena provato a trovare una &shy;parola in Chrome v21 e ignora correttamente il trattino morbido. Non sono sicuro di IE, FF e altri browser però.
evanrmurphy,

6
Funziona bene (cioè le parole sono ricercabili) negli ultimi FF, Chrome e Safari.
MMM,

10
Ma copia il testo con & shy; in Chrome restituisce testo con trattino. Esempio: "uni & shy; later & shy; al." copiato come "uni-later-al".
Enyby,

2
Oggi abbiamo dovuto abbandonare l' &shy;utilizzo a causa di bug specifici in Webkit (che interessano le ultime versioni di Safari, Safari iOS e Chrome) causando il rendering di strani personaggi con un numero significativo di caratteri personalizzati (sia gratuiti che commerciali)
Nico Pernice,

58

Riepilogo febbraio 2015 (parzialmente aggiornato novembre 2017)

Si comportano tutti abbastanza bene, il vantaggio &#173;è che Google può ancora indicizzare le parole che lo contengono.

  • Nei browser: &shy; ed &#173;entrambi vengono visualizzati come previsto nei principali browser (anche vecchio IE!). <wbr>non è supportato nelle versioni recenti di IE (10 o 11) e non funziona correttamente in Edge.
  • Se copiato e incollato dai browser: (testato 2015) come previsto per &shy;e &#173;per Chrome e Firefox su Mac, su Windows (10), mantiene i caratteri e incolla i trattini rigidi nel Blocco note e i trattini morbidi invisibili nelle applicazioni che li supportano. IE (win7) incolla sempre con trattini, anche in IE10, e Safari (Mac) copia in un modo che incolla come trattini in alcune applicazioni (ad esempio MS Word), ma non in altre
  • Trova nella pagina funziona per &shy;e &#173;su tutti i browser tranne IE che corrisponde solo alle corrispondenze esatte copiate e incollate (anche fino a IE11)
  • Motori di ricerca: Google abbina parole contenenti &#173;parole digitate normalmente. A partire dal 2017 sembra non corrispondere più alle parole che contengono &shy;. Yandex sembra essere lo stesso. Bing e Baidu sembrano non corrispondere neanche.

Provalo

Per test live aggiornati, ecco alcuni esempi di parole uniche con trattini morbidi.

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

<wbr>- donfounbabbl<wbr>ication<wbr>ism. Questo sito rimuove <wbr/>dall'output. Ecco uno snippet di jsbin.com per i test .

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

Eccoli senza trattini timidi (questo è per copiare e incollare in test di ricerca; scritti in un modo che non interromperà i test dei motori di ricerca):

ZZZconfumbabblicationismZZZdonfounbabblicationismZZZeonfulbabblicationismZZZ

Visualizza attraverso i browser

Operazione riuscita: visualizzazione come una parola normale, tranne dove deve essere interrotta, quando si interrompe e viene sillabata nella posizione specificata.

Errore: visualizzazione insolita o mancata interruzione nella posizione prevista.

  • Chrome (40.0.2214.115, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Firefox (35.0.1, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Safari (6.1.2, Mac): &shy;successo, <wbr> non ancora testato , &#173;successo
  • Edge (Windows 10): &shy;esito positivo, <wbr> esito negativo (interruzione ma nessun trattino), &#173;esito positivo
  • IE11 (Windows 10): &shy;esito positivo, <wbr> esito negativo (nessuna interruzione), &#173;esito positivo
  • IE10 (Windows 10): &shy;esito positivo, <wbr> esito negativo (nessuna interruzione), &#173;esito positivo
  • IE8 (Windows 7): erratico - a volte, nessuno di loro funziona affatto e tutti seguono semplicemente css word-wrap. A volte sembrano funzionare tutti. Non ho ancora trovato uno schema chiaro sul perché.
  • IE7 (Windows 7): &shy;successo, <wbr>successo, &#173;successo

Copia e incolla tra i browser

Successo: copia e incolla dell'intera parola, non trattata. (testato su Mac incollando nella ricerca del browser, MS Word 2011 e Sublime Text)

Fallimento: incollare con un trattino, spazio, interruzione di riga o con caratteri spazzatura.

  • Chrome (40.0.2214.115, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Firefox (35.0.1, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Safari (6.1.2, Mac): &shy; fallire in MS Word (incolla tutti come trattini), successo in altre applicazioni <wbr> fallisce , &#173; fallire in MS Word (incolla tutti come trattini), successo in altre applicazioni
  • IE10 (Win7): &shy; fallisce tutte come trattini, <wbr> fallisce , &#173; fallisce tutte come trattini
  • IE8 (Win7): &shy; fallisce tutte come trattini, <wbr> fallisce , &#173; fallisce tutte come trattini
  • IE7 (Win7): &shy; fallisce tutte come trattini, <wbr> fallisce , &#173; fallisce tutte come trattini

Corrispondenza dei motori di ricerca

Aggiornato a novembre 2017. <wbr>non testato perché il CMS di StackOverflow l'ha eliminato.

Operazione riuscita: le ricerche nel complesso, la parola non sillabata trova questa pagina.

Fallimento: i motori di ricerca trovano questa pagina solo nelle ricerche per i segmenti rotti delle parole o una parola con trattini.

  • Google: &shy;fallisce, &#173;riesce
  • Bing: &shy;fallisce, &#173;fallisce
  • Baidu: &shy;fail, &#173;fail (può abbinare frammenti all'interno di stringhe più lunghe ma non le parole da sole contenenti un &#173;o &shy;)
  • Yandex: &shy;fallisce, &#173;riesce (anche se è possibile che corrisponda a un frammento di stringa come Baidu, non sicuro al 100%)

Trova sulla pagina attraverso i browser

Successo e fallimento come corrispondenza dei motori di ricerca.

  • Chrome (40.0.2214.115, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Firefox (35.0.1, Mac): &shy;successo, <wbr>successo, &#173;successo
  • Safari (6.1.2, Mac): &shy;successo, <wbr>successo, &#173;successo
  • IE10 (Win7): &shy; falliscono solo le partite quando entrambe contengono trattini timidi, <wbr>successo, &#173; falliscono solo le partite quando entrambe contengono trattini timidi
  • IE8 (Win7): &shy; falliscono solo le partite quando entrambe contengono trattini timidi, <wbr>successo, &#173; falliscono solo le partite quando entrambe contengono trattini timidi
  • IE7 (Win7): &shy; falliscono solo le partite quando entrambe contengono trattini timidi, <wbr>successo, &#173; falliscono solo le partite quando entrambe contengono trattini timidi

Oggi <wbr/>funziona su Firefox e Chrome. (E, a dire il vero, sospetto che lo abbia fatto anche a febbraio, almeno su Windows.)
Andreas Rejbrand,

1
Sto usando le ultime versioni di Chrome e Firefox su Windows 7 e <wbr/>funziona in entrambi. Si noti che l' <wbr>elemento non deve aggiungere un trattino quando si verifica un'interruzione. In altre parole, <wbr/>e &shy; sono non dovrebbe fare la stessa cosa .
Andreas Rejbrand,

Ah, guardandolo, sembra che il CMS di SE abbia rimosso le <wbr/>s dal markup finale, mantenendole nel codice sorgente. Accidenti SE! Modifica ...
user56reinstatemonica8

Strano, non riesco a riprodurre quel "bug".
Andreas Rejbrand,

C'è qualche punto nel test &shy;e &#173;? Una volta raggiunto il DOM sono letteralmente gli stessi ; solo nel tokenizer HTML sono completamente diversi.
gsnedders,

32

È in corso uno sforzo per standardizzare la sillabazione in CSS3 .

Alcuni browser moderni, in particolare Safari e Firefox, lo supportano già. Ecco un riferimento valido e aggiornato sul supporto del browser .

Una volta implementata la sillabazione CSS universalmente, quella sarebbe la soluzione migliore. Nel frattempo, posso consigliare Hyphenator , uno script JS che spiega come sillabare il testo nel modo più appropriato per un determinato browser.

Hyphenator:

  • si affida all'algoritmo di sillabazione di Franklin M. Liang , comunemente noto da LaTeX e OpenOffice.
  • usa la sillabazione CSS3 dove è disponibile,
  • si inserisce automaticamente &shy;sulla maggior parte degli altri browser,
  • supporta più lingue,
  • è altamente configurabile,
  • ricade con grazia nel caso in cui JavaScript non sia abilitato.

L'ho usato e funziona benissimo!


Firefox supporta la proprietà, ma non fa nulla quando viene applicato
bob0the0mighty

Ho sbagliato, Firefox funziona ma devi includere un tipo lang nel tuo tag html.
bob0the0mighty

La sceneggiatura di Hyphenator sembra non essere più mantenuta, ma qui è disponibile una nuova versione dello stesso autore: github.com/mnater/Hyphenopoly
MattFisch

20

Io uso &shy;, inserito manualmente dove necessario.

Trovo sempre un peccato che le persone non usino le tecniche perché c'è un browser, forse vecchio o strano, attorno al quale non le gestisce nel modo in cui sono state specificate. Ho scoperto che &shy;funziona correttamente in entrambi i recenti browser Internet Explorer e Firefox, che dovrebbe essere sufficiente. Puoi includere un controllo del browser che dice alle persone di usare qualcosa di maturo o di continuare a loro rischio se arrivano con uno strano browser.

La sillabazione non è così semplice e non posso raccomandare di lasciarlo a Javascript . Si tratta di un argomento specifico della lingua e potrebbe essere necessario rivederlo attentamente dal deskman se non si desidera che il testo venga irritato. Alcune lingue, come il tedesco, formano parole composte e possono portare a problemi di decomposizione. Ad esempio Spargelder( germ. Risparmiato, pl.) Può, in base alle regole di sillabazione, essere racchiuso in due punti ( Spar-gel-der). Tuttavia, avvolgendolo nella seconda posizione, trasforma la prima parte in modo da apparire come Spargel-( germ. Asparagi), attivando un concetto completamente fuorviante nella testa del lettore e quindi dovrebbe essere evitato.

E la stringa Wachstube? Potrebbe significare "guardroom" ( Wach-stu-be) o "tube of wax" ( Wachs-tu-be). Probabilmente potresti trovare altri esempi anche in altre lingue. Dovresti mirare a fornire un ambiente in cui il deskman possa essere supportato nella creazione di un testo ben sillabato, rilegando ogni parola critica.


6
L'esempio comune in inglese di Spar-gelder contro Spargel-der è "re-cord" vs "rec-ord" (omografi ma non omofoni). Il primo è un verbo, il secondo è un sostantivo. Gli algoritmi di solito non sono abbastanza intelligenti per questo, anche in inglese (una delle migliori lingue supportate nell'IT).
Nicholas Shanks,

38
Suggerirei scambio di esperti contro scambio di esperti
CJ Dennis il

13

È molto importante notare che, a partire da HTML5, <wbr>e &shy; non dovrebbero fare la stessa cosa !

Trattini morbidi

&shy;è un trattino morbido, cioè U + 00AD: SOFT HYPHEN. Per esempio,

innehålls&shy;förteckning

potrebbe essere reso come

innehållsförteckning

o come

innehålls-
förteckning

Ad oggi, i trattini morbidi funzionano in Firefox, Chrome e Internet Explorer.

L' wbrelemento

L' wbrelemento è un'opportunità di interruzione parola, che non visualizzerà un trattino se si verifica un'interruzione di riga. Per esempio,

ABCDEFG<wbr/>abcdefg

potrebbe essere reso come

ABCDEFGabcdefg

o come

ABCDEFG
abcdefg

Ad oggi, questo elemento funziona in Firefox e Chrome.


4

L' entità dello spazio di larghezza zero può essere utilizzata al posto del <wbr>tag in modo affidabile praticamente su ogni piattaforma.

&#8203;

Utile anche la parola entità falegname , che può essere utilizzata per vietare una pausa. (Inserisci tra ogni carattere di una parola, tranne dove desideri l'interruzione.)

&#8288;

Con questi due, puoi fare qualsiasi cosa.


1
Uno spazio di larghezza zero (ZWSP, U + 200B, &#8203;) è esattamente ciò che ha <wbr>fatto (iirc; è passato un po 'di tempo) ma meglio supportato (universalmente, al giorno d'oggi). È esattamente quello che stavo cercando, in quanto non aggiunge un trattino a parole spezzate, consentendo ad esempio di racchiudere valori separati da virgola quando si esegue una s/,/,\&#8203;/gsostituzione.
Adam Katz,

2

Questa è una soluzione crossbrowser che stavo guardando poco fa che gira sul client e usando 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); 

2

Suggerisco di usare wbr, quindi il codice può essere scritto in questo modo:

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

Non condurrà spazio tra i caratteri, mentre &shy;non fermerà gli spazi creati dalle interruzioni di riga.


2

Ho usato con successo il carattere unicode del trattino morbido in alcuni browser desktop e mobili per risolvere il problema.

Il simbolo unicode è \u00ADed è abbastanza facile da inserire nella stringa unicode Python come s = u'Языки и методы програм\u00ADми\u00ADро\u00ADва\u00ADния'.

Un'altra soluzione è quella di inserire il carattere unicode stesso, e la stringa di origine apparirà perfettamente ordinaria in editor come Sublime Text, Kate, Geany, ecc. (Il cursore sentirà comunque il simbolo invisibile).

Gli editor esadecimali di strumenti interni possono automatizzare facilmente questo compito.

Un facile kludge è usare un carattere raro e visibile, come ¦, che è facile da copiare e incollare, e sostituirlo su un trattino morbido usando, ad esempio, lo script di frontend in $(document).ready(...). Il codice sorgente come s = u'Языки и методы про¦гра¦м¦ми¦ро¦ва¦ния'.replace('¦', u'\u00AD')è più facile da leggere di s = u'Языки и методы про\u00ADг\u00ADра\u00ADм\u00ADми\u00ADро\u00ADва\u00ADния'.


0

A volte i browser Web sembrano essere più indulgenti se si utilizza la stringa Unicode &#173;anziché l' &shy;entità.


0

Se hai sfortuna e devi ancora usare JSF 1, l'unica soluzione è usare & # 173 ;, & shy; non funziona.


0

<wbr> e & timido;

Oggi puoi usare entrambi.

<wbr> usa per rompere e non mettere più informazioni.

Esempio, utilizzare per mostrare i collegamenti:

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

&timido; quando necessario, a questo punto il testo si spezzerà e aggiungerà un trattino.

Esempio:

"É 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{
  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>

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.