Как можно разрешить перенос текста в слове при необходимости? - PullRequest
23 голосов
/ 13 февраля 2010

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

Также помогло бы, если бы разметка выглядела лучше, чем моя (см. Мой ответ).

Edit:

Обратите внимание, что это специально для пользовательского контента.

Редактировать 2:

Около 25% пользователей Firefox на рассматриваемом сайте все еще используют версию 3.0 или ниже, поэтому очень важно поддерживать их. Это основано на данных за последний месяц (около 121 000 посещений).

Ответы [ 8 ]

23 голосов
/ 13 февраля 2010

Свойство css word-wrap: break-word заставит длинные слова переноситься на следующую строку, если они слишком длинные для своего контейнера. Это поддерживается IE (в обратном направлении), Firefox и Safari.

Редактировать: Похоже, вы сможете достичь этого и в старых версиях Firefox, используя white-space: -moz-pre-wrap и white-space: pre-wrap. См. здесь для получения дополнительной информации. Я не проверял это с более старыми версиями Firefox.

5 голосов
/ 13 февраля 2010

Поскольку нет однозначного ответа (зависит от ваших потребностей, например, хотите ли вы дефисы, какие браузеры вы должны поддерживать?), Я провел некоторое исследование через Adobe BrowserLab , чтобы выяснить, какие варианты есть. :

Если вам не нужны дефисы, вы получите наилучшую совместимость, используя <wbr>. Если вам требуются дефисы, тогда лучше использовать &shy;, но учтите, что это не сработает (перенести на символ) в Firefox 2.0 Mac / Windows или Safari 3.0.

И обратите внимание, что если вы решите вообще не обрабатывать длинные слова с помощью переполнения, прокрутки или разрешения переноса символа, IE6 и IE7 ответят увеличением ширины контейнера (по крайней мере, с помощью DIV, который я использовал ), так что будьте осторожны.

Результаты:

<b>Browser                     Method                   Wraps at char    Adds Hyphens    Overflows horizontally    Container expands horizontally</b>
----------------------------------------------------------------------------------------------------------------------------------------------
Firefox 3.0 - Windows XP    None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 3.0 - Windows XP    <wbr>                    Yes              No              No                        No
Firefox 3.0 - Windows XP    &shy; or &#173;          Yes              Yes             No                        No
Firefox 3.0 - Windows XP    word-wrap: break-word    <b>No</b>               No              <b>Yes</b>                       No
IE7 - Windows XP            None                     <b>No</b>               No              No                        <b>Yes</b>
IE7 - Windows XP            <wbr>                    Yes              No              No                        No
IE7 - Windows XP            &shy; or &#173;          Yes              Yes             No                        No
IE7 - Windows XP            word-wrap: break-word    Yes              No              No                        No
Firefox 3.0 - OS X          None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 3.0 - OS X          <wbr>                    Yes              No              No                        No
Firefox 3.0 - OS X          &shy; or &#173;          Yes              Yes             No                        No
Firefox 3.0 - OS X          word-wrap: break-word    <b>No</b>               No              <b>Yes</b>                       No
Safari 3.0 - OS X           None                     <b>No</b>               No              <b>Yes</b>                       No
Safari 3.0 - OS X           <wbr>                    Yes              No              No                        No
Safari 3.0 - OS X           &shy; or &#173;          <b>No</b>               No              No                        No
Safari 3.0 - OS X           word-wrap: break-word    Yes              No              No                        No
Chrome 3.0 - Windows XP     None                     <b>No</b>               No              <b>Yes</b>                       No
Chrome 3.0 - Windows XP     <wbr>                    Yes              No              No                        No
Chrome 3.0 - Windows XP     &shy; or &#173;          Yes              Yes             No                        No
Chrome 3.0 - Windows XP     word-wrap: break-word    Yes              No              No                        No
Firefox 2.0 - OS X          None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 2.0 - OS X          <wbr>                    Yes              No              No                        No
Firefox 2.0 - OS X          &shy; or &#173;          <b>No</b>               No              <b>Yes</b>                       No
Firefox 2.0 - OS X          word-wrap: break-word    <b>No</b>               No              <b>Yes</b>                       No
Firefox 2.0 - Windows XP    None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 2.0 - Windows XP    <wbr>                    Yes              No              No                        No
Firefox 2.0 - Windows XP    &shy; or &#173;          <b>No</b>               No              <b>Yes</b>                       No
Firefox 2.0 - Windows XP    word-wrap: break-word    <b>No</b>               No              <b>Yes</b>                       No
Firefox 3.5 - Windows XP    None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 3.5 - Windows XP    <wbr>                    Yes              No              No                        No
Firefox 3.5 - Windows XP    &shy; or &#173;          Yes              Yes             No                        No
Firefox 3.5 - Windows XP    word-wrap: break-word    Yes              No              No                        No
Firefox 3.5 - OS X          None                     <b>No</b>               No              <b>Yes</b>                       No
Firefox 3.5 - OS X          <wbr>                    Yes              No              No                        No
Firefox 3.5 - OS X          &shy; or &#173;          Yes              Yes             No                        No
Firefox 3.5 - OS X          word-wrap: break-word    Yes              No              No                        No
IE6 - Windows XP            None                     <b>No</b>               No              No                        <b>Yes</b>
IE6 - Windows XP            <wbr>                    Yes              No              No                        No
IE6 - Windows XP            &shy; or &#173;          Yes              Yes             No                        No
IE6 - Windows XP            word-wrap: break-word    Yes              No              No                        No
IE8 - Windows XP            None                     <b>No</b>               No              <b>Yes</b>                       No
IE8 - Windows XP            <wbr>                    Yes              No              No                        No
IE8 - Windows XP            &shy; or &#173;          Yes              Yes             No                        No
IE8 - Windows XP            word-wrap: break-word    Yes              No              No                        No
Safari 4.0 - OS X           None                     <b>No</b>               No              <b>Yes</b>                       No
Safari 4.0 - OS X           <wbr>                    Yes              No              No                        No
Safari 4.0 - OS X           &shy; or &#173;          Yes              Yes             No                        No
Safari 4.0 - OS X           word-wrap: break-word    Yes              No              No                        No

Пример HTML:

<html>
    <head>
        <style>
            div {
                width: 4em;
                border: 1px solid black;
                margin-bottom: 6em;
                padding: .25em;
            }
        </style>    
    </head>
    <body>
        This is text easily contained by the DIV:
        <div>proper width</div>

        A long word with no character breaking:
        <div>
            AReallyLongWordThatNeedsToBeBroken AndAnotherWord
        </div>

        <i>&lt;wbr&gt;</i> tag:
        <div>
            A<wbr>R<wbr>e<wbr>a<wbr>l<wbr>l<wbr>y<wbr>L<wbr>o<wbr>n<wbr>g<wbr>W<wbr>o<wbr>r<wbr>d<wbr>T<wbr>h<wbr>a<wbr>t<wbr>N<wbr>e<wbr>e<wbr>d<wbr>s<wbr>T<wbr>o<wbr>B<wbr>e<wbr>B<wbr>r<wbr>o<wbr>k<wbr>e<wbr>n A<wbr>n<wbr>d<wbr>A<wbr>n<wbr>o<wbr>t<wbr>h<wbr>e<wbr>r<wbr>W<wbr>o<wbr>r<wbr>d
        </div>

        <i>&amp;shy;</i> character:
        <div>
            A&shy;R&shy;e&shy;a&shy;l&shy;l&shy;y&shy;L&shy;o&shy;n&shy;g&shy;W&shy;o&shy;r&shy;d&shy;T&shy;h&shy;a&shy;t&shy;N&shy;e&shy;e&shy;d&shy;s&shy;T&shy;o&shy;B&shy;e&shy;B&shy;r&shy;o&shy;k&shy;e&shy;n A&shy;n&shy;d&shy;A&shy;n&shy;o&shy;t&shy;h&shy;e&shy;r&shy;W&shy;o&shy;r&shy;d
        </div>

        <i>overflow: scroll</i> CSS attribute:
        <div style="overflow: scroll">
            AReallyLongWordThatNeedsToBeBroken AndAnotherWord
        </div>

        <i>word-wrap: break-word</i> CSS attribute:
        <div style="word-wrap: break-word">
            AReallyLongWordThatNeedsToBeBroken AndAnotherWord
        </div>
    </body>
</html>
4 голосов
/ 16 февраля 2010

Мой ответ от другого экземпляра этого вопроса, найденный на Обтекание длинного текста в CSS :

Я использую комбинацию

word-wrap: break-word;
overflow: hidden;

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

2 голосов
/ 13 февраля 2010

[ Edit : OP обновил свой вопрос, сказав, что это специально для пользовательского контента; нижеприведенное не будет (легко) работать для этого (вам понадобится собственный словарь переносов). Однако, оставив его здесь, на случай, если кто-то найдет этот вопрос и для этого понадобится опция HTML.]

Вы можете использовать мягкий дефис (он же необязательный дефис; &shy; или &#173;). Это было определено еще в HTML4 . Я никогда не использовал его, но я только попробовал, и он работает в: IE6, IE7, Chrome 4, FF 3.6 и Safari 4 для Windows по крайней мере.

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

1 голос
/ 01 апреля 2014

Я нашел похожий ответ здесь: http://css -tricks.com / сниппеты / CSS / предотвращения удлиненные-URLs-из-взлома-из-контейнера /

Более надежная поддержка браузера

Только CSS

-ms-word-break: break-all;

     /* Be VERY careful with this, breaks normal words wh_erever */
     word-break: break-all;

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

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

Если ваш текст сгенерирован PHP , у вас есть функция PHP :

WordWrap

<?php
  $text = "The quick brown fox jumped over the lazy dog.";
  $newtext = wordwrap($text, 20, "<br />\n");

  echo $newtext;
?>

Также вы можете попробовать PHP-функцию взорвать , если у вас есть и вы знаете разделитель. Показать после цикла for (explode возвращает массив).

1 голос
/ 13 февраля 2010

Вы можете проверить word-wrap: break-word свойство CSS.

Следующий пример работает в Google Chrome 4.0, Firefox 3.5.7, Safari 4.0.4 и IE 8:

<html>
<body>
    <div style="word-wrap: break-word; width: 50px;">
        Loremipsumdolorsitametconsectetueradipiscingelitselaoreetdoloremagnaaliq
    </div>
</body>
</html>

К сожалению, как заметил BalusC в комментарии к одному из ответов , вышеприведенное не будет работать в версиях Firefox старше 3.5 . Поскольку численность пользователей, использующих старые версии Firefox, , по-видимому, ниже ~ 6% , как отметили , отметил Т.Дж. Crowder , вы можете использовать overflow: scroll для браузеров, которые не поддерживают word-wrap. Это может выглядеть не очень хорошо, но если вы не ожидаете, что многие слова будут длиннее, чем выделенное пространство, вероятность того, что один из пользователей увидит полосу прокрутки, будет очень низкой, и с течением времени она станет еще ниже. пользователи обновляют свои браузеры. По крайней мере, в таких ситуациях вы бы изящно потерпели неудачу.

0 голосов
/ 21 апреля 2010

Введите разрыв строки клавиатуры в той точке, в которой вы хотите ее разорвать.

например.

Thisisaverylongword

станет

Thisisavery * 1009 длинное слово *

0 голосов
/ 13 февраля 2010

В прошлом я использовал что-то вроде этого (который не работал в Safari в то время, IIRC, но это было несколько лет назад):

A<wbr>V<wbr>e<wbr>r<wbr>y<wbr>L<wbr>o<wbr>n<wbr>g<wbr>W<wbr>o<wbr>r<wbr>d A<wbr>n<wbr>d<wbr>A<wbr>n<wbr>o<wbr>t<wbr>h<wbr>e<wbr>r<wbr>W<wbr>o<wbr>r<wbr>d

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

...