Мягкий дефис в HTML (<wbr> против & shy;)
Как вы решаете проблему с мягкими дефисами на ваших веб-страницах? В тексте могут быть длинные слова, которые вы можете захотеть разбить на дефис. Но вы не хотите, чтобы дефис показывал, находится ли все слово в одной строке.
По комментариям на этой странице <wbr>
это нестандартный "суп-пэг, изобретенный Netscape". Это похоже на ­
также есть проблемы с соответствием стандартам. Кажется, нет никакого способа получить работающее решение для всех браузеров.
Какой у вас способ обработки мягких дефисов и почему вы его выбрали? Есть ли предпочтительное решение или лучшая практика?
Смотрите связанные ТАК обсуждения здесь.
13 ответов
К несчастью, ­
Поддержка настолько несовместима между браузерами, что ее невозможно использовать.
QuirksMode прав - сейчас нет хорошего способа использовать мягкие дефисы в HTML. Посмотрите, что вы можете сделать, чтобы обойтись без них.
2013 редактировать: согласно QuirksMode, ­
теперь работает / поддерживается во всех основных браузерах.
Итоги за февраль 2015 года (частично обновлено в ноябре 2017 года)
Все они выступают довольно хорошо, ­
ограничивает это, поскольку Google может все еще индексировать слова, содержащие это.
- В браузерах:
­
а также­
оба отображаются, как и ожидалось, в основных браузерах (даже в старых IE!).<wbr>
не поддерживается в последних версиях IE (10 или 11) и не работает должным образом в Edge. - При копировании и вставке из браузеров: (протестировано в 2015 году), как ожидается для
­
а также­
для Chrome и Firefox на Mac, в Windows (10) он сохраняет символы и вставляет жесткие дефисы в Блокнот, а невидимые мягкие дефисы - в приложения, которые их поддерживают. IE (win7) всегда вставляется с дефисами, даже в IE10, а Safari (Mac) копирует таким образом, что в некоторых приложениях (например, MS Word) вставляется как дефис, но не в других - Найти на странице работы для
­
а также­
во всех браузерах, кроме IE, который совпадает только с точными копиями и вставками (даже до IE11) - Поисковые системы: Google соответствует словам, содержащим
­
со словами, напечатанными как обычно. По состоянию на 2017 год оно больше не соответствует словам, содержащим­
, Яндекс должен быть таким же. Бинг и Байду, похоже, тоже не совпадают.
Попробуй это
Для актуального живого тестирования, вот несколько примеров уникальных слов с мягкими дефисами.
­
-confumbabbl­ication­ism
- конфумбаблизм- .............................................................................................................. confumbabblicationism
- .................................................................................................................. confumbabblicationism
<wbr>
- donfounbabbl<wbr>ication<wbr>ism
, Этот сайт удаляет <wbr/>
с выхода. Вот фрагмент jsbin.com для тестирования.
­
-eonfulbabbl­ication­ism
- eonfulbabblicationism- ................................................................................................................. eonfulbabblicationism
- .................................................................................................................... eonfulbabblicationism
Здесь они без каких-либо застенчивых дефисов (это для копирования и вставки в тестирование поиска на странице; написано так, чтобы не нарушать тесты поисковой системы):
ZZZconfumbabblicationismZZZdonfounbabblicationismZZZeonfulbabblicationismZZZ
Отображение в разных браузерах
Успех: отображается как обычное слово, кроме случаев, когда оно должно разрываться, когда оно разрывается и переносится в указанном месте.
Отказ: отображение необычно или не удается сломать в предусмотренном месте.
- Chrome (40.0.2214.115, Mac):
­
успех,<wbr>
успех,­
успех - Firefox (35.0.1, Mac):
­
успех,<wbr>
успех,­
успех - Safari (6.1.2, Mac):
­
успех,<wbr>
еще не проверено,­
успех - Edge (Windows 10):
­
успех,<wbr>
потерпеть неудачу (сломать, но без дефиса),­
успех - IE11 (Windows 10):
­
успех,<wbr>
провал (без перерыва),­
успех - IE10 (Windows 10):
­
успех,<wbr>
провал (без перерыва),­
успех - IE8 (Windows 7): ошибочно - иногда, ни один из них не работает вообще, и все они просто следуют CSS
word-wrap
, Иногда они, кажется, все работают. Пока не найдено четкой закономерности относительно того, почему. - IE7 (Windows 7):
­
успех,<wbr>
успех,­
успех
Скопируйте и вставьте в браузеры
Успех: копирование и вставка всего слова, без черты. (протестировано на вставке Mac в поиск в браузере, MS Word 2011 и Sublime Text)
Ошибка: вставка с дефисом, пробелом, переводом строки или с символами барахла.
- Chrome (40.0.2214.115, Mac):
­
успех,<wbr>
успех,­
успех - Firefox (35.0.1, Mac):
­
успех,<wbr>
успех,­
успех - Safari (6.1.2, Mac):
­
сбой в MS Word (вставляет все как дефисы), успех в других приложениях<wbr>
потерпеть неудачу,­
сбой в MS Word (вставляет все как дефисы), успех в других приложениях - IE10 (Win7):
­
неудача вставляет все как дефисы,<wbr>
потерпеть неудачу,­
неудача вставляет все как дефисы - IE8 (Win7):
­
неудача вставляет все как дефисы,<wbr>
потерпеть неудачу,­
неудача вставляет все как дефисы - IE7 (Win7):
­
неудача вставляет все как дефисы,<wbr>
потерпеть неудачу,­
неудача вставляет все как дефисы
Поисковая система соответствия
Обновлено в ноябре 2017 года. <wbr>
не проверен, потому что CMS Stackru удалил это.
Успех: поиск по всему слову без переноса находит эту страницу.
Ошибка: поисковые системы находят эту страницу только при поиске сломанных сегментов слов или слова с дефисами.
- Google:
­
выходит из строя,­
преуспевает - Bing:
­
выходит из строя,­
терпит неудачу - Baidu:
­
выходит из строя,­
терпит неудачу (может сопоставлять фрагменты в более длинных строках, но не слова, содержащие­
или же­
) - Яндекс:
­
выходит из строя,­
успешно (хотя возможно, что он соответствует фрагменту строки, как Baidu, не уверен на 100%)
Найти на странице через браузеры
Успех и неудача как поиск в поисковых системах.
- Chrome (40.0.2214.115, Mac):
­
успех,<wbr>
успех,­
успех - Firefox (35.0.1, Mac):
­
успех,<wbr>
успех,­
успех - Safari (6.1.2, Mac):
­
успех,<wbr>
успех,­
успех - IE10 (Win7):
­
сбой только совпадения, когда оба содержат застенчивые дефисы,<wbr>
успех,­
сбой только совпадения, когда оба содержат застенчивые дефисы - IE8 (Win7):
­
сбой только совпадения, когда оба содержат застенчивые дефисы,<wbr>
успех,­
сбой только совпадения, когда оба содержат застенчивые дефисы - IE7 (Win7):
­
сбой только совпадения, когда оба содержат застенчивые дефисы,<wbr>
успех,­
сбой только совпадения, когда оба содержат застенчивые дефисы
В настоящее время предпринимаются усилия по стандартизации переносов в CSS3.
Некоторые современные браузеры, особенно Safari и Firefox, уже поддерживают это. Вот хорошая и актуальная ссылка на поддержку браузера.
Как только дефис CSS будет реализован повсеместно, это будет лучшим решением. В то же время я могу порекомендовать Hyphenator - JS-скрипт, который выясняет, как сделать перенос текста таким образом, который наиболее подходит для конкретного браузера.
Hyphenator:
- использует алгоритм переноса слов Франклина М. Лианга, широко известный из LaTeX и OpenOffice.
- использует переносы CSS3 там, где это возможно,
- автоматически вставляет
­
в большинстве других браузеров, - поддерживает несколько языков,
- легко настраивается,
- изящно отступает в случае, если JavaScript не включен.
Я использовал его, и он прекрасно работает!
Я использую ­
вставляется вручную при необходимости.
Мне всегда жаль, что люди не используют методы, потому что есть какой-то - возможно, старый или странный - браузер, который не обрабатывает их так, как они были указаны. я нашел это ­
работает как в браузерах Internet Explorer, так и в Firefox, этого должно быть достаточно. Вы можете включить проверку браузера, говорящую людям использовать что-то зрелое или продолжать на свой страх и риск, если они приходят с каким-то странным браузером.
Силлабификация не так проста, и я не могу рекомендовать оставить это для некоторого Javascript. Это тема, относящаяся к конкретному языку, и, возможно, она должна быть тщательно отредактирована специалистом, если вы не хотите, чтобы текст вызывал раздражение. Некоторые языки, такие как немецкий, образуют сложные слова и могут привести к проблемам разложения. Например Spargelder
(зародыш. сэкономленные деньги, pl.) может, по правилам слогов, обернуть в двух местах (Spar-gel-der
). Однако, оборачивая его во вторую позицию, поворачиваем первую часть, чтобы показать как Spargel-
(germ. asparagus), активируя совершенно вводящую в заблуждение концепцию в голове читателя и поэтому ее следует избегать.
А как насчет строки Wachstube
? Это может означать "охранник" (Wach-stu-be
) или "тюбик с воском" (Wachs-tu-be
). Возможно, вы найдете и другие примеры на других языках. Вы должны стремиться обеспечить среду, в которой помощник может быть поддержан в создании хорошо сложенного текста, корректируя каждое критическое слово.
Очень важно отметить, что, начиная с HTML5, <wbr>
а также ­
не должны делать то же самое!
Мягкие дефисы
­
мягкий дефис, то есть U+00AD: МЯГКИЙ ГИФЕН. Например,
innehålls­förteckning
может быть представлен как
innehållsförteckning
или как
innehålls-
förteckning
На сегодняшний день мягкие дефисы работают в Firefox, Chrome и Internet Explorer.
wbr
элемент
wbr
Элемент - это возможность разрыва слова, которая не будет отображать дефис, если произойдет разрыв строки. Например,
ABCDEFG<wbr/>abcdefg
может быть представлен как
ABCDEFGabcdefg
или как
ABCDEFG
abcdefg
На сегодняшний день этот элемент работает в Firefox и Chrome.
Пространственный объект нулевой ширины может использоваться вместо <wbr>
Надежно пометить практически на любой платформе.
​
Также полезно слово " сущность соединения", которое можно использовать для запрета перерыва. (Вставьте между каждым символом слова, кроме тех, где вы хотите перерыв.)
⁠
С этими двумя вы можете делать все что угодно.
Я предлагаю использовать wbr
поэтому код можно написать так:
<p>这里有一段很长,很长的<wbr
></wbr>文字;这里有一段</p>
Это не приведет к пробелу между персонажами, в то время как ­
не остановит пробелы, созданные переносами строк.
Я успешно использовал символ дефиса в юникоде в нескольких настольных и мобильных браузерах, чтобы решить эту проблему.
Символ Юникода \u00AD
и довольно легко вставить в строку Unicode Python, как s = u'Языки и методы програм\u00ADми\u00ADро\u00ADва\u00ADния'
,
Другим решением является вставка самого символа Юникода, и исходная строка будет выглядеть совершенно обычным в редакторах, таких как Sublime Text, Kate, Geany и т. Д. (Хотя курсор будет чувствовать невидимый символ).
Шестнадцатеричные редакторы собственных инструментов могут легко автоматизировать эту задачу.
Легким ключом является использование редких и видимых символов, таких как ¦
, который легко скопировать и вставить, и заменить его на мягкий дефис, используя, например, сценарий внешнего интерфейса в $(document).ready(...)
, Исходный код как s = u'Языки и методы про¦гра¦м¦ми¦ро¦ва¦ния'.replace('¦', u'\u00AD')
легче читать, чем s = u'Языки и методы про\u00ADг\u00ADра\u00ADм\u00ADми\u00ADро\u00ADва\u00ADния'
,
Это кросс-браузерное решение, которое я недавно рассматривал и которое работает на клиенте и использует 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);
и & shy;
Сегодня вы можете использовать и то, и другое.
Пример, используйте для отображения ссылок:
https://stackru.com/questions/226464/soft-hyphen-in-html-wbr-vs-shy
&застенчивый; при необходимости на этом этапе текст будет разрываться и добавляться дефис.
Пример:
"É 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>stackru.com<wbr>/questions/226464<wbr>/soft-hyphen-in-<wbr>html-wbr-vs-shy</div>
<div>É im­pos­sí­vel pa­ra um ho­mem a­pren­der a­qui­lo que ele acha que já sa­be.</div>
Будь проще. Мягкий дефис — это просто символ. Как А или Б или . Вам не нужен специальный символ, чтобы включить его, вы можете просто ввести его (если ваш компьютер настроен на это) или скопировать/вставить его из другого места. Как здесь: Мягкий перенос в проводнике юникода
Конечно, персонаж, который вы должны скопировать, невидим, так что, я думаю, это немного усложняет :) Но это все еще работает. Щелкните правой кнопкой мыши и скопируйте.
Вам также не нужно отображать текст, содержащий мягкий дефис, каким-либо особым образом (например, «DangerouslySetInnerHTML» с React). Это просто персонаж; он работает так, как должен, во всех соответствующих браузерах, достойных любого количества соли.
В качестве примера в следующем абзаце я напишу фразу «очень длинное слово с мягкими дефисами вместо пробелов, которое должно занимать не менее двух строк текста, независимо от того, насколько велик ваш экран». Только я добавлю мягкие дефисы вместо пробелов. Вот оно:
действительно длинное слово с мягкими дефисами вместо пробела, которое должно охватывать по крайней мере две строки текста, независимо от того, насколько велик ваш экран
Если вам не повезло и вам все еще нужно использовать JSF 1, тогда единственное решение - использовать & # 173;, & shy; не работает.
Иногда веб-браузеры кажутся более щадящими, если вы используете строку Unicode ­
а не ­
юридическое лицо.