Как предотвратить перенос строки через дефис во всех браузерах

106

На нашей CMS есть ckeditor. Наши конечные пользователи будут вводить несколько длинных статей через этот ckeditor. Нам нужен способ предотвратить перенос строки через дефис в этих статьях.

Есть ли способ предотвратить перенос строки через дефис во всех браузерах?

или у ckeditor есть возможность предотвратить это?

Алан
источник
Вы можете подумать об изменении принятого ответа, так как текущий принятый ответ имеет устаревшее решение
inorganik

Ответы:

52

Боюсь, что нет более простого способа сделать это надежно, чем разделить текст на «слова» (последовательности непробельных символов, разделенных пробелами) и обернуть каждое «слово», содержащее дефис, внутри nobrразметки. Так что входные данные вроде bla bla foo-bar bla blaбы обратились bla bla <nobr>foo-bar</nobr> bla bla.

Вы можете даже подумать о вставке nobrразметки всякий раз, когда «слово» содержит что-либо, кроме букв и цифр. Причина в том, что некоторые браузеры могут даже разрывать строки вроде «2/3» или «f (0)» (см. Мою страницу о странностях разрыва строк в браузерах ).

Юкка К. Корпела
источник
36
nobrТег не является стандартным, и настоятельно рекомендуется W3C. См. W3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann
18
В отличие от любого другого подхода, nobrразметка работает во всех браузерах, работает даже при отключенных таблицах стилей и работает независимо от поддержки специальных символов. Есть ли с этим настоящая проблема?
Юкка К. Корпела
18
Почему не <span style = "white-space: nowrap"> </span>?
Брендан Берд,
6
@ JukkaK.Korpela проблема в том, что современные браузеры могут отказаться от его поддержки и сделать это без нарушения спецификации HTML. Это функция «следует», которую можно только рекомендовать. Что касается таблиц стилей, если пользователь отключил таблицы стилей, он ожидает, что у них не будет никаких стилей
mirhagk
3
Я занимаюсь разработкой сайтов 10 лет и даже не знал, что вы МОЖЕТЕ отключить таблицы стилей в своем браузере. Кто это делает на самом деле (кроме людей, которые в наши дни аналогичным образом предпочли бы самобичевание, отключив JavaScript по умолчанию)? Если нам нужно быть такими педантичными, где же альтернативное решение?
Джон Рикс
275

Вы можете использовать, который является НЕПРЕРЫВНЫМ ДЕФИСОМ Unicode (U + 2011).

HTML: &#x2011;или&#8209;

См. Также: http://en.wikipedia.org/wiki/Hyphen#In_computing

обмануть
источник
4
Большое спасибо за ваш ответ. Но что нам нужно сделать, так это предотвратить разрыв строки на ckeditor, где весь контент будет вводиться конечными пользователями. мы не можем сказать всем вводить неразрывный дефис Unicode. Есть ли другой способ предотвратить разрыв строки? или у ckeditor есть возможность автоматически преобразовывать дефис? Еще раз спасибо
Алан
9
Вы можете выполнить простую замену строки, заменив ее -на .
deceze
14
Остерегайтесь ограниченной поддержки шрифтов в U + 2011, см. Fileformat.info/info/unicode/char/2011/fontsupport.htm
Юкка К. Корпела
7
Хотя в теории это, безусловно, более элегантно, чем nobrповсюду оштукатурить бирки, на практике это не очень хорошо работает. IE отображает его в виде короткого тире, Safari добавляет больше места вокруг него, чем обычное тире, а большинство текстовых редакторов отображают его в виде вопросительного знака, поля или другого бессмысленного символа.
Tgr
5
@jakev Я бы пошел с white-space: nowrapпредложением Дерекердманна. Кстати, на FF / Win7 застенчивая черточка, кажется, превращается в обычную черточку при копировании и вставке вне Firefox, даже если целевое приложение поддерживает Unicode.
Tgr
88

Одним из решений может быть использование дополнительного spanтега и white-spaceсвойства CSS. Просто определите такой класс:

.nowrap {
    white-space: nowrap;
}

А затем добавьте диапазон с этим классом вокруг текста с переносом.

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

Этот подход должен отлично работать во всех браузерах - перечисленные здесь реализации с ошибками предназначены для других значений white-spaceсвойства: http://reference.sitepoint.com/css/white-space#compatibilitysection

Derekerdmann
источник
1
Большое спасибо за ваш ответ. Но наш текстовый контент будет вводиться конечными пользователями через ckeditor. мы не можем сказать всем добавить <span> вокруг слова. Есть ли другой способ добиться этого? В любом случае спасибо
Алан
1
@Alan - Какой контент они добавляют, что не может сломить шумиху? Если это заголовок или какой-либо другой элемент, который всегда будет в одной строке, примените white-space: nowrapего ко всему контейнеру. В противном случае просто отпустите; Во-первых, нет причин предотвращать перенос строк с помощью дефисов для общего контента, а во-вторых, вы не сможете добиться того, чтобы то, что вы ищете, происходило автоматически, если вы не захотите взломать CKEditor.
derekerdmann 06
10
Есть много ситуаций, когда перенос строки после дефиса плохой или просто очень неправильный, как в «F-1», или когда дефис используется как унарный минус, как в «-42 °» (и люди используют его таким образом, так как они не знают о минусе).
Юкка К. Корпела
Это работает, но тот факт, что это работает, не является интуитивно понятным, потому что дефисы не являются пробелами. <nobr>намного понятнее.
Дэйв Бертон
2

Вы не можете сделать это без редактирования каждого экземпляра HTML. Следовательно, я написал несколько JS для их замены:

jQuery:

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

Ванильный JS:

function nonBrHypens(id) {
    var str = document.getElementById(id).innerHTML; 
    var txt = str.replace(/-/g, '‑');
    document.getElementById(id).innerHTML = txt;
}
Крис Хэппи
источник
1
Мне нравится эта идея, поскольку она не требует редактирования каждого бита HTML, который может содержать дефис. Однако я подозреваю, что у вас могут возникнуть проблемы с производительностью, обрабатывая каждый бит текста на всей странице, как эта, особенно если элементов много.
Шон Бин
1

Используйте символ объединения слов ( &#8288;) вокруг дефиса. Это работает и в IE.

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

исправить определенные дефисы ...

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

или все ...

function fixhyphens(text) {
    return text.replace(/(\S+)-(\S+)/g,'$1&#8288;-&#8288;$2'));
}
Картер Медлин
источник
-1

Попробуйте этот CSS:

word-break: break-all; 
-webkit-hyphens:none;
-moz-hyphens: none; 
hyphens: none;
Ма Юбо
источник
7
Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, это снижает удобочитаемость как кода, так и пояснений!
Ашиш Ахуджа,