#jquery #css
#jquery #css
Вопрос:
Учитывая это:
<p class="summary">Here is some text, could be 5 words, could be 500 words.</p>
Я увеличиваю высоту абзаца с помощью этого кода:
var pHeight = $('.summary').height();
И в моем случае, если оно больше 32, оно будет длиной в три строки (что слишком длинно). В этом случае я хочу обрезать текст и вставить ссылку «Подробнее …». Проблема в том, как мне определить, где нужно обрезать, чтобы текст занимал всего две строки? Если бы только был какой-то способ, я мог бы взять количество символов и умножить его на некоторое число, равное размеру каждой буквы. С моноширинным пространством это было бы относительно просто, я думаю, но мы говорим об Arial.
Любые указания в правильном направлении были бы оценены, спасибо!
Комментарии:
1. Обычно лучше установить ограничение по символам, а не по строке. Разве это не вариант в данном случае?
Ответ №1:
По нескольким причинам нет хорошего способа сделать это. Во-первых, разные браузеры / платформы могут отображать шрифты по-разному (какой бы незначительной ни была разница). Во-вторых, в javascript нет способа извлечь индивидуальный размер символа данного шрифта (AFAIK).
Если бы я реализовывал что-то подобное, у меня просто была бы константа для максимально допустимой длины и substring
это. Я бы также сделал это на стороне сервера, поскольку нет смысла отправлять данные клиенту, который вы не собираетесь использовать.
Другим методом (хотя и не тем, который я бы использовал) было бы поместить ваш текст в div с заданными шириной и высотой, обрезая любое переполнение с помощью overflow: hidden
. Конечно, это потенциально может привести к неполному вырезанию слов, поэтому я бы не советовал этого делать.
Комментарии:
1. 1 для подстроки на стороне сервера и постоянной длины строки, разрешенной для обрезки.
Ответ №2:
Если ваш рост слишком высок, вы могли бы просто поместить «p» на белом фоне над третьей строкой и добавить в нее «Подробнее …». И добавьте высоту и «overflow: hidden» к вашему «p».
Ответ №3:
Я бы использовал расширитель текста jquery. Существует несколько вариантов, но вот пример:http://plugins.learningjquery.com/expander Точка среза основана на количестве символов, но методом проб и ошибок вы должны быть в состоянии найти количество символов, которое дает вам две строки.
Ответ №4:
Я некоторое время работал с некоторыми из этих проблем и тем временем прояснил некоторые идеи. Это довольно дорого в коде, но для меня это сработало хорошо. Аналогичную проблему я решаю в моем блоге, если вы знаете испанский и вам нужны идеи по кодированию, прямо сейчас я просто помогу вам.
Вы как бы знаете размер контейнера, если в нем должно быть 2 строки, исходя из высоты текста. Итак, представьте, что ваш контейнер имеет высоту в Ypx.
- Получить весь текст из контейнера
- Установите для контейнера значение переполнение: авто и установите максимальную высоту: Ypx;
- Начните добавлять слово за словом текст, который вы извлекли из контейнера
- Проверьте, является ли высота прокрутки меньше или равна Ypx
- Продолжайте добавлять слова, пока (4) не станет недействительным, затем удалите последнее добавленное вами слово.
Как я уже сказал, это не очень дешево, но я провел несколько тестов, и время, необходимое для выполнения этого, линейно, так что с несколькими словами это будет довольно быстро (когда вы проверяете более 10000 раз, это занимает чуть меньше секунды)
Надеюсь, это поможет!
Ответ №5:
Я написал небольшой плагин jQuery, который удаляет слова из содержимого до тех пор, пока элемент не станет ниже определенной высоты. (И это добавляет три точки в конце содержимого.) Это решение похоже на решение Lomefin. В отличие от его решения, мое оптимизировано для ситуаций, когда вам нужно удалить всего несколько слов.
Код находится здесь.
Ответ №6:
Я бы посоветовал использовать несколько разных фрагментов общего текста и посмотреть, сколько символов требуется для получения двух строк. Усредните результат и округлите в меньшую сторону, чтобы случайно не перейти к другому. Затем с вашим реальным текстом вы округляете до этого предполагаемого числа, и ваш текст должен заполнить около 2 строк.
Комментарии:
1. Мне это кажется немного дорогим: P
2. Дорого с точки зрения обработки на стороне клиента. Так что да, это отнимает много времени.
3. @Demian я имел в виду, что как разработчик, я имел в виду однократное измерение, чтобы увидеть, в среднем, сколько символов составляет 2 строки.
4. @thomas: Одноразовые измерения могут сработать для шрифта с одним интервалом, но предсказать фактическую длину шрифтов переменной ширины практически невозможно. Вы могли бы провести анализ наихудшего варианта (куча
W
вариантов), но это все равно не даст вам точного измерения ваших фактических отображаемых данных.5. @Demian вот почему я сказал использовать несколько разных фрагментов текста и усреднить результат. Я знаю, что это не лучшее решение, но тогда, как вы сказали, нет единственно правильного ответа.