ключевое слово на элементах встроенного блока

0

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

http://jsfiddle.net/TGZ3K/8/

Уродство в стороне, это прекрасно, за исключением того факта, что слова разделяются пополам при упаковке. Любые идеи о том, как обойти это?

Если вы измените отображение на "inline", обертка будет работать, но встроенным элементам не может быть задана ширина.

Использование ширины букв вместо ширины может быть достаточно, но мне нужно вычислить что-то вроде:

width = letter-spacing - (actual character width as rendered)

Но опять же, получение реальной ширины встроенного элемента кажется сложным.

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

Примечание. Шрифт должен быть Arial, поэтому не шрифт фиксированной ширины, и мне нужно поддерживать IE8+

Изменить: Извините, он должен поддерживать внутренние теги форматирования, такие как strong или em (пример обновлен). Обычно это не поддерживается в letteringjs, поэтому я использую эту вилку для предотвращения удаления этих тегов:

https://github.com/maranomynet/Lettering.js/blob/master/jquery.lettering.js

Теги:
letteringjs

1 ответ

1
Лучший ответ

Если вы закроете каждое слово в элементе <span/>, вы можете установить white-space:nowrap на этих пролетах, а текст внутри пролетов не будет завернут в середине слова, все слово будет обернуто.

Вот пример: http://jsfiddle.net/TGZ3K/4/

Примечание. Я добавил несколько JS для добавления элементов SPAN, к которым я обращаюсь, затем использовал метод .lettering() для этих .lettering(). Мне пришлось обновить CSS, чтобы он работал правильно.

Обновленный JS

$('p').html('<span>' + $("p").text().replace(/\s/g, '</span> <span>') + '</span>').children().lettering();

Обновленный CSS

p span {
    white-space:nowrap;
}

p span span {
    display: inline-block;
    width: 10px;
}

ОБНОВИТЬ

Для поддержки вложенных тегов, таких как <b/> или <em/> вы можете сделать что-то вроде этого:

$('p').html('<span>' + $("p").html().replace(/\s/gi, '</span> <span>').replace(/(<b>|<em>)/gi, '</span>$1<span>').replace(/(<\\b>|<\\em>)/gi, '</span>$1<span>') + '</span>').find("span").lettering();

Где открытие и закрытие HTML-тегов обернуты в противоположные теги <span/>. Например

какой-то текст

Превращается в:

</span><b><span>some text</span></b><span>

И тогда старое regexp делает то же самое с пробелами, которые превращают HTML в:

</span><b><span>some</span> <span>text</span></b><span>

И затем мы начинаем нашу строку HTML с открытием и завершением строки HTML с закрывающим <span/>:

<span></span><b><span>some</span> <span>text</span></b><span></span>

Будет создано дополнительное <span/>, но они не должны смешиваться с потоком HTML.

  • 0
    Да, это работает, но вам, очевидно, нужно изменить jQuery, как вы это делали в своем примере. Я не думал, что это был вариант.
  • 0
    @JoshC Да, это необходимо ... нет способа не обернуть слова в какой-либо элемент, так как между буквами, которые связывают их вместе как слова, нет реальной связи, поэтому нам нужно как-то установить эту связь.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню