Как не допустить, чтобы длинные слова ломали мой div?

С момента перехода с TABLE-layout на DIV-layout осталась одна общая проблема:

ПРОБЛЕМА: вы заполняете свой DIV динамическим текстом, и неизбежно появляется сверхдлинное слово, которое выходит за край столбца div и делает ваш сайт непрофессиональным.

RETRO-WHINING. Этого никогда не случалось с макетами таблиц. Ячейка таблицы всегда красиво расширяется до ширины самого длинного слова.

ТЯЖЕСТЬ. Я вижу эту проблему даже на самых крупных сайтах, особенно на немецких сайтах, где даже общие слова, такие как «ограничение скорости», очень длинные («Geschwindigkeitsbegrenzung»).

Есть ли у кого-нибудь работоспособное решение этого?


person Edward Tanguay    schedule 26.11.2008    source источник
comment
Вы, должно быть, забыли эти супер-растянутые и эффектно сломанные раскладки стола. Я возьму overflow: hidden в любой день над бесконтрольно растягивающимися ячейками.   -  person Kornel    schedule 26.11.2008
comment
Ячейка таблицы всегда будет красиво ???????? расширить до ширины самого длинного слова   -  person inspite    schedule 26.11.2008
comment
Да, обычно довольно красиво, как в случае приведенного ниже рисунка из связанного столбца Stackoverflow, если бы это была ТАБЛИЦА вместо DIV, она была бы немного шире и по-прежнему выглядела бы красиво - очень прагматично. Было бы неплохо, если бы можно было включить в DIV что-то вроде word-wrap: expand.   -  person Edward Tanguay    schedule 26.11.2008
comment
Я знаю много людей (и я бы, наверное, причислял себя к ним), которые сказали бы, что это гораздо худшее поведение. Ширина страницы и элемента обычно требует много времени. Если у вас могут быть случайные слова, делающие ширину неконтролируемой, вы потерпели неудачу с вашим дизайном.   -  person Oli    schedule 26.11.2008
comment
Мне всегда казалось, что поведение таблицы больше соответствует исходной философии гибкости HTML. Философия жесткой ширины столбцов DIV / CSS, похоже, исходит от дизайнеров журналов, которые не могут справиться с тем, что их столбцы иногда шире, а иногда уже.   -  person Edward Tanguay    schedule 26.11.2008
comment
Хороший дизайн должен быть последовательным; если содержимое страницы может изменять размеры пользовательского интерфейса, это нарушит дизайн. Серьезно, где бы вы нарисовали линию с эластичным макетом? Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch?   -  person Doctor Jones    schedule 26.11.2008
comment
Я понимаю что ты имеешь ввиду. ;-)   -  person Edward Tanguay    schedule 26.11.2008
comment
Да, это не имеет ничего общего с тем, чтобы быть сверхстрогим к дизайну (с точки зрения артистизма), и более того, чтобы вещи оставались постоянными и удобными. Если в таблицах (и в этом поле для комментариев) отображается весь контент, это означает, что другие комментарии теперь практически не читаются.   -  person Oli    schedule 26.11.2008
comment
(Если вы хотите прочитать эти комментарии, просто скопируйте и вставьте их в текстовый редактор.)   -  person Edward Tanguay    schedule 26.11.2008
comment
Как мне найти источник этого блока, чтобы узнать, является ли это DIV или действительно ТАБЛИЦА? Это не в поле зрения источника. Разве у меня нет доступа к текущему тексту DOM, даже если он введен AJAX?   -  person Edward Tanguay    schedule 26.11.2008
comment
Пусть это будет уроком, что встраивание размещенных на внешнем сервере изображений в вопросы SO - плохая идея.   -  person Lightness Races in Orbit    schedule 28.06.2011
comment
@ Эдвард: Посмотрите, как газеты делали это на протяжении сотен лет.   -  person Lightness Races in Orbit    schedule 28.06.2011
comment
Актуальный ответ (2014 г.) stackoverflow.com/questions/802175/   -  person Adrien Be    schedule 20.11.2014
comment
Напомни мне никогда не играть в скрэббл против немца. Эта штука должна стоить 300 очков! Решение 2016 года: добавьте в свой CSS: word-wrap: break-word; В зависимости от того, что вы хотите поддерживать, могут потребоваться префиксы браузера. Также имейте в виду, что элемент или родительский элемент (какой бы элемент ни определял, какую ширину вы хотите разрешить) должны иметь определенную ширину, иначе перенос слов не вступит в силу. Надеюсь, это поможет.   -  person Tom Walker    schedule 23.01.2016


Ответы (25)


Мягкий дефис

Вы можете указать браузерам, где следует разделять длинные слова, вставив мягкий дефис (­):

averyvery­longword

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

очень длинное слово

or

аверивери-
длинное слово

Хорошее регулярное выражение может гарантировать, что вы не будете вставлять их, если в этом нет необходимости:

/([^\s-]{5})([^\s-]{5})/ → $1­$2

Браузеры и поисковые системы достаточно умен, чтобы игнорировать этот символ при поиске текста, а Chrome и Firefox (другие не тестировали) игнорируют его при копировании текста в буфер обмена.

<wbr> элемент

Другой вариант - внедрить <wbr>, бывший IE-ism, который теперь в HTML5 :

averyvery<wbr>longword

Переносы без дефиса:

averyvery
длинное слово

Вы можете добиться того же с помощью символа пробела нулевой ширины &#8203; (или &#x200B).


К вашему сведению, есть также CSS hyphens: auto, поддерживаемый последними версиями IE, Firefox и Safari (но в настоящее время не Chrome):

div.breaking {
  hyphens: auto;
}

Однако этот перенос основан на словаре переносов, и не гарантируется разрыв длинных слов. Тем не менее, это может сделать выровненный по ширине текст красивее.

Ретро-нытье решение

<table> для макета - это плохо, но display:table для других элементов - нормально. Он будет таким же изворотливым (и эластичным), как столы старой школы:

div.breaking {
   display: table-cell;
}

overflow и white-space: pre-wrap ответы ниже тоже хороши.

person Kornel    schedule 26.11.2008
comment
Прохладный! Согласно википедии, вы можете получить пространство нулевой ширины с - раз уж вы его подняли, знаете ли вы менее уродливый escape-код для него? Я запомню 8203, если нужно, но ... - person ojrac; 01.04.2009
comment
@ojrac - Это зависит от того, считаете ли вы его менее уродливым или нет. :-) AFAIK, для пространства нулевой ширины нет словесной сущности. - person Ben Blank; 01.04.2009
comment
Что ж, # x200B легче запомнить. Достаточно хорошо. - person ojrac; 02.04.2009
comment
Вы можете использовать что-то вроде TextExpander (smileonmymac.com/TextExpander), чтобы присвоить свои имена любой строке или персонаж. - person Kornel; 02.04.2009
comment
Это хорошо, но не решает исходную проблему. - person Albus Dumbledore; 02.09.2010
comment
@Smamatti: Я не видел ни одного браузера, который бы его не поддерживал, начиная с Firefox 2, который был самым последним браузером, реализующим этот стандарт 15-летней давности. - person Kornel; 26.10.2011
comment
@porneL Извини. Думаю, я еще недостаточно его проверил. Кажется, проблема с остальной частью моего CSS. &shy; действительно отлично работает во всех основных браузерах. - jsfiddle.net/Bn3th - person Smamatti; 26.10.2011
comment
К вашему сведению, вы также можете использовать ‹wbr›. См. quirksmode.org/oddsandends/wbr.html. - person HaxElit; 15.03.2012
comment
Однако я считаю, что суть здесь в том, чтобы не вводить вручную лишние символы. Это не лучшее решение, так как текст может быть произвольным, размер шрифта, различия между ОС и браузерами в рендеринге шрифтов и т. Д. См. Мой пост ниже для решения CSS. - person Neil Monroe; 19.09.2012
comment
Я изменил указанное выше регулярное выражение на /([^\s-&<>]{5})([^\s-&<>]{5})/, чтобы убедиться, что оно не нарушает HTML-теги и сущности (при условии, что у вас может быть строка потенциально с HTML-тегами) - person AsGoodAsItGets; 16.03.2016

Два исправления:

  1. overflow:scroll - это гарантирует, что ваш контент будет виден за счет дизайна (полосы прокрутки уродливы)
  2. overflow:hidden - просто отсекает любое переполнение. Это означает, что люди не могут читать контент.

Если (в примере SO) вы хотите, чтобы он не перекрывал отступы, вам, вероятно, придется создать другой div внутри отступа для хранения вашего контента.

Изменить: как утверждают другие ответы, существует множество методов для усечения слов, будь то разработка ширины рендеринга на стороне клиента (никогда не пытайтесь делать это на стороне сервера, поскольку она никогда не будет работать надежно, кросс-платформенная) через JS и вставка символов прерывания или использование нестандартных и / или совершенно несовместимых тегов CSS (word-wrap: break-word не работает в Firefox).

Однако вам всегда понадобится дескриптор переполнения. Если ваш div содержит другой слишком широкий фрагмент содержимого блочного типа (изображение, таблица и т. Д.), Вам понадобится переполнение, чтобы он не разрушил макет / дизайн.

Поэтому непременно используйте другой метод (или их комбинацию), но не забудьте также добавить переполнение, чтобы охватить все браузеры.

Изменить 2 (чтобы ответить на ваш комментарий ниже):

Использование свойства CSS overflow не идеально, но оно предотвращает поломку дизайна. Сначала нанесите overflow:hidden. Помните, что переполнение может не нарушаться при заполнении, поэтому либо вставляйте divs, либо используйте границу (что лучше всего подходит для вас).

Это скроет переполненный контент, и вы можете потерять смысл. Вы можете использовать полосу прокрутки (используя overflow:auto или overflow:scroll вместо overflow:hidden), но в зависимости от размеров div и вашего дизайна это может выглядеть или работать некорректно.

Чтобы исправить это, мы можем использовать JS для отката и выполнения некоторой формы автоматического усечения. Я наполовину написал для вас какой-то псевдокод, но на полпути это серьезно усложняется. Если вам нужно показать как можно больше, взгляните на переносчик (как указано ниже ).

Просто имейте в виду, что это происходит за счет процессоров пользователя. Это может привести к тому, что страницы будут долго загружаться и / или изменять размер.

person Oli    schedule 26.11.2008
comment
с переполнением текста: многоточие; текст можно красиво вырезать. - person Kornel; 26.11.2008
comment
text-overflow: многоточие только для IE (и, по расширению, нестандартное). - person Oli; 26.11.2008
comment
Я всегда выбираю overflow: scroll;, если контент содержит полезную информацию. И следующая цель - попытаться создать такой CSS, чтобы полосы прокрутки не отображались. И в этом случае у вас всегда есть полосы прокрутки в качестве резервной копии. - person Yeti; 08.12.2012
comment
относительно использования text-overflow: ellipsis stackoverflow.com/a/22811590/759452 - person Adrien Be; 26.06.2014

Как мы знаем, это сложная проблема, и браузеры не поддерживают ее. Большинство браузеров вообще не поддерживают эту функцию.

В некоторых случаях работы с электронными письмами HTML, где пользовательский контент использовался, но скрипт недоступен (и даже CSS не очень хорошо поддерживается), следующий фрагмент CSS в оболочке вокруг вашего блока без пробелов должен хотя бы в некоторой степени помочь:

.word-break {
  /* The following styles prevent unbroken strings from breaking the layout */
  width: 300px; /* set to whatever width you need */
  overflow: auto;
  white-space: -moz-pre-wrap; /* Mozilla */
  white-space: -hp-pre-wrap; /* HP printers */
  white-space: -o-pre-wrap; /* Opera 7 */
  white-space: -pre-wrap; /* Opera 4-6 */
  white-space: pre-wrap; /* CSS 2.1 */
  white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
  word-wrap: break-word; /* IE */
  -moz-binding: url('xbl.xml#wordwrap'); /* Firefox (using XBL) */
}

В случае браузеров на основе Mozilla упомянутый выше XBL-файл содержит:

<?xml version="1.0" encoding="utf-8"?>
<bindings xmlns="http://www.mozilla.org/xbl" 
          xmlns:html="http://www.w3.org/1999/xhtml">
  <!--
  More information on XBL:
  http://developer.mozilla.org/en/docs/XBL:XBL_1.0_Reference

  Example of implementing the CSS 'word-wrap' feature:
  http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/
  -->
  <binding id="wordwrap" applyauthorstyles="false">
    <implementation>
      <constructor>
        //<![CDATA[
        var elem = this;

        doWrap();
        elem.addEventListener('overflow', doWrap, false);

        function doWrap() {
          var walker = document.createTreeWalker(elem, NodeFilter.SHOW_TEXT, null, false);
          while (walker.nextNode()) {
            var node = walker.currentNode;
            node.nodeValue = node.nodeValue.split('').join(String.fromCharCode('8203'));
          }
        }
        //]]>
      </constructor>
    </implementation>
  </binding>
</bindings>

К сожалению, Opera 8+ не нравится ни одно из вышеперечисленных решений, поэтому JavaScript должен быть решением для этих браузеров (например, Mozilla / Firefox). Еще одно кроссбраузерное решение (JavaScript), которое включает в себя более поздние версии Opera. будет использовать сценарий Hedger Wang, найденный здесь: http://www.hedgerwow.com/360/dhtml/css-word-break.html.

Другие полезные ссылки / мысли:

Несвязный лепет »Архив блога» Эмуляция переноса слов CSS для Mozilla / Firefox
http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/

[OU] В Opera нет переноса слов, отлично отображается в IE
http://list.opera.com/pipermail/opera-users/2004-November/024467.html
http://list.opera.com/pipermail/opera-users/2004-November/024468.html

person Neil Monroe    schedule 31.03.2009
comment
Что, если мне нужна ширина: 100%? Это означает 100% внешнего контейнера. Это сделано для того, чтобы горизонтальные полосы прокрутки не появлялись на странице и не испортили остальную часть макета. - person pilavdzice; 22.03.2012
comment
Новые версии Firefox теперь поддерживают свойство word-wrap: break-word; CSS, поэтому, если вам не нужна поддержка в Firefox для более ранних версий, вы можете исключить XBL. - person Neil Monroe; 19.09.2012

Перенос слов в кроссбраузерном CSS

.word_wrap
{
    white-space: pre-wrap; /* css-3 */
    white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
    white-space: -pre-wrap; /* Opera 4-6 */
    white-space: -o-pre-wrap; /* Opera 7 */
    word-wrap: break-word; /* Internet Explorer 5.5+ */
}
person Remo    schedule 12.01.2011
comment
Не поддерживается в Opera 9.24 - person SCC; 17.03.2014

Используйте стиль word-break:break-all;. Я знаю, что это работает на таблицах.

person sanimalp    schedule 09.08.2010
comment
@sanimalp Не поддерживается в Opera 9.24 - person SCC; 17.03.2014

Вы имеете в виду, что в поддерживающих его браузерах word-wrap: break-word не Работа ?

Если включен в определение основного текста таблицы стилей, он должен работать во всем документе.

Если переполнение не является хорошим решением, только собственный javascript может искусственно разбить длинное слово.

Примечание. Также существует этот <wbr> тег Word Break. Это дает браузеру место, где он может разделить строку. К сожалению, тег <wbr> работает не во всех браузерах, только в Firefox и Internet Explorer (и в Opera с уловкой CSS).

person VonC    schedule 26.11.2008

Только что проверил IE 7, Firefox 3.6.8 Mac, Firefox 3.6.8 Windows и Safari:

word-wrap: break-word;

работает для длинных ссылок внутри div с заданной шириной и без переполнения, объявленного в css:

#consumeralerts_leftcol{
    float:left;
    width: 250px;
    margin-bottom:10px;
    word-wrap: break-word;
}

Я не вижу проблем с несовместимостью

person Zac Imboden    schedule 24.08.2010

Я только что узнал о переносе из этот вопрос. Это могло бы решить проблему.

person dylanfm    schedule 26.11.2008
comment
Это сделало howWouldYourSiteDealWithCommentsLikeThisOne красивым и управляемым. Очень круто. - person ojrac; 01.04.2009

После долгих боев у меня сработало следующее:

.pre {
    font-weight: 500;
    font-family: Courier New, monospace;
    white-space: pre-wrap;
    word-wrap: break-word;
    word-break: break-all;
    -webkit-hyphens: auto;
    -moz-hyphens: auto;
    hyphens: auto;
}

Работает в последних версиях Chrome, Firefox и Opera.

Обратите внимание, что я исключил многие из white-space свойств, которые предлагали другие - это фактически нарушило отступ pre для меня.

person mpen    schedule 16.07.2012

Для меня в div без фиксированного размера и с динамическим контентом он работал, используя:

display:table;
word-break:break-all;
person Jacob    schedule 06.03.2013

Повторите регулярное выражение в this comment, это хорошо, но он добавляет застенчивый дефис только между группами из 5 символов без пробелов или дефисов. Это позволяет последней группе быть намного длиннее, чем предполагалось, поскольку после нее нет подходящей группы.

Например, это:

'abcde12345678901234'.replace(/([^\s-]{5})([^\s-]{5})/g, '$1&shy;$2')

... приводит к этому:

abcde&shy;12345678901234

Вот версия, использующая положительный прогноз, чтобы избежать этой проблемы:

.replace(/([^\s-]{5})(?=[^\s-])/g, '$1&shy;')

... с таким результатом:

abcde&shy;12345&shy;67890&shy;1234
person enigment    schedule 09.06.2011

Решение, которое я обычно использую для этой проблемы, - установить 2 разных правила css для IE и других браузеров:

word-wrap: break-word;

отлично работает в IE, но перенос слов не является стандартным свойством CSS. Это свойство Microsoft, которое не работает в Firefox.

Для Firefox лучшее, что можно сделать, используя только CSS, - это установить правило

overflow: hidden;

для элемента, содержащего текст, который вы хотите обернуть. Он не переносит текст, но скрывает часть текста, выходящую за пределы контейнера. Это может быть хорошим решением, если для вас не обязательно отображать весь текст (т.е. если текст находится внутри тега <a>)

person alexmeia    schedule 26.11.2008
comment
word-wrap: break-word, похоже, у меня нормально работает в Firefox 10. - person Jon Schneider; 07.03.2012
comment
CanIUse утверждает, что он совместим с IE8 +, Firefox28 +, Chrome33 +, Safari7 + и другими. caniuse.com/#search=word-wrap - person Adrien Be; 26.06.2014

Обновление. Обработка этого в CSS удивительно проста и требует минимальных затрат, но вы не можете контролировать, где возникают прерывания, когда они появляются. Это нормально, если вам все равно, или ваши данные проходят длинный буквенно-цифровой цикл без каких-либо естественных разрывов. У нас было много длинных путей к файлам, URL-адресов и телефонных номеров, и у каждого из них есть места, куда лучше взломать, чем другие.

Наше решение состояло в том, чтобы сначала использовать замену регулярного выражения, чтобы поместить пробел нулевой ширины () после каждых 15 (скажем) символов, которые не являются пробелами, или одного из специальных символов, где мы предпочли бы разрывы. Затем мы выполняем другую замену, помещая пробел нулевой ширины после этих специальных символов.

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

В настоящее время мы используем специальные символы разрыва: точка, косая черта, обратная косая черта, запятая, подчеркивание, @, | и дефис. Вы бы не подумали, что вам нужно что-то делать, чтобы поощрять разрыв после дефисов, но Firefox (по крайней мере, 3.6 и 4) сам по себе не разбивает дефисы, окруженные цифрами (например, телефонные номера).

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

Вот код; вы, вероятно, назвали бы функции в служебном пакете:

makeWrappable = function(str, position)
{
    if (!str)
        return '';
    position = position || 15; // default to breaking after 15 chars
    // matches every requested number of chars that's not whitespace or one of the special chars defined below
    var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
    return str
                .replace(longRunsRegex, '$1&#8203;') // put a zero-width space every requested number of chars that's not whitespace or a special char
                .replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1&#8203;'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen


cachedRegex = function(reString, reFlags)
{
    var key = reString + (reFlags ? ':::' + reFlags : '');
    if (!cachedRegex.cache[key])
        cachedRegex.cache[key] = new RegExp(reString, reFlags);
    return cachedRegex.cache[key];
};
cachedRegex.cache = {};

Тестируйте так:

makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')

Обновление 2. Похоже, что пробелы нулевой ширины на самом деле включены в скопированный текст по крайней мере в некоторых случаях, вы просто не можете их видеть. Очевидно, что поощрение людей копировать текст со скрытыми символами - это приглашение ввести такие данные в другие программы или системы, даже в вашу собственную, где это может вызвать проблемы. Например, если он попадает в базу данных, поиск по нему может завершиться неудачно, и такие строки поиска также могут не сработать. Использование клавиш со стрелками для перемещения по таким данным требует (справедливо) дополнительного нажатия клавиши для перемещения по персонажу, которого вы не видите, что несколько странно для пользователей, если они это заметят.

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

В общем, эта техника работает хорошо, но я не уверен, какой будет лучший выбор персонажа, вызывающего поломку.

Обновление 3: появление этого персонажа в данных больше не является теоретической возможностью, это наблюдаемая проблема. Пользователи отправляют данные, скопированные с экрана, они сохраняются в базе данных, поиск прерывается, вещи странно сортируются и т. Д.

Мы сделали две вещи:

  1. Написал утилиту для удаления их из всех столбцов всех таблиц во всех источниках данных для этого приложения.
  2. Добавлена ​​фильтрация, чтобы удалить его в наш стандартный процессор ввода строк, поэтому он исчезнет к тому времени, когда любой код его увидит.

Это хорошо работает, как и сама техника, но это поучительная история.

Обновление 4: мы используем это в контексте, где данные, передаваемые в него, могут быть экранированными в HTML. При правильных обстоятельствах он может вставлять пробелы нулевой ширины в середину HTML-сущностей, что дает необычный результат.

Исправление заключалось в том, чтобы добавить амперсанд в список символов, которые мы не разбиваем, например:

var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');
person enigment    schedule 28.06.2011
comment
Я использовал это, но мне нужно было запустить это только один раз для длинного доменного имени, поэтому я просто сократил его до: if(domainName.length > 15) domainName.replace(/([^\\s]{5})(?=[^\\s])/g, '$1&#8203;'); - person CBarr; 17.12.2012

Необходимо установить "table-layout: fixed", чтобы перенос по словам работал.

person Aleks    schedule 11.08.2010
comment
Спасибо тебе за это! Перенос слов: break-word; в противном случае не будет работать для таблиц. - person liviucmg; 28.10.2010

ГИФЕНАТОР - правильный ответ (данный выше). Настоящая проблема, стоящая за вашим вопросом, заключается в том, что веб-браузеры все еще (в 2008 году) чрезвычайно примитивны и не имеют функции переноса слов. Послушайте, мы все еще находимся на ранних этапах использования компьютеров - нам нужно набраться терпения. Пока дизайнеры правят миром Интернета, нам будет трудно ждать каких-то действительно полезных новых функций.

ОБНОВЛЕНИЕ. По состоянию на декабрь 2011 г. у нас появился еще один вариант с появлением поддержки этих тегов в FF и Safari:

p {
    -webkit-hyphens: auto;
    -moz-hyphens: auto;
    hyphens: auto;
}

Я провел базовое тестирование, и, похоже, он работает с последней версией Mobile Safari и Safari 5.1.1.

Таблица совместимости: https://developer.mozilla.org/en/CSS/hyphens#AutoCompatibilityTable

person Snaky Love    schedule 26.11.2008

Для совместимости с IE 8+ используйте:

-ms-word-break: break-all;
     word-break: break-all;

     /* Non standard for webkit */
     word-break: break-word;

-webkit-hyphens: auto;
   -moz-hyphens: auto;
        hyphens: auto;

См. Здесь http://css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/

Все, что мне нужно было сделать, это применить это к стилю контейнера div с заданной шириной.

person DoctorFox    schedule 12.07.2013

Используйте это

word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-all;
person Jay Patel    schedule 07.01.2016

Если у вас есть это -

  <style type="text/css">
      .cell {
            float: left;
            width: 100px;
            border: 1px solid;
            line-height: 1em;
      }
  </style>

  <div class="cell">TopLeft</div>
  <div class="cell">TopMiddlePlusSomeOtherTextWhichMakesItToLong</div>
  <div class="cell">TopRight</div>
  <br/>
  <div class="cell">BottomLeft</div>
  <div class="cell">BottomMiddle</div>
  <div class="cell">bottomRight</div>

просто переключитесь на вертикальный формат с содержащими div и используйте min-width в вашем CSS вместо ширины -

  <style type="text/css">
      .column {
            float: left;
            min-width: 100px;
      }
      .cell2 {
            border: 1px solid;
            line-height: 1em;
      }
  </style>

  <div class="column">
      <div class="cell2">TopLeft</div>
      <div class="cell2">BottomLeft</div>
  </div>
  <div class="column">
      <div class="cell2">TopMiddlePlusSomeOtherTextWhichMakesItToLong</div>
      <div class="cell2">BottomMiddle</div>
  </div>
  <div class="column">
      <div class="cell2">TopRight</div>
      <div class="cell2">bottomRight</div>
  </div>
  <br/>

Конечно, если вы показываете подлинные табличные данные, можно использовать настоящую таблицу, поскольку она семантически верна и будет информировать людей, использующих программы чтения с экрана, которые должны находиться в таблице. Это их использование для генеральной компоновки или нарезки изображений, за что люди будут вас линчевать.

person Dan Brown    schedule 21.05.2009

Мне пришлось сделать следующее, потому что, если свойства не были объявлены в правильном порядке, слова в случайном порядке разбивались бы не в том месте и без добавления дефиса.

    -moz-white-space: pre-wrap;
white-space: pre-wrap;        
    hyphens: auto;
    -ms-word-break: break-all;
    -ms-word-wrap: break-all;
    -webkit-word-break: break-word;
    -webkit-word-wrap: break-word;
word-break: break-word;
word-wrap: break-word;
    -webkit-hyphens: auto;
    -moz-hyphens: auto;
    -ms-hyphens: auto;
hyphens: auto;

Первоначально опубликовано Enigmo: https://stackoverflow.com/a/14191114

person jacobsvensson    schedule 11.06.2014

Да, если это возможно, установка абсолютной ширины и установка overflow : auto работают хорошо.

person John Gietzen    schedule 31.03.2009

"word-wrap: break-word" работает в Firefox 3.5 http://hacks.mozilla.org/2009/06/word-wrap/

person mb21    schedule 17.04.2010

Добавьте это в css вашего div: word-wrap: break-word;

person Kishan Subhash    schedule 15.05.2014

после того, как все слова переносятся и прерываются, сохраните свое переполнение и посмотрите, решит ли это вашу проблему. просто измените отображение вашего div на: display: inline;

person Olofu Mark    schedule 02.06.2013

Простая функция (требуется underscore.js) - на основе ответа @porneL

    String.prototype.shyBreakString = function(maxLength) {
        var shystring = [];
        _.each(this.split(' '), function(word){
            shystring.push(_.chop(word, maxLength).join('&shy;'));
        });
        return shystring.join(' ');
    };
person hharnisc    schedule 30.09.2013

Я написал функцию, которая отлично работает, когда она вставляет &shy; x букв в слово для хорошего разрыва строки. Все ответы здесь не поддерживали все браузеры и устройства, но это хорошо работает с PHP:

/**
 * Add line-break to text x characters in
 * @param  string  $text          
 * @param  integer $characters_in 
 * @return string                 
 */
function line_break_text($text, $characters_in = 10) {

    $split = explode(' ', $text);

    if ( ! empty($split)) {

        foreach ($split as $key => $var) {

            if ( strlen($var) > $characters_in ) {

                $split[$key] = substr_replace($var, '&shy;', $characters_in, 0);

            }

        }

    }

    return implode(' ', $split);

}
person Jack    schedule 15.11.2017