Как заставить разрыв строки в длинном слове в 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согласно спецификации.


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), который является невидимым символом, который определяет возможность разрыва строки. Точно так же целью дефиса является определение возможности разрыва строки в пределах границы слова.


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




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;

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


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

-3

Сделай это:

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

#sampleDiv{
   overflow-wrap: break-word;
}

-4

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

white-space: normal;

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

Это зависит от переопределения, сделанного CSS. В моем случае мне пришлось переопределить его в "style" в моем JSF-компоненте, чтобы переопределить стиль CSS по умолчанию, который не был "white-space: normal;"
Бенджамин Фуэнтес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.