Я сделал образ для этого вопроса, чтобы его было легче понять.
Можно ли создать многоточие <div>
с фиксированной шириной и несколькими строками?
Я попробовал несколько плагинов jQuery, но не могу найти тот, который ищу. Любая рекомендация? Идеи?
javascript
jquery
html
css
Эдвард
источник
источник
Ответы:
Просто быстрая основная идея.
Я тестировал со следующей разметкой:
И CSS:
Применение этого jQuery приведет к желаемому результату:
Он многократно пытается удалить последнее слово текста, пока не достигнет желаемого размера. Из-за переполнения: скрыто; процесс остается невидимым, и даже при отключенном JS результат остается «визуально правильным» (конечно, без «...»).
Если вы объедините это с разумным усечением на стороне сервера (которое оставляет только небольшие накладные расходы), то оно будет работать быстрее :).
Опять же, это не полное решение, просто идея.
UPDATE: Добавлен jsFiddle Demo .
источник
li
и внутри каждого из них есть.block
и,.block h2
и мне нужно применить это кh2
внутренней части,.block
но я не мог заставить его работать. Есть ли разница, если их больше одного.block h2
?height*3
на несколько пикселей. Легко исправить, просто добавив несколько пикселей кdivh
while
строки:if(!$p.text().match(/\W*\s(\S)*$/)) break;
while ((upper-lower)>1) {let middle=((lower+upper)/2)|0 /*|0 is quick floor*/; if (test(words.slice(0,middle)+'...')) {lower=middle;} else {upper=middle;}}
. Как обнаружил @KrisWebDev, вы также захотите проверить одно гигантское слово.Попробуйте плагин jQuery.dotdotdot .
источник
Библиотеки Javascript для "зажима строк"
Обратите внимание, что «зажим линии» также обозначается как «Многоточие на блоке из нескольких линий» или «Вертикальный многоточие».
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Вот еще несколько, которые я еще не исследовал:
CSS решения для зажима линий
Есть несколько CSS-решений, но простейшее использование,
-webkit-line-clamp
которое плохо поддерживает браузер . Смотрите живую демонстрацию на jsfiddle.net/AdrienBe/jthu55v7/Многие люди приложили огромные усилия, чтобы сделать это, используя только CSS. Смотрите статьи и вопросы об этом:
Что я бы порекомендовал
Будь проще. Если у вас нет достаточно времени, чтобы посвятить себя этой функции, воспользуйтесь самым простым и проверенным решением: простым CSS или хорошо протестированной библиотекой javascript.
Пойдите для чего-то необычного / сложного / высоко настроенного, и вы заплатите цену за это в будущем.
Что делают другие
Хорошим решением может стать исчезновение, как у Airbnb. Это, вероятно, базовый CSS в сочетании с базовым jQuery. На самом деле, это выглядит очень похоже на это решение на CSSTricks
Да, и если вы ищете дизайн вдохновения:
источник
В HTML нет такой возможности, и это очень расстраивает.
Я разработал библиотеку, чтобы справиться с этим.
Проверьте мой сайт для скриншота, учебника и ссылки для скачивания.
источник
Чистое решение JS, основанное на решении bažmegakapa, и некоторая очистка для учета людей, которые пытаются дать высоту / максимальную высоту, которая меньше, чем у элемента lineHeight:
источник
У меня есть решение, которое работает хорошо, но вместо многоточия оно использует градиент. Преимущества в том, что вам не нужно выполнять какие-либо вычисления JavaScript, и это работает для контейнеров переменной ширины, включая ячейки таблицы. Он использует пару дополнительных элементов div, но его очень легко реализовать.
http://salzerdesign.com/blog/?p=453
Редактировать: Извините, я не знал, что ссылки не было достаточно. Решение состоит в том, чтобы поместить div вокруг текста и стилизовать div для управления переполнением. Внутри div поместите еще один div с градиентом затухания, который можно сделать с помощью CSS или изображения (для старого IE). Градиент переходит от прозрачного к цвету фона ячейки таблицы и немного шире, чем многоточие. Если текст длинный и переполняется, он попадает под div «fade» и выглядит «блеклым». Если текст короткий, исчезновение не видно, поэтому проблем нет. Два контейнера можно настроить таким образом, чтобы одна или несколько строк отображались путем установки высоты контейнера, кратной высоте текстовой строки. Div "Fade" может быть расположен только для последней строки.
источник
Вот простой способ CSS сделать это: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Вот резюме:
источник
Вы можете использовать
-webkit-line-clamp
собственность сdiv
.-webkit-line-clamp: <integer>
это означает установить максимальное количество строк перед усечением содержимого, а затем отобразить многоточие(…)
в конце последней строки.источник
Вот ванильное решение JavaScript, которое вы можете использовать в крайнем случае:
Вы можете поиграть с ним в коде ниже. Попробуйте изменить размер шрифта на панели CSS и внесите незначительные изменения в панель HTML (например, добавить дополнительное место где-нибудь), чтобы обновить результаты. Независимо от размера шрифта средний абзац всегда должен быть обрезан до количества строк во втором параметре, переданном в limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
источник
РЕДАКТИРОВАТЬ: наткнулся на Shave, который является плагином JS, который действительно хорошо выполняет многострочное усечение текста на основе заданной максимальной высоты. Он использует бинарный поиск, чтобы найти оптимальную точку останова. Определенно стоит исследовать.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Мне пришлось придумать ванильное решение JS для этой проблемы. В случае, над которым я работал, мне приходилось помещать длинное название продукта в ограниченную ширину и в две строки; усеченный многоточием, если необходимо.
Я использовал ответы из разных постов SO, чтобы приготовить то, что соответствует моим потребностям. Стратегия заключается в следующем:
Пример кода:
PS:
PPS: Просто понял, что это очень похоже на подход, предложенный @DanMan и @ st.never. Извлеките фрагменты кода для примера реализации.
источник
Очень простое решение для JavaScript. Divs должен быть стилизован, например:
И JS:
источник
Не точный ответ на вопрос, но я наткнулся на эту страницу, когда пытался сделать очень похожее, но хотел добавить ссылку «больше», а не просто многоточие. Это функция jQuery, которая добавляет ссылку «еще» к тексту, который переполняет контейнер. Лично я использую это с Bootstrap, но, конечно, он будет работать без.
Чтобы использовать, поместите свой текст в контейнер следующим образом:
Когда добавлена следующая функция jQuery, любой из div, который больше значения регулировки высоты, будет усечен и будет добавлена ссылка «Дополнительно».
На основании этого, но обновлено: http://shakenandstirredweb.com/240/jquery-moreless-text
источник
Упомянутый плагин dotdotdot jQuery хорошо работает с angular:
Соответствующая разметка будет:
источник
Чистая демонстрация JS (без jQuery и цикла while)
Когда я искал решение проблемы многострочного эллипса, я удивился, что без jQuery нет ничего хорошего. Также есть несколько решений, основанных на цикле while, но я думаю, что они не эффективны и опасны из-за возможности попасть в бесконечный цикл. Итак, я написал этот код:
источник
Может быть, довольно поздно, но используя SCSS, вы можете объявить такую функцию:
И используйте это как:
Который будет обрезать текст до одной строки и зная, что это 1.4 его высота строки. Ожидаемый результат: Chrome для рендеринга
...
в конце и FF с небольшим затуханием в концеFire Fox
Хром
источник
Нашел это короткое CSS- решение в ответе Adrien Be :
По состоянию на март 2020 года поддержка браузеров составляет 95,3% , не поддерживается в IE и Opera Mini. Работает на Chrome, Safari, Firefox и Edge.
источник
Вы вероятно не можете сделать это (в настоящее время?) Без шрифта фиксированной ширины, как Courier. При использовании шрифта фиксированной ширины каждая буква занимает одно и то же горизонтальное пространство, так что вы, вероятно, можете посчитать буквы и умножить результат на текущий размер шрифта в ems или exs. Тогда вам просто нужно проверить, сколько букв помещается на одной строке, а затем разбить их.
В качестве альтернативы, для шрифтов с нефиксированным шрифтом вы можете создать отображение для всех возможных символов (например, i = 2px, m = 5px) и затем выполнить математику. Хотя много ужасной работы.
источник
Чтобы расширить решение @ DanMan: в случае, когда используются шрифты переменной ширины, вы можете использовать среднюю ширину шрифта. Это имеет две проблемы: 1) текст со слишком большим количеством символов W будет переполнен и 2) текст со слишком большим количеством символов I будет обрезан раньше.
Или вы могли бы выбрать подход в худшем случае и использовать ширину буквы «W» (которая, я считаю, самая широкая). Это устраняет проблему 1 выше, но усиливает проблему 2.
Другой подход может быть следующим: оставить
overflow: clip
в div и добавить раздел с многоточием (может быть, другой div или изображение) с помощьюfloat: right; position: relative; bottom: 0px;
(не проверено). Хитрость заключается в том, чтобы изображение появилось над концом текста.Вы также можете отображать изображение только тогда, когда знаете, что оно будет переполнено (скажем, после примерно 100 символов)
источник
overflow: clip
? И что вы ожидаете от CSSfloat
?С этим кодом нет необходимости в дополнительном элементе-обёртке, если высота элемента ограничена стилем max-height.
Кроме того, он сохраняет исходный текст в атрибуте данных, который может отображаться с использованием только стилей, например. при наведении мыши:
источник
В моем сценарии я не мог заставить работать ни одну из функций, упомянутых выше, и мне также нужно было указать функции, сколько строк показать, независимо от размера шрифта или размера контейнера.
Я основано мое решение по использованию Canvas.measureText метода (whic является HTML5 функция) , как описано здесь , на Доми , так что это не полностью кросс-браузер.
Вы можете увидеть, как это работает на этой скрипке .
Это код:
И HTML-код для его использования будет выглядеть так:
Код , чтобы получить семейство шрифтов довольно просто, и в моем случае работает, но для более сложных сценариев , возможно , потребуется использовать что - то вдоль этих линий .
Кроме того, в моем случае я сообщаю функции, сколько строк использовать, но вы можете рассчитать, сколько строк показать в соответствии с размером контейнера и шрифтом.
источник
Я сделал версию, которая оставляет HTML нетронутым. пример jsfiddle
JQuery
CSS
пример jsfiddle
источник
Я написал угловой компонент, который решает проблему. Он разбивает данный текст на элементы span. После рендеринга он удаляет все переполненные элементы и помещает многоточие сразу после последнего видимого элемента.
Пример использования:
Демонстрация Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
Компонент:
источник
Здесь я сделал еще одну библиотеку с более быстрым алгоритмом. Пожалуйста, проверьте:
https://github.com/i-ahmed-biz/fast-ellipsis
Чтобы установить с помощью Bower:
Чтобы установить с помощью npm:
Надеемся, вам понравится!
источник
не уверен, что это то, что вы ищете, он использует минимальную высоту вместо высоты.
источник
Очень простой функционал подойдет.
Директива:
Посмотреть:
источник
iiiiiiiiii
ПротивMMMMMMMMMM
(хотя текущий шрифт не так видим, хотя: D).