Як запобігти розриву рядків у дефісах у всіх браузерах


104

У нас є ckeditor на нашій CMS. Наші кінцеві користувачі введуть кілька довгих статей через цей ckeditor. Нам потрібен спосіб запобігти розриву рядків у дефісах на цих статтях.

Чи все-таки можна запобігти перериву рядків у дефісах у всіх браузерах?

або у ckeditor є можливість запобігти цьому?


Ви можете подумати про зміну прийнятої відповіді, оскільки в поточній прийнятій відповіді є застаріле рішення
inorganik

Відповіді:


51

Боюся, немає більш простого способу зробити це надійно, ніж розділити текст на "слова" (послідовності символів, які не пробіли, розділені пробілом) і загортати кожне "слово", яке містить дефіс всередині nobrрозмітки. Отже, вхідні дані, як bla bla foo-bar bla blaби було звернутоbla bla <nobr>foo-bar</nobr> bla bla .

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


35
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 за замовчуванням у цей день та вік)? Якщо нам потрібно бути настільки педантичними, де пропонується альтернативне рішення?
Джон Рікс

274

Ви можете використовувати який є Unicode НЕ РОЗПУСКОВИЙ ГИФЕН (U + 2011).

HTML: &#x2011;або&#8209;

Також дивіться: http://en.wikipedia.org/wiki/Hyphen#In_computing


4
Дуже дякую за вашу відповідь. Але що нам потрібно зробити, це не допустити розриву рядків на ckeditor, куди весь вміст буде введено кінцевими користувачами. ми не можемо сказати всім вводити унікод нерозривного дефісу. Чи є якийсь інший спосіб запобігти розриву лінії? чи у ckeditor є можливість перетворення дефісу автоматично? Ще раз дякую
Алан

9
Ви можете зробити просту заміну рядка, замінивши -на .
деге

14
Остерігайтеся обмеженої підтримки шрифту до U + 2011, дивіться fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela

7
Хоча це, безумовно, більш елегантно в теорії, ніж оштукатурення nobrміток скрізь, на практиці це не дуже добре працює. IE відображає це як тире, Safari додає більше місця навколо нього, ніж звичайний тире, і більшість текстових редакторів відображають його як знак питання або поле або інший безглуздий символ.
Тгр

4
@jakev Я б пішов з white-space: nowrapпропозицією derekerdmann. Btw на FF / Win7 сором'язливий тире, здається, перетворюється на звичайний тире при копіюванні та вставці поза Firefox, навіть якщо цільова програма не відома Unicode.
Тгр

86

Одним з рішень може бути використання додаткового 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


1
Дуже дякую за вашу відповідь. Але наш текстовий вміст буде введено кінцевими користувачами через ckeditor. ми не можемо сказати всім додавати <span> навколо слова. Чи є якийсь інший спосіб цього досягти? Все одно дякую
Алан

1
@Alan - Який вміст вони додають, який не може зламатись у гіпсах? Якщо це заголовок або якийсь інший елемент, який завжди буде в одному рядку, то застосуйте white-space: nowrapдо всього контейнера. Інакше просто відпустіть; по-перше, немає жодних причин запобігати розриву рядків з дефісами для загального вмісту, по-друге, немає жодного способу, щоб ви не змогли автоматично отримати те, що ви шукаєте, якщо ви не захочете зламати на CKEditor.
derekerdmann

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, який може містити дефіс. Однак я підозрюю, що ви можете зіткнутися з проблемами щодо продуктивності, обробляючи кожен шматочок тексту на цілій сторінці, як це, особливо якщо елементів багато.
Sean The Bean

0

Використовуйте слово "столярний символ" ( &#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
Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Будь ласка, намагайтеся не переповнювати свій код пояснювальними коментарями, це знижує читабельність і коду, і пояснень!
Ашиш Ахуджа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.