Как заставить разрыв строки в длинном слове в DIV?

417

Хорошо, это действительно смущает меня. У меня есть некоторый контент внутри div, например:

<div style="background-color: green; width: 200px; height: 300px;">

Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.

</div>

Однако содержимое переполняет DIV (как и ожидалось), поскольку слово «слишком длинное».

Как заставить браузер «разбить» слово там, где это необходимо, чтобы вместить весь контент внутри?

Натан Осман
источник
Взгляните на этот вопрос: stackoverflow.com/questions/2046530/…
nickf

Ответы:

610

использование word-wrap:break-word;

Он даже работает в IE6, что является приятным сюрпризом.


word-wrap: break-wordбыл заменен на overflow-wrap: break-word;который работает в каждом современном браузере. IE, будучи мертвым браузером, всегда будет полагаться на устаревший и нестандартный word-wrap.

Существующее использование word-wrapсегодня все еще работает, поскольку это псевдоним overflow-wrapсогласно спецификации.

Chi
источник
75
На самом деле, перенос слов - это изобретение IE. Так что не удивительно, что это работает в IE :)
Savas Vedova
1
Чтобы это работало в таблице, вам может понадобиться применить table-layout: fixed;к столу
Серж Саган
28
word-wrap: break-wordне работает для меня, но, word-break: break-wordкак подсказал @rahul ниже, работает.
Ив
1
Примечание: это будет работать, только если вы передадите его в родительском div в IE (а не во внутренний span внутри div).
смс
125

Я не уверен в совместимости браузера

word-break: break-all;

Также вы можете использовать <wbr>тег

<wbr>(разрыв слова) означает: «Браузер может вставить разрыв строки здесь, если пожелает». Если браузер не считает, что разрыв строки необходим, ничего не происходит.

Рахул
источник
23
Знайте об этом разрыве слов: сломайте все; будет разбивать слова в середине, если он все еще может совмещать любые символы в строке с другими словами раньше, что может быть нежелательным результатом, в то время как перенос слов: break-word; перемещает слова на новую строку и разбивает слово только в том случае, если оно слишком длинное, чтобы вообще поместиться на его собственной строке в контейнере. Пример: jsfiddle.net/4AKhn/1
alexteg
сломай все ломает все. Хорошо для использования с определенным классом, который имеет только длинный URL и т. Д., Но не с BODY или P
Upendra
Это определенно совершенно (и желательно) приемлемо, когда вы пытаетесь отобразить что-то вроде URI запроса в ячейке таблицы журнала и хотите, чтобы оно перестало разбивать всю таблицу гигантской длинной ячейкой. Разрыв в середине «слова» желателен;) Хотя принятый ответ не делает приседания в этом отношении.
IncredibleHat
@ Skelly1983 нет такой вещи, как IE12
TylerH
@TylerH Я знаю об этом, спасибо за указание на это мне через 3 года. Это указано в таблице поддержки браузеров w3schools для тега wbr, в котором указана поддержка «Internet Explorer / Edge» и номер версии указан как 12.0, что фактически является первой версией Edge.
Skelly1983
98

Это можно добавить к принятому ответу для решения «кросс-браузер».

Источники:

.your_element{
    -ms-word-break: break-all;
    word-break: break-all;

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

    -webkit-hyphens: auto;
       -moz-hyphens: auto;
        -ms-hyphens: auto;
            hyphens: auto;
}
Мильче Патерн
источник
Я получил его в Chrome / Opera и Safari, но до сих пор не получил его в Firefox и IE. После этого я решил Firefox, но IE все еще перебирает контейнер (у меня длинное имя файла, состоящее из буквенно-цифровых символов).
Kamafeather
1
Привет, Kamafeather, я не уверен, но если имя isitesareallylongfile, которое ты пытаешься нарушить, весь контекст (браузер, код html-css) может помочь тебе в дальнейшей работе. Возможно, вы могли бы создать другой вопрос с вашей ситуацией.
Мильче Патерн
Обратите внимание, что это разбивает слова в неграмотных местах.
@ user1322720 что такое "неграмотное" место?
TylerH
31

Я просто гуглил ту же проблему и опубликовал свое окончательное решение ЗДЕСЬ . Это актуально и для этого вопроса.

Вы можете легко сделать это с помощью div, присвоив ему стиль word-wrap: break-word(и вам может потребоваться установить его ширину).

div {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
    width: 100%;
}

Тем не менее, для таблиц , необходимо также применять: table-layout: fixed. Это означает, что ширина столбцов больше не является изменяемой, а определяется на основе ширины столбцов только в первой строке (или с помощью указанных значений ширины). Узнайте больше здесь .

Образец кода:

table {
    table-layout: fixed;
    width: 100%;
}

table td {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
}
Саймон Ист
источник
1
Спасибо за решение таблиц;) Однако я не совсем понимаю, почему ключевое слово не может быть использовано с автоматическим макетом. Любое предложение?
ondObno
@ondObno Да, я не уверен в технической причине, но некоторые браузеры ведут себя так. Возможно, это связано с тем, что сверхдлинные слова путают все вычисления, необходимые для определения ширины каждого столбца.
Саймон Ист
Настройка width: 100%;была единственным способом заставить это работать для меня на FF и Chrome!
Путзи Сан
27

&#8203;является HTML-сущностью для символа Юникод, называемого пробелом нулевой ширины (ZWSP), который является невидимым символом, который определяет возможность разрыва строки. Точно так же целью дефиса является определение возможности разрыва строки в пределах границы слова.

davidcondrey
источник
1
Очень хороший совет! Просто для дополнения: &#8203;имеет более низкий приоритет, чем пробел (т. Е. Если он есть рядом, вместо этого строка будет разбита на пробел).
CPHPython
Кажется, <wbr/>что я искал эквивалент юникода
Xenos
20

Обнаружено, что использование следующего работает во всех основных браузерах (Chrome, IE, Safari iOS / OSX), за исключением Firefox (v50.0.2) при использовании flexbox и использовании width: auto.

.your_element {
    word-wrap: break-word;   
    overflow-wrap: break-word;
    word-break: break-word;
}

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

Еще одна вещь, на которую следует обратить внимание - использование текста &nbsp;для пробелов может привести к разрыву строки в середине слова.

Эндрю
источник
5
Это именно то, что мне было нужно. Другие решения не работали с шириной: 100%. Стоит отметить: слово-разрыв: слово-разрыв; должен быть разрыв слова: ломать все;
jscul
7

CSS word-wrap:break-word; , протестировано в FireFox 3.6.3

Бабикер
источник
5

Я решил мою проблему с кодом ниже.

display: table-caption;
Тадэу Эстевес-младший
источник
5

Удалить white-space: nowrap, если есть.

Воплощать в жизнь:

white-space: inherit;
word-break: break-word;
Винит Кумар Сингх
источник
3

Пробелы сохраняются браузером. Текст будет переноситься по мере необходимости и разрывов строк

.pre-wrap {
    white-space: pre-wrap;
    word-break: break-word;
}

DEMO

td {
   word-break: break-word;
   white-space: pre-wrap;
   -moz-white-space: pre-wrap;      
}

table {
    width: 100px;
    border: 1px solid black;
    display: block;
}
<table>
<tr><th>list</th>
<td>
1.longtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtext
2.breaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreakline
</td>
</tr>
</table>

Тинь Нго Куанг
источник
2

От MDN :

Свойство overflow-wrapCSS указывает, должен ли браузер вставлять разрывы строк в словах, чтобы текст не выходил за пределы поля содержимого.

В отличие от word-break, overflow-wrapбудет создавать разрыв только в том случае, если целое слово не может быть помещено в свою строку без переполнения.

Таким образом, вы можете использовать:

overflow-wrap: break-word;

Могу ли я использовать ?

Shiva127
источник
2

Сначала вы должны определить ширину вашего элемента. Например:

#sampleDiv{
  width: 80%;
  word-wrap:break-word;
}
<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

так что когда текст достигнет ширины элемента, он будет разбит на строки.

Чан Нам Хунг
источник
2

Как упоминалось в ответе @ davidcondrey, есть не только ZWSP, но и SHY, &#173; &shy;который можно использовать в очень длинных, составленных словах (например, немецком или голландском), которые должны быть разбиты на том месте, где вы хотите, чтобы это было. Невидимый, но он дает дефису момент, когда он необходим, таким образом, сохраняя связь между словом и строкой.

Таким образом, слово luchthavenpolitieagent может быть отмечено как lucht&shy;haven&shy;politie&shy;agentдающее более длинные части, чем слоги слова.
Хотя я никогда не читал ничего официального об этом, эти мягкие дефисы получают более высокий приоритет в браузерах, чем официальные дефисы в отдельных словах конструкции ( если у них вообще есть какое-то расширение).
На практике ни один браузер не способен взломать такое длинное, сложное слово само по себе; на меньших экранах, приводящих к новой строке для него, или в некоторых случаях даже к одной строке слова (например, когда два из этих созданных слов следуют).

К вашему сведению: это голландский для офицера полиции аэропорта

Дэвид де Бир
источник
0

разрыв слова: нормальный, кажется, лучше использовать, чем разрыв слова: разрывное слово, потому что разрывное слово разрывает начальный, такой как EN

word-break: normal
Matoeil
источник
-3

Сделай это:

<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

#sampleDiv{
   overflow-wrap: break-word;
}
Amit Bende
источник
-4

просто попробуйте это в нашем стиле

white-space: normal;
Бенджамин Фуэнтес
источник
1
Дублирование ответов на несколько вопросов неодобрительно в большинстве случаев. В этом случае, кажется, неправильный ответ на оба вопроса. normalэто white-spaceзначение по умолчанию . Я думаю, что добавление этого не повлияет на пример в вопросе. Пожалуйста, поправьте меня, если я ошибаюсь.
Джереми Бэнкс
Это зависит от переопределения, сделанного CSS. В моем случае мне пришлось переопределить его в "style" в моем JSF-компоненте, чтобы переопределить стиль CSS по умолчанию, который не был "white-space: normal;"
Бенджамин Фуэнтес