Перенос слов в css / js

Я ищу кроссбраузерный способ обертывания длинных частей текста без разрывных пробелов (например, длинные URL-адреса) внутри div с заранее определенной шириной.

Вот несколько решений, которые я нашел в Интернете, и почему они не мне подходят:

  • переполнение: скрыто / авто / прокрутка - мне нужно, чтобы весь текст был виден без прокрутки. Div может расти вертикально, но не горизонтально.
  • Инъекционный & застенчивый; в строку через js / на стороне сервера - & shy; теперь поддерживается FF3, но копирование и вставка URL-адреса с помощью & shy; в середине не будет работать в Safari. Кроме того, насколько мне известно, нет чистого метода измерения ширины текста, чтобы определить наилучшие смещения строк для добавления этих символов (есть один хитрый способ, см. Следующий элемент). Другая проблема заключается в том, что масштабирование в Firefox и Opera может легко сломать это.
  • выгрузка текста в скрытый элемент и измерение offsetWidth - относится к пункту выше, требует добавления дополнительных символов в строку. Кроме того, измерение количества разрывов, необходимых в длинном тексте, может легко потребовать тысячи дорогостоящих вставок DOM (по одной на каждую длину подстроки), что может эффективно заморозить сайт.
  • с использованием моноширинного шрифта - опять же, масштабирование может испортить вычисления ширины, и текст не может быть стилизован свободно.

Вещи, которые выглядят многообещающими, но не совсем так:

  • word-wrap: break-word - теперь это часть рабочего проекта CSS3, но пока не поддерживается ни Firefox, ни Opera, ни Safari. Это было бы идеальным решением, если бы оно работало сегодня во всех браузерах :(
  • вставка тегов <wbr> в строку через js / на стороне сервера - копирование и вставка URL-адресов работает во всех браузерах, но у меня до сих пор нет хорошего способа измерить, где разместить разрывы. Кроме того, этот тег делает недействительным HTML.
  • добавление пауз после каждого символа - это лучше, чем тысячи вставок DOM, но все же не идеально (добавление элементов DOM в документ, помимо прочего, съедает память и замедляет запросы селектора).

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
40
0
48 264
8

Ответы 8

Здесь возникла не очень связанная проблема textarea со 100% шириной игнорирует ширину родительского элемента в IE7

Не знаю, было ли когда-либо найдено какое-либо окончательное решение, но похоже, что наиболее близким было word-break: break-all, которое могло бы выполнить работу в Internet Exploder.

Я также обнаружил, что этот http://petesbloggerama.blogspot.com/2007/02/firefox-ie-word-wrap-word-break-tables.html похоронен в моих закладках, что указывает на обходной путь для большинства других браузеров, который может помочь.

CSS3 будет отличным, если он когда-нибудь появится ...

Надеюсь, что это поможет, будет интересно посмотреть, что вы придумали. Извините, я не могу предложить ничего проверенного или более конкретного.

Обычно я справлялся с этим, используя комбинацию word-wrap и идеи <wbr>. обратите внимание, есть несколько варианты. как видите, &#8203;, вероятно, лучший вариант для совместимости.

Браузер word-wrap поддерживает не ужасный, учитывая все обстоятельства, Safari, Internet Explorer и Firefox 3.1 (Alpha Build) все поддерживают его (src), так что мы не так уж далеки от этого.

Что касается поломки на стороне сервера, я довольно успешно использовал этот метод (php):

function _wordwrap($text)   {
    $split = explode(" ", $text);
    foreach($split as $key=>$value)   {
        if (strlen($value) > 10)    {
            $split[$key] = chunk_split($value, 5, "&#8203;");
        }
    }
    return implode(" ", $split);
}

Обычно для слов более 10 символов я разбиваю их на 5 символов каждое. Кажется, это работает для всех случаев использования, которые мне передали.

Использование регулярного выражения в PHP должно быстрее разбивать длинные слова. Я создал функцию, которая обрабатывает htmlspecialchars и разбивает слова с помощью & shy; Вот функция для всех, кому интересно. Просто передайте строку и максимальную длину слова (оставьте 0, если вы не хотите разбивать слова с помощью & shy;), и он вернет строку с преобразованными специальными символами html и словами, разбитыми на & shy;

function htmlspecialchars2($string = "", $maxWordLength = 0)
{
    if ($maxWordLength > 0)
    {
        $pattern = '/(\S{'.$maxWordLength.',}?)/';
        $replacement = '$1&shy;';
        $string = preg_replace($pattern, $replacement, $string);
    }

    //now encode special chars but dont encode &shy;
    $string = preg_replace(array('/\&(?!shy\;)/','/\"/',"/\'/",'/\</','/\>/'), array('&amp;','&quot;','&#039;','&lt;','&gt;'), $string);

    return $string;
}

Вы можете использовать макет таблицы + атрибут CSS с переносом слов, который теперь работает в IE7-8 и FF3.5. Это не решит проблему, но, по крайней мере, ваш дизайн не будет нарушен.

Css yo!

.wordwrap {
    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+ */ 
}

Также я только что нашел эту статью http://www.impressivewebs.com/word-wrap-css3/

Итак, вы должны использовать

.wordwrap {  
    word-wrap: break-word;
}  

.no_wordwrap {  
    word-wrap: normal;
}  
word-wrap: break-word; работает для Firefox 3.5+, но не для встроенных элементов, таких как span. (даже не в Firefox 5.0). Вы должны применить display: inline-block;, чтобы охватить элементы с помощью word-wrap: break-word;.
crispy 24.06.2011 21:08

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

Очень похоже на ответ Оуэна, это дает то же самое на стороне сервера в одной строке:

return preg_replace_callback( '/\w{10,}/', create_function( '$matches', 'return chunk_split( $matches[0], 5, "&#8203;" );' ), $value );

это может решить вашу проблему

function htmlspecialchars2($string = "", $maxWordLength = 0){
 return  wordwrap($string , $maxWordLength,"\n", true);
 }

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