2012-06-08 1 views
1

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

Например, это выглядит нормально:

This is the title 

Но если у меня есть длинное название, это может закончиться завернутые так:

This is a slightly longer 
title 

Как вы можете видеть, что второй один Безразлично» т действительно выглядят очень хорошо, то, что я стремлюсь к что-то вроде этого:

This is a nicer 
wrapped title 

Я знаю, насколько большой содержащий DIV Wi будет, так что это не проблематичная переменная, но я пытаюсь обойти все возможные способы достижения красиво отформатированных названий и их недостатков. Итак, вопрос в том, какой был бы лучший способ сделать это? Я могу придумать несколько способов, но они начинают экспоненциально усложняться, если они обертывают более двух строк.

EDIT: В настоящее время я использую это - https://xnode.org/paste/19 - чтобы попытаться выровнять сплит-линии, хотя я уверен, что это далеко не идеально.

+0

Это будет проблематично сделать с помощью PHP.Конечно, когда шрифт, используемый внутри div, является моноширинным, это так же тривиально, как получение правильного количества символов в строке. Но если это не так, вы получите гораздо более сложный алгоритм, который должен включать стили шрифтов и многое другое. И вам нужно будет убедиться, что он отображается в браузере точно так, как вы думаете. – Polygnome

+0

Я собрал что-то быстро, что работает немного как Wordwrap, но дает мне больше контроля - https://xnode.org/paste/18 - он все еще полагается на меня, угадывая, сколько символов подходит, но технически все должно масштабироваться с браузерами, и если я сохраню значение обертки немного ниже, чем то, что должно действительно соответствовать, оно должно избегать проблем. Однако любые лучшие идеи приветствуются. – Enverex

ответ

0

Вы можете удалить символ новой строки, а затем использовать wordwrap функция

+0

Работает только с моноширинными шрифтами. – Polygnome

+0

Не помогает выравнивать распределение по нескольким строкам. – Enverex

0

Попробуйте использовать wordwrap функцию и дать этот CSS для DIV:

div { 
    text-align: justify; 
} 
+0

Это не оказывает никакого влияния на ломаные линии, это только оправдывает текст, он даже не выделяет, сколько текста разделено на каждую строку. – Enverex

+0

То, что я сказал, использует как 'word-wrap', так и' justify'. Я все еще смущен, чего вы хотите достичь. –

+0

Wordwrap не учитывает, сколько времени предложение в целом, таким образом, оно будет обертываться по значению X, так же, как браузер уже сам по себе. Ключ состоит в том, что если текст должен быть обернут, я хочу, чтобы строки были разделены равномерно, см. Примеры, которые я опубликовал в исходном вопросе. – Enverex

0

Если http://fittextjs.com/ не делает трюк, попробуйте что-нибудь в этом направлении ...

Подсчитайте персонажей своего названия и решите, понадобится ли ему 1 линия, 2 линии 3 линии и т. Д. (Будет задействована некоторая пробная ошибка &)

Замените все пространства, кроме того, где вы хотите разрывов строк с   (неразрывные пробелы), и пусть браузер выполняет перенос слов.

Другими словами, в вашем примере This is a nicer wrapped title имеется 29 букв, поэтому вам нужно перерыв на полпути или сразу после этого, поэтому замените первое неразрывное пространство после позиции 14 или 15 с обычным пространством, т.е. между ' более приятным »и« завернутым », и это должно выполнить эту работу. То же самое в трети или четверти для более длинных линий.

Извините, нет кода, но из приведенных выше примеров вам должно быть хорошо, придумать собственную реализацию.

+0

Идея nbsp хорошая, предотвращает обертывание браузера, а также мои собственные обертки (таким образом я могу использовать один или другой). Не поклонник делать это через браузер, хотя из-за неожиданного поведения, то есть, что сайт fittextjs фактически не отображал заголовок в правильном размере до тех пор, пока я не обновился. – Enverex

0

Я создал этот плагин JQuery, который делает то, что вы хотите

$.fn.prettyBreak = function() { 

    return this.each(function() { 

     var element = $(this); 

     var elementLineHeight = element.css("line-height").replace("px", ""); 

     var elementContent = element.contents(); 

     element.wrapInner("<span style='white-space: nowrap'>"); 

     element.find("br").remove(); 

     var textWidth = element.find("span").width(); 

     element.html(elementContent); 

     var elementText = $.trim(element.text()); 

     if (element.is(":visible") && textWidth > element.width() && element.height() < elementLineHeight * 2.1) { 

      var middle = Math.floor(elementText.length/2); 
      var before = elementText.lastIndexOf(" ", middle); 
      var after = elementText.indexOf(" ", middle + 1); 

      if (middle - before < after - middle) { 
       middle = before; 
      } else { 
       middle = after; 
      } 

      var s1 = elementText.substr(0, middle); 
      var s2 = elementText.substr(middle + 1); 

      element.html(s1 + "<br> " + s2); // note the space after the tag 

     } else { 
      element.html(elementText); 
     } 

     if (element.is(":visible")) { 
      element.css("opacity", 1); 
     } 

    }); 
} 

Использование:

$(document).on("ready", function() { 
    $(".pretty-break:visible").prettyBreak(); 

    setInterval(function() { 
     $(".pretty-break:visible").prettyBreak(); 
    }, 1000); 
}); 

GitHub ссылка: https://github.com/SumoSoft/PrettyBreak

Смежные вопросы