Мягкий дефис в HTML (<wbr> против & shy;)

154

Как вы решаете проблему с мягкими дефисами на ваших веб-страницах? В тексте могут быть длинные слова, которые вы можете захотеть разбить на дефис. Но вы не хотите, чтобы дефис показывал, находится ли все слово в одной строке.

Согласно комментариям на этой странице <wbr> есть нестандартный «суп-пэг, изобретенный Netscape». Похоже, &shy; есть свои проблемы с соответствием стандартам . Кажется, нет никакого способа получить работающее решение для всех браузеров .

Какой у вас способ обработки мягких дефисов и почему вы его выбрали? Есть ли предпочтительное решение или лучшая практика?


Смотрите связанные ТАК обсуждения здесь .

Понт
источник
Извините за закрытие ранее - это близко, но не совсем так, как другие. Собираюсь оставить ссылку, хотя.
Крис Марасти-Георг
2
Обратите внимание, что <wbr>это не должно быть дефисом вообще.
Андреас Рейбранд
Для тестирования браузеров: jsfiddle.net/k2hbrjz8/2 Либо & # 173; или & застенчивый; Кажется, работает как требуется для отображения и копирования / вставки. <wbr> выбирает только половину слова при двойном щелчке. Поиск находит все в текущем Firefox (на дату этого комментария). Если & # 173; Индексы лучше, используйте это.
Кармаказе

Ответы:

132

К сожалению, &shyподдержка между браузерами настолько противоречива, что ее невозможно использовать.

QuirksMode прав: сейчас нет хорошего способа использовать мягкие дефисы в HTML. Посмотрите, что вы можете сделать, чтобы обойтись без них.

Редактирование 2013: согласно QuirksMode , &shy;теперь работает / поддерживается во всех основных браузерах.

Marco
источник
11
К сожалению, это не так. Попробуйте найти слово, содержащее мягкий дефис в вашем браузере. Большинство браузеров рассматривают его как два отдельных слова, вместо того, чтобы игнорировать мягкий дефис.
gclj5
3
@ gclj5 Я только что проверил поиск &shy;слова в Chrome v21, и он правильно игнорирует мягкий дефис. Не уверен насчет IE, FF и других браузеров.
evanrmurphy
6
Это работает хорошо (то есть слова доступны для поиска) в недавних FF, Chrome и Safari.
МММ
10
Но скопируйте текст с помощью & shy; в Chrome вернуть текст с тире. Пример: "uni & shy; позже & shy; al." скопировано как "уни-позже-ал"
Enyby
2
Сегодня нам пришлось отказаться от &shy;использования из-за определенных ошибок в Webkit (влияющих на последние версии Safari, Safari iOS и Chrome), которые приводили к странному отображению символов со значительным количеством пользовательских шрифтов (как бесплатных, так и коммерческих)
Нико Пернис,
58

Итоги за февраль 2015 года (частично обновлено в ноябре 2017 года)

Все они работают довольно хорошо, &#173;ограничивая его, поскольку Google все еще может индексировать слова, содержащие его.

  • В браузерах: &shy; и то и &#173;другое отображается так, как ожидается в основных браузерах (даже в старых IE!). <wbr>не поддерживается в последних версиях IE (10 или 11) и не работает должным образом в Edge.
  • При копировании и вставке из браузеров: (протестировано 2015) , как ожидается , &shy;и &#173;для Chrome и Firefox на Mac, в Windows (10), он держит символы и вставляет жесткие переносы в Блокнот и невидимых мягких дефисов в приложениях , которые поддерживают их. IE (win7) всегда вставляется с дефисами, даже в IE10, а Safari (Mac) копирует таким образом, что в некоторых приложениях (например, MS Word) вставляется как дефис, но не в других
  • Поиск на странице работает для &shy;и &#173;во всех браузерах, кроме IE, который соответствует только точным совпадениям, скопированным и вставленным (даже до IE11)
  • Поисковые системы: Google сопоставляет слова, содержащие &#173;слова, набранные в обычном режиме. Начиная с 2017 года, оно больше не соответствует словам, содержащим &shy;. Яндекс должен быть таким же. Бинг и Байду, похоже, тоже не совпадают.

Попробуй это

Для актуального живого тестирования, вот несколько примеров уникальных слов с мягкими дефисами.

  • &shy;- confumbabbl&shy;ication&shy;ism- конфумбаблизм
    • .................................................. .................................................. .......... confumbabblicationism
    • .................................................. .................................................. .............. confumbabblicationism

<wbr>- donfounbabbl<wbr>ication<wbr>ism. Этот сайт удаляется <wbr/>из вывода. Вот фрагмент jsbin.com для тестирования .

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

Здесь они без каких-либо застенчивых дефисов (это для копирования и вставки в тестирование поиска на странице; написано так, чтобы не нарушать тесты поисковой системы):

ZZZconfumbabblicationismZZZdonfounbabblicationismZZZeonfulbabblicationismZZZ

Отображение в разных браузерах

Успех: отображается как обычное слово, кроме случаев, когда оно должно разрываться, когда оно разрывается и переносится в указанном месте.

Сбой: отображение необычно или не удалось сломать в предусмотренном месте.

  • Chrome (40.0.2214.115, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Firefox (35.0.1, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Safari (6.1.2, Mac): &shy;успех, еще <wbr> не проверенный , &#173;успех
  • Edge (Windows 10): &shy;успех, <wbr> неудача (разрыв, но без дефиса), &#173;успех
  • IE11 (Windows 10): &shy;успех, <wbr> сбой (без перерыва), &#173;успех
  • IE10 (Windows 10): &shy;успех, <wbr> сбой (без перерыва), &#173;успех
  • IE8 (Windows 7): ошибочно - иногда ни один из них не работает вообще, и все они просто следуют CSS word-wrap. Иногда они кажутся всем работающими. Пока не найдено четкой закономерности относительно того, почему.
  • IE7 (Windows 7): &shy;успех, <wbr>успех, &#173;успех

Скопируйте и вставьте в браузеры

Успех: копирование и вставка всего слова, без черты. (протестировано на вставке Mac в поиск в браузере, MS Word 2011 и Sublime Text)

Ошибка: вставка с дефисом, пробелом, разрывом строки или с символами нежелательной почты.

  • Chrome (40.0.2214.115, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Firefox (35.0.1, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Safari (6.1.2, Mac): &shy; сбой в MS Word (приклеивает все как дефис), успех в других приложениях <wbr> неудачи , &#173; терпят неудачу в MS Word (приклеивает все как дефис), успех в других приложениях
  • IE10 (Win7): &shy; fail вставляет все как дефисы, <wbr> fail , &#173; fail вставляет все как дефисы
  • IE8 (Win7): &shy; fail вставляет все как дефисы, <wbr> fail , &#173; fail вставляет все как дефисы
  • IE7 (Win7): &shy; fail вставляет все как дефисы, <wbr> fail , &#173; fail вставляет все как дефисы

Поисковая система соответствия

Обновлено в ноябре 2017 года. <wbr>Не тестировалось, потому что CMS StackOverflow удалил его.

Успех: поиск по всему слову без дефиса находит эту страницу.

Ошибка: поисковые системы находят эту страницу только при поиске сломанных сегментов слов или слова с дефисами.

  • Google: &shy;не удается, &#173;успешно
  • Бинг: &shy;не удается, &#173;не удается
  • Baidu: &shy;терпит неудачу, &#173;терпит неудачу (может сопоставлять фрагменты в более длинных строках, но не слова самостоятельно содержащие a &#173;или &shy;)
  • Яндекс: &shy;не удается, &#173;успешно (хотя возможно, что он соответствует фрагменту строки, как Baidu, не уверен на 100%)

Найти на странице через браузеры

Успех и неудача как поиск в поисковых системах.

  • Chrome (40.0.2214.115, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Firefox (35.0.1, Mac): &shy;успех, <wbr>успех, &#173;успех
  • Safari (6.1.2, Mac): &shy;успех, <wbr>успех, &#173;успех
  • IE10 (Win7): &shy; сбой соответствует только тогда, когда оба содержат застенчивые дефисы, <wbr>успех, &#173; сбой соответствует только тогда, когда оба содержат застенчивые дефисы
  • IE8 (Win7): совпадения &shy; сбоя только тогда, когда оба содержат застенчивые дефисы, <wbr>успех, совпадения &#173; сбоя только тогда, когда оба содержат застенчивые дефисы
  • IE7 (Win7): совпадения &shy; сбоя только тогда, когда оба содержат застенчивые дефисы, <wbr>успех, совпадения &#173; сбоя только тогда, когда оба содержат застенчивые дефисы
user56reinstatemonica8
источник
Сегодня <wbr/>работает в Firefox и Chrome. (И, честно говоря, я подозреваю, что это было даже в феврале, по крайней мере, на Windows.)
Андреас Рейбранд
1
Я использую последние версии Chrome и Firefox на Windows 7, и <wbr/>работает в обеих. Обратите внимание, что <wbr>элемент не должен добавлять дефис при разрыве. Другими словами, <wbr/>и &shy; которые не должны делать то же самое .
Андреас Рейбранд
Ах, глядя на это, похоже, что CMS SE удалил <wbr/>s из окончательной разметки, сохраняя их в исходном коде. Черт, ты ЮВ!
Отредактирую
Странно, не могу воспроизвести эту «ошибку».
Андреас Рейбранд
Есть ли смысл в тестировании &shy;и &#173;? Как только они достигают DOM, они буквально одинаковы ; только в HTML-токенайзере они вообще разные.
gsnedders
32

В настоящее время предпринимаются усилия по стандартизации переносов в CSS3 .

Некоторые современные браузеры, особенно Safari и Firefox, уже поддерживают это. Вот хорошая и актуальная ссылка на поддержку браузера .

Как только дефис CSS будет реализован повсеместно, это будет лучшим решением. В то же время я могу порекомендовать Hyphenator - JS-скрипт, который выясняет, как сделать перенос текста таким образом, который наиболее подходит для конкретного браузера.

Hyphenator:

  • использует алгоритм переноса слов Франклина М. Лианга , широко известный из LaTeX и OpenOffice.
  • использует переносы CSS3 там, где это возможно,
  • автоматически вставляется &shy;в большинство других браузеров,
  • поддерживает несколько языков,
  • легко настраивается,
  • изящно отступает в случае, если JavaScript не включен.

Я использовал его, и он прекрасно работает!

Dominik
источник
Firefox поддерживает свойство, но ничего не делает при применении
bob0the0mighty
Я был неправ, Firefox работает, но вы должны включить тип lang в свой HTML-тег.
bob0the0mighty
Сценарий Hyphenator, похоже, больше не поддерживается, но здесь доступна новая версия того же автора: github.com/mnater/Hyphenopoly
MattFisch
20

Я использую &shy;, вставляется вручную, где это необходимо.

Мне всегда жаль, что люди не используют методы, потому что есть какой-то - возможно, старый или странный - браузер, который не обрабатывает их так, как они были указаны. Я обнаружил, что &shy;это работает должным образом и в недавних браузерах Internet Explorer и Firefox, этого должно быть достаточно. Вы можете включить проверку браузера, которая говорит людям использовать что-то зрелое или продолжать на свой страх и риск, если они приходят с каким-то странным браузером.

Силлабификация не так просто и я не могу рекомендовать оставить это для некоторого Javascript . Это тема, относящаяся к конкретному языку, и, возможно, она должна быть тщательно отредактирована специалистом, если вы не хотите, чтобы текст раздражал. Некоторые языки, такие как немецкий, образуют сложные слова и могут привести к проблемам разложения. Например, Spargelder( зародыш. Сэкономленные деньги, pl.) Может, по правилам слогов, оборачиваться в двух местах ( Spar-gel-der). Однако, завернув его во вторую позицию, поворачивает первую часть, чтобы показать как Spargel-( germ. Asparagus), активируя полностью вводящую в заблуждение концепцию в голове читателя, и поэтому его следует избегать.

А как насчет строки Wachstube? Это может означать «комната охраны» (Wach-stu-be ) или «тюбик с воском» ( Wachs-tu-be). Возможно, вы найдете и другие примеры на других языках. Вы должны стремиться обеспечить среду, в которой помощник может быть поддержан в создании хорошо составленного текста, корректуры каждого критического слова.

Матиас Ронге
источник
6
Распространенным примером в английском языке Spar-gelder против Spargel-der является «re-cord» против «rec-ord» (гомографии, но не гомофоны). Первый глагол, второй существительное. Алгоритмы обычно недостаточно умны для этого, даже на английском (один из лучших поддерживаемых языков в ИТ).
Николас Шенкс
38
Я бы предложил обмен экспертами против обмена экспертами
CJ Dennis
13

Очень важно заметить, что, начиная с HTML5, <wbr>и &shy; не предполагается делать то же самое !

Мягкие дефисы

&shy;мягкий дефис, то есть U + 00AD: МЯГКИЙ ГИФЕН. Например,

innehålls&shy;förteckning

может быть представлен как

innehållsförteckning

или как

innehålls-
förteckning

На сегодняшний день мягкие дефисы работают в Firefox, Chrome и Internet Explorer.

wbrэлемент

wbrЭлемент является возможностью слова-брейк, который не будет отображаться дефисом , если происходит разрыв строки. Например,

ABCDEFG<wbr/>abcdefg

может быть представлен как

ABCDEFGabcdefg

или как

ABCDEFG
abcdefg

На сегодняшний день этот элемент работает в Firefox и Chrome.

Андреас Рейбранд
источник
4

Пространство нулевой ширины объект может быть использован вместо <wbr>тега надежно практически на любой платформе.

&#8203;

Также полезно слово «соединение» , которое можно использовать для запрета перерыва. (Вставьте между каждым символом слова, кроме тех, где вы хотите перерыв.)

&#8288;

С этими двумя вы можете делать все что угодно.

AVL Компьютерщик
источник
1
Пробел с нулевой шириной (ZWSP, U + 200B, &#8203;) - это именно то, что <wbr>сделал (iirc; это было давно), но лучше поддерживается (повсеместно, в настоящее время). Это именно то, что я искал, так как он не добавляет дефис к разбитым словам, позволяя, например, значениям через запятую переноситься при выполнении s/,/,\&#8203;/gзамены.
Адам Кац
2

Это кросс-браузерное решение, которое я недавно рассматривал и которое работает на клиенте и использует 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
источник
2

Я предлагаю использовать wbr, поэтому код можно написать так:

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

Это не приведет к пробелу между символами, &shy;и не остановит пробелы, созданные переносами строк.

Вэйцзин Джей Лин
источник
2

Я использовал мягкий дефис Unicode символов успешно в нескольких настольных и мобильных браузерах, чтобы решить эту проблему.

Символ Unicode \u00ADдостаточно легко вставить в строку Unicode Python, например:s = u'Языки и методы програм\u00ADми\u00ADро\u00ADва\u00ADния' .

Другое решение состоит в том, чтобы вставить сам символ Юникода, и исходная строка будет выглядеть совершенно обычным в редакторах, таких как Sublime Text, Kate, Geany и т. Д. (Хотя курсор будет чувствовать невидимый символ).

Шестнадцатеричные редакторы собственных инструментов могут легко автоматизировать эту задачу.

Легкий ключ - использовать редкий и видимый символ, например ¦, который легко копировать и вставлять, и заменять его на мягкий дефис, используя, например, скрипт frontend в $(document).ready(...). Исходный код вроде s = u'Языки и методы про¦гра¦м¦ми¦ро¦ва¦ния'.replace('¦', u'\u00AD')легче читать, чем s = u'Языки и методы про\u00ADг\u00ADра\u00ADм\u00ADми\u00ADро\u00ADва\u00ADния'.

dmitry_romanov
источник
0

Иногда веб-браузеры кажутся более щадящими, если вы используете строку Unicode, &#173;а не &shy;сущность.

Томми Кронквист
источник
0

Если вам не повезло и вы все еще должны использовать JSF 1, тогда единственное решение - использовать & # 173 ;, & shy; не работает.

Яап Д
источник
0

<wbr> и & shy;

Сегодня вы можете использовать оба.

<wbr> используйте, чтобы сломать и не ставить больше информации.

Пример, используйте, чтобы показать ссылки:

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

&застенчивый; когда это необходимо, в этот момент текст обрывается и добавляется дефис.

Пример:

"Я имеешь дело, ты делаешь", я люблю тебя, я тебя люблю.

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>

Роберто Гоес
источник