16 ответов:
требование
text-overflow: ellipsis;работать-это однострочная версияwhite-space(pre,nowrapetc). Это означает, что текст никогда не достигнет второй строки.Ergo. Невозможно в чистом CSS.
мой источник, когда я искал то же самое, только сейчас: http://www.quirksmode.org/css/textoverflow.html (англ. США.)
EDIT если хорошие боги CSS будут реализовывать http://www.w3.org/TR/css-overflow-3/#max-lines мы можем сделать это в чистом CSS с помощью
fragments(новое) иmax-lines(новое). Также немного больше информации о http://css-tricks.com/line-clampin/EDIT 2 WebKit / Blink имеет
line-clamp:-webkit-line-clamp: 2поставим многоточие на 2-й линии.
Это должно работать в браузерах webkit:
overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
я обнаружил, что ответ скипа был недостаточен и нуждался в
overflowстиль тоже:overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 2; display: -webkit-box; -webkit-box-orient: vertical;
Как жаль, что вы не можете заставить его работать над двумя строками! Было бы здорово, если бы элемент был отображаемым блоком и имел высоту, установленную на 2em или что-то еще, и когда текст переполнялся, он показывал бы многоточие!
для одного лайнера вы можете использовать:
.show-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }для нескольких строк, возможно, вы могли бы использовать полифилл, такой как jQuery autoellipsis, который находится на github http://pvdspek.github.com/jquery.autoellipsis/
если кто - то использует SASS/SCSS и натыкается на этот вопрос-возможно, этот миксин может помочь:
@mixin line-clamp($numLines : 1, $lineHeight: 1.412) { overflow: hidden; text-overflow: -o-ellipsis-lastline; text-overflow: ellipsis; display: block; /* autoprefixer: off */ display: -webkit-box; -webkit-line-clamp: $numLines; -webkit-box-orient: vertical; max-height: $numLines * $lineHeight + unquote('em'); }это только добавляет многоточие в браузерах webkit. отдых просто отрезает его.
Я не JS pro, но я выяснил пару способов, которыми вы могли бы это сделать.
HTML:
<p id="truncate">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi elementum consequat tortor et euismod. Nam commodo consequat libero vel lobortis. Morbi ac nisi at leo vehicula consectetur.</p>затем с помощью jQuery вы усекаете его до определенного количества символов, но оставляете последнее слово следующим образом:
// Truncate but leave last word var myTag = $('#truncate').text(); if (myTag.length > 100) { var truncated = myTag.trim().substring(0, 100).split(" ").slice(0, -1).join(" ") + "…"; $('#truncate').text(truncated); }результат выглядит так:
компания ipsum боль сидеть Амет, consectetur проектами работающих вы где элит. Морби
elementum consequat tortor et...или, вы можете просто усечь его до a конкретный счетчик символов, как это:
// Truncate to specific character var myTag = $('#truncate').text(); if (myTag.length > 15) { var truncated = myTag.trim().substring(0, 100) + "…"; $('#truncate').text(truncated); }результат выглядит так:
компания ipsum боль сидеть Амет, consectetur проектами работающих вы где элит. Морби
elementum consequat tortor et euismod...надеюсь, что это немного помогает.
здесь jsFiddle.
Я использовал jQuery-condense-plugin до, который выглядит как он может делать то, что вы хотите. Если нет, то есть различные плагины что может удовлетворить ваши потребности.
Edit: сделал тебя демо - обратите внимание, что я связал jquery.конденсироваться.js на демо, которое делает магию, так что полный кредит автору этого плагина:)
это нестандартный CSS, который не покрывается в текущей версии CSS (Firefox его не поддерживает). Попробуйте вместо этого использовать JavaScript.
здесь пример в чистом css.
.container{ width: 200px; } .block-with-text { overflow: hidden; position: relative; line-height: 1.2em; max-height: 3.6em; text-align: justify; margin-right: -1em; padding-right: 1em; } .block-with-text+.block-with-text{ margin-top:10px; } .block-with-text:before { content: '...'; position: absolute; right: 0; bottom: 0; } .block-with-text:after { content: ''; position: absolute; right: 0; width: 1em; height: 1em; margin-top: 0.2em; background: white; }<div class="container"> <div class="block-with-text"> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a </div> <div class="block-with-text"> Lorem Ipsum is simply dummy text of the printing and typesetting industry </div> <div class="block-with-text"> Lorem Ipsum is simply </div> </div>
Я встречал эту проблему раньше, и нет чистого решения css
вот почему я разработал небольшую библиотеку для решения этой проблемы (среди прочих). Библиотека предоставляет объекты для моделирования и выполнения отрисовки текста на уровне букв. Вы можете, например, эмулировать text-overflow: ellipsis с произвольным пределом (не обязательно одна строка)
подробнее на http://www.samuelrossille.com/home/jstext.html для скриншота, учебника и dowload ссылка на сайт.
если кто-то пытается получить line-clamp для работы в flexbox, это немного сложнее - особенно когда вы мучаете тестирование с очень длинными словами. Единственные реальные различия в этом фрагменте кода
min-width: 0;в элементе flex, содержащем усеченный текст, иword-wrap: break-word;. Кончик шляпы к https://css-tricks.com/flexbox-truncated-text/ для прозрения. Отказ от ответственности: это все еще webkit только до тех пор, пока я знать..flex-parent { display: flex; } .short-and-fixed { width: 30px; height: 30px; background: lightgreen; } .long-and-truncated { margin: 0 20px; flex: 1; min-width: 0;/* Important for long words! */ } .long-and-truncated span { display: inline; -webkit-line-clamp: 3; text-overflow: ellipsis; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; word-wrap: break-word;/* Important for long words! */ }<div class="flex-parent"> <div class="flex-child short-and-fixed"> </div> <div class="flex-child long-and-truncated"> <span>asdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd</span> </div> <div class="flex-child short-and-fixed"> </div> </div>http://codepen.io/AlgeoMA/pen/JNvJdx (версия codepen)
просто используйте line-clamp для браузеров, которые его поддерживают(большинство современных браузеров), и вернитесь к 1 строке для более старых.
.text { white-space: nowrap; text-overflow: ellipsis; overflow: hidden; @supports (-webkit-line-clamp: 2) { overflow: hidden; text-overflow: ellipsis; white-space: initial; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } }
чистый css метод базы на webkit-line-clamp, который работает на webkit:
@-webkit-keyframes ellipsis {/*for test*/ 0% { width: 622px } 50% { width: 311px } 100% { width: 622px } } .ellipsis { max-height: 40px;/* h*n */ overflow: hidden; background: #eee; -webkit-animation: ellipsis ease 5s infinite;/*for test*/ /** overflow: visible; /**/ } .ellipsis .content { position: relative; display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-pack: center; font-size: 50px;/* w */ line-height: 20px;/* line-height h */ color: transparent; -webkit-line-clamp: 2;/* max row number n */ vertical-align: top; } .ellipsis .text { display: inline; vertical-align: top; font-size: 14px; color: #000; } .ellipsis .overlay { position: absolute; top: 0; left: 50%; width: 100%; height: 100%; overflow: hidden; /** overflow: visible; left: 0; background: rgba(0,0,0,.5); /**/ } .ellipsis .overlay:before { content: ""; display: block; float: left; width: 50%; height: 100%; /** background: lightgreen; /**/ } .ellipsis .placeholder { float: left; width: 50%; height: 40px;/* h*n */ /** background: lightblue; /**/ } .ellipsis .more { position: relative; top: -20px;/* -h */ left: -50px;/* -w */ float: left; color: #000; width: 50px;/* width of the .more w */ height: 20px;/* h */ font-size: 14px; /** top: 0; left: 0; background: orange; /**/ }<div class='ellipsis'> <div class='content'> <div class='text'>text text text text text text text text text text text text text text text text text text text text text </div> <div class='overlay'> <div class='placeholder'></div> <div class='more'>...more</div> </div> </div> </div>
не очень простой способ сделать это. Используйте струбцины.js библиотека.
$clamp(myHeader, {clamp: 3});
Я нашел решение, однако вам нужно знать приблизительную длину символа, которая будет вписываться в вашу текстовую область, а затем присоединиться ... в предыдущем пространстве.
Я сделал это так:
- предположим грубую длину символа (в данном случае 200) и переходим к a функция вместе с вашим текстом
- разделите пробелы, чтобы у вас была одна длинная строка
- используйте jQuery, чтобы получить срез первого "" пространства после вашего персонажа длина
- присоединяйтесь к оставшийся...
код :
truncate = function(description){ return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "..."; }вот скрипка -http://jsfiddle.net/GYsW6/1/
Comments