Як змусити перервати лінію довгим словом у DIV?


417

Гаразд, це нас справді бентежить. У мене є такий вміст у діві, як:

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

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

</div>

Однак вміст переповнює DIV (як очікувалося), оскільки "слово" занадто довге.

Як я можу змусити браузер "зламати" слово там, де необхідно, щоб вмістити весь вміст всередині?


Погляньте на це питання: stackoverflow.com/questions/2046530 / ...
nickf

Відповіді:


609

Використовуйте word-wrap:break-word;

Він навіть працює в IE6, що є приємним сюрпризом.


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

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


75
Власне, обгортання слів - це винахід IE. Тож не дивно, що це працює в IE :)
Савас Ведова

1
Щоб це працювало в таблиці, вам може знадобитися застосувати table-layout: fixed;таблицю
Serj Sagan

28
word-wrap: break-wordне працювало для мене, але word-break: break-wordяк запропонував @rahul нижче, працював.
Ів

1
Примітка. Це буде працювати лише в тому випадку, якщо ви надасте його в батьківському ділі в IE (не до внутрішнього проміжку всередині div).
sms

125

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

word-break: break-all;

Також ви можете використовувати <wbr>тег

<wbr>(слово "перерва") означає: "Браузер може вставити тут перерву рядка, якщо він бажає." Оскільки браузер не вважає необхідним розрив рядка, нічого не відбувається.


23
Будьте в курсі того слова-перерви: розбийте все; порушить слова в середині, якщо вони все ще вміщатимуть будь-які символи на рядку з іншими словами раніше, що може бути не бажаним результатом, тоді як перенесення слів: break-word; переміщує слова до нового рядка і розбиває слово лише у тому випадку, якщо воно занадто довге, щоб взагалі помістити його власний рядок у контейнері. Приклад: jsfiddle.net/4AKhn/1
alexteg

break-all ламає все. Добре використовувати для конкретного класу, який має лише довгу 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, я не впевнений, але якщо ви намагаєтесь зламати ім'я файлу, весь контекст (браузер, html-css-код) може бути корисним, щоб допомогти вам ще більше. Можливо, ви могли б створити ще одне питання зі своєю ситуацією.
Мільче Патерн

Зверніть увагу, що це ламає слова в неграматичних місцях.

@ user1322720 що таке "неграматичне" місце?
TylerH

31

Я просто гуглював ту саму проблему і опублікував своє остаточне рішення ТУТ . Це стосується і цього питання.

Ви можете легко це зробити з дівом, надавши йому стиль 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!
Putzi San

27

&#8203;- це сутність HTML для символу Unicode, який називається простором нульової ширини (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%. Варто зазначити одне: слово-перерва: перерва-слово; повинно бути перерва у слові: break-all;
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-wrapвизначає CSS властивості або НЕ браузер повинен вставити розриви рядків усередині слів , щоб запобігти текст від переповнення його вмісту вікна.

На відміну від 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яке дає довші частини, ніж склади цього слова.
Хоча я ніколи не читав нічого офіційного з цього приводу, цим м'яким дефісам вдається отримати більш високий пріоритет у браузерах, ніж офіційні дефіси в окремих словах конструкції ( якщо вони взагалі мають деяке розширення для цього).
На практиці жоден браузер не здатний сам зламати таке довге, побудоване слово; на менших екранах, що призводить до нового рядка для нього, а в деяких випадках навіть до одного слова (наприклад, коли два цих побудованих слова слідують далі).

FYI: це голландський працівник аеропорту


0

word-break: normal здається, краще використовувати, ніж word-break: break-word, оскільки початкові перерви в break-word, такі як EN

word-break: normal

-3

Зробити це:

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

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

-4

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

white-space: normal;

1
Дублювання відповідей на кілька запитань в більшості випадків надихається. У цьому випадку, здається, це неправильна відповідь на обидва питання. normal- це white-spaceзначення за замовчуванням . Я думаю, що додавання цього не вплине на приклад у питанні. Будь ласка, виправте мене, якщо я помиляюся.
Джеремі Бенкс

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