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

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

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

РЕТРО-ХИНИНГ: Это никогда произошло с макетами таблиц. Ячейка таблицы всегда красиво расширяется до ширины самого длинного слова.

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

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

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

Kornel 26.11.2008 13:15

Ячейка таблицы всегда будет красиво ???????? расширить до ширины самого длинного слова

inspite 26.11.2008 13:44

Да, обычно довольно красиво, как в случае приведенного ниже рисунка из связанного столбца Stackoverflow, если бы это была ТАБЛИЦА вместо DIV, она была бы немного шире и все равно выглядела бы красиво - очень прагматично. Было бы неплохо, если бы можно было включить в DIV что-то вроде word-wrap: expand.

Edward Tanguay 26.11.2008 13:59

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

Oli 26.11.2008 14:06

Мне всегда казалось, что поведение таблицы больше соответствует исходной философии гибкости HTML. Философия жесткой ширины столбцов DIV / CSS, похоже, исходит от дизайнеров журналов, которые не могут справиться с тем, что их столбцы иногда шире, а иногда уже.

Edward Tanguay 26.11.2008 14:13

Хороший дизайн должен быть последовательным; если содержимое страницы может изменять размеры пользовательского интерфейса, это нарушит дизайн. Серьезно, где бы вы нарисовали линию с эластичным макетом? Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch?

Doctor Jones 26.11.2008 14:45

Я понимаю что ты имеешь ввиду. ;-)

Edward Tanguay 26.11.2008 14:56

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

Oli 26.11.2008 16:50

(Если вы хотите прочитать эти комментарии, просто скопируйте и вставьте их в текстовый редактор.)

Edward Tanguay 26.11.2008 17:01

Как мне найти источник этого блока, чтобы узнать, является ли это DIV или действительно ТАБЛИЦА? Это не в поле зрения источника. Разве у меня нет доступа к текущему тексту DOM, даже если он введен AJAX?

Edward Tanguay 26.11.2008 17:02

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

Lightness Races in Orbit 28.06.2011 20:52

@ Эдвард: Посмотрите, как газеты делали это на протяжении сотен лет.

Lightness Races in Orbit 28.06.2011 20:52

«Актуальный» ответ (2014 г.) stackoverflow.com/questions/802175/…

Adrien Be 20.11.2014 19:50

Напомни мне никогда не играть в скрэббл против немца. Эта штука должна стоить 300 очков! Решение 2016 года: добавьте в свой CSS: word-wrap: break-word;. В зависимости от того, что вы хотите поддерживать, могут потребоваться префиксы браузера. Также имейте в виду, что элемент или родительский элемент (независимо от того, какую ширину вы хотите разрешить) должен иметь определенную ширину, иначе перенос слов не вступит в силу. Надеюсь, это поможет.

Tom Walker 23.01.2016 05:19
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
149
14
127 840
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

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

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

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

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

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

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

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

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

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

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

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

с переполнением текста: многоточие; текст можно красиво вырезать.

Kornel 26.11.2008 13:21

text-overflow: многоточие предназначено только для IE (и, по расширению, нестандартно).

Oli 26.11.2008 13:28

Я всегда выбираю overflow: scroll;, если контент содержит полезную информацию. И следующая цель - попытаться создать такой CSS, чтобы полосы прокрутки не отображались. И если они это сделают, у вас всегда есть полосы прокрутки в качестве резервной копии.

Yeti 08.12.2012 15:22

относительно использования text-overflow: ellipsisstackoverflow.com/a/22811590/759452

Adrien Be 26.06.2014 13:17

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

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

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

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

Ответ принят как подходящий

Мягкий дефис

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

averyvery&shy;longword

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

averyverylongword

или же

averyvery-
longword

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

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

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

<wbr> элемент

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

averyvery<wbr>longword

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

averyvery
longword

Вы можете добиться того же с помощью символа пробела нулевой ширины &#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 ответы ниже тоже хороши.

Здорово! Согласно Википедии, вы можете получить пространство нулевой ширины с помощью & # 8203; - раз уж вы об этом заговорили, знаете ли вы для него менее уродливый escape-код? Я запомню 8203, если нужно, но ...

ojrac 01.04.2009 01:11

@ojrac - Это зависит от того, считаете ли вы, что & # x200B; "менее уродливо" или нет. :-) AFAIK, для пространства нулевой ширины не существует "словесной сущности".

Ben Blank 01.04.2009 03:18

Что ж, # x200B легче запомнить. Достаточно хорошо.

ojrac 02.04.2009 02:50

Вы можете использовать что-то вроде TextExpander (smileonmymac.com/TextExpander), чтобы дать свои имена любой строке или символу.

Kornel 02.04.2009 13:04

Это хорошо, но не решает исходную проблему.

Albus Dumbledore 02.09.2010 13:16

@Smamatti: Я не видел ни одного браузера, который бы его не поддерживал, начиная с Firefox 2, который был самым последним браузером, реализовавшим этот 15-летний стандарт.

Kornel 26.10.2011 16:48

@porneL Извини. Думаю, я еще недостаточно его проверил. Кажется, проблема с остальной частью моего CSS. &shy; действительно отлично работает во всех основных браузерах. - jsfiddle.net/Bn3th

Smamatti 26.10.2011 19:25

К вашему сведению, вы также можете использовать <wbr>. См. quirksmode.org/oddsandends/wbr.html.

HaxElit 15.03.2012 18:27

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

Neil Monroe 19.09.2012 20:26

Я изменил указанное выше регулярное выражение на /([^\s-&<>]{5})([^\s-&<>]{5})/, чтобы убедиться, что оно не нарушает HTML-теги и объекты (при условии, что у вас может быть строка потенциально с HTML-тегами)

AsGoodAsItGets 16.03.2016 16:13

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

Это сделало то, какWouldYourSiteDealWithCommentsLikeThisOne выглядело красивым и управляемым. Очень круто.

ojrac 01.04.2009 01:14

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

word-wrap: break-word;

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

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

overflow: hidden;

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

word-wrap: break-word, похоже, у меня нормально работает в Firefox 10.

Jon Schneider 07.03.2012 19:47

CanIUse утверждает, что он совместим с IE8 +, Firefox28 +, Chrome33 +, Safari7 + и другими. caniuse.com/#search=word-wrap

Adrien Be 26.06.2014 13:50

HYPHENATOR is the right answer (given above). The real problem behind your question is that web browsers are still (in 2008) extremely primitive that they do not have a hyphenation-feature. Look, we are still on the early beginnings of computer usage - we have to be patient. As long as designers rule the web world we will have a hard time waiting for some real useful new features.

ОБНОВИТЬ: По состоянию на декабрь 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

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

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

В некоторой работе, выполняемой с электронными письмами 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+, похоже, не нравится ни одно из вышеперечисленных решений, поэтому для этих браузеров (например, Mozilla / Firefox) должен быть JavaScript. Еще одно кроссбраузерное решение (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

Что, если мне нужна ширина: 100%? Это означает 100% внешнего контейнера. Это сделано для того, чтобы горизонтальные полосы прокрутки не появлялись на странице и не испортили остальную часть макета.

pilavdzice 22.03.2012 19:56

Новые версии Firefox теперь поддерживают свойство word-wrap: break-word; CSS, поэтому, если вам не нужна поддержка в Firefox для более ранних версий, вы можете исключить XBL.

Neil Monroe 19.09.2012 20:30

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

  <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 и используйте минимальную ширину в вашем 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/>

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

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

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

@sanimalp Не поддерживается в Opera 9.24

SCC 17.03.2014 14:03

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

Спасибо тебе за это! Перенос слов: слово-разрыв; в противном случае не будет работать для таблиц.

liviucmg 28.10.2010 00:52

Только что проверил 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;
}

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

Перенос слов в кроссбраузерном 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+ */
}

Не поддерживается в Opera 9.24

SCC 17.03.2014 14:00

Повторите регулярное выражение в этот комментарий, это хорошо, но он добавляет застенчивый дефис только между группами из 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

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

Наше решение состояло в том, чтобы сначала использовать замену регулярного выражения, чтобы поместить пробел нулевой ширины (& # 8203;) после каждых 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');

Я использовал это, но мне нужно было запустить это только один раз для длинного доменного имени, поэтому я просто сократил его до: if (domainName.length > 15) domainName.replace(/([^\\s]{5})(?=[^\\s])/g, '$1&#8203;');

CBarr 17.12.2012 19:55

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

.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 для меня.

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

display:table;
word-break:break-all;

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

Для совместимости с 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 с заданной шириной.

Простая функция (требуется 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(' ');
    };

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

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

    -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

p {
    overflow-wrap: break-word;
}


@-moz-document url-prefix() { 
    p {
        white-space: -moz-pre-wrap;
        word-wrap: break-word;
    }
}

Использовать это

word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-all;

Я написал функцию, которая отлично работает, когда она вставляет буквы &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);

}

Другие вопросы по теме