Многоточие ('') в CSS после одной или двух строк

Я пытаюсь создать перенос слов в JavaScript с помощью CSS, и условие:

Если DIV содержит одно очень длинное слово, например "asdasfljashglajksgkjasghklajsghl", я хочу отобразить:

     |asdasfljashglajk...|

Если DIV содержит длинное предложение, например «если бы у меня было десять центов за каждый раз, когда мне говорили, что я не могу», я хочу отобразить:

     |if i had a dime for|
     |everytime i was... |

Работаю с HTML, CSS, JavaScript. Я не могу использовать jQuery.

Пожалуйста, дайте мне знать, если это возможно.


person user349072    schedule 26.07.2012    source источник
comment
Можете ли вы определить, что именно для вас значат длинное слово и длинное предложение? (Количество символов, определенная ширина ...)   -  person Pekka    schedule 26.07.2012


Ответы (9)


Для этого вы можете использовать свойство text-overflow: ellipsis;. Напишите так

white-space: nowrap;
text-overflow: ellipsis;
person Prashobh    schedule 26.07.2012
comment
Это будет работать в первом случае (многоточие в длинном слове), но не во втором (многоточие во второй строке). - person Herman Schaaf; 26.07.2012
comment
Второй случай не прост только с css, см. stackoverflow.com/questions/3404508/ - person Luca; 26.07.2012
comment
да для нескольких строк, javascript - это решение - person Prashobh; 26.07.2012
comment
спасибо, мне удалось создать многоточие для 2 строк, и мне удалось создать для одной строки. есть ли способ получить их оба с помощью JS или html css? я имею в виду, если есть одно длинное слово (длину можно установить), тогда ... появляется в той же строке, а если слов много, ... появляется во второй строке? еще раз спасибо - person user349072; 26.07.2012
comment
также может потребоваться переполнение: в некоторых случаях скрыто. - person Neil; 09.12.2014
comment
Почему это выбранное решение, если оно не решает проблему наличия двух + строк текста? - person Matt; 26.11.2020

Я знаю, что немного опоздал с ответом, но я только что написал кусок кода, сообщающий о том, что:

    if ($('your selector').height() > 50) {
        var words = $('your selector').html().split(/\s+/);
        words.push('...');

        do {
            words.splice(-2, 1);
            $('your selector').html( words.join(' ') );
        } while($('your selector').height() > 50);
    }

и, конечно, вы должны сохранить селектор jQuery в переменной, чтобы не запрашивать DOM каждый раз.

person alecs.popa    schedule 07.05.2013
comment
OP не сказал I can't use jQuery? - person Robin Métral; 30.10.2019

Нашел это:

http://codepen.io/martinwolf/pen/qlFdp

Похоже, -webkit-line-clamp работает в некоторых браузерах.

person Mouscellaneous    schedule 12.06.2014
comment
круто, большая нравится, мне очень помогло - person Arya Aghaei; 18.07.2017

К сожалению, с одним только CSS я не думаю, что вы сможете.

http://jsfiddle.net/TVVHs/

text-overflow: ellipsis; только работает с white-space: nowrap;, что предотвращает появление нескольких строк.

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

person Alex Wayne    schedule 26.07.2012
comment
Что касается медленности решения JavaScript, его можно было бы ускорить, выполнив двоичный поиск максимального количества слов, которые умещаются в желаемой высоте, вместо линейного поиска. Например, начните с половины слов, а затем, если это слишком много, попробуйте четверть слов, и если все подходит, попробуйте 3/8 слов и т. Д. - person Rory O'Kane; 07.05.2013

когда вам будет разрешено использовать jQuery, вы можете увидеть плагин dotdotdot по этой ссылке .. очень простой в использовании и он отлично работает!

На данный момент я могу предложить вам взглянуть на эту скрипку! сработает text-overflow: ellipsis

person user2274431    schedule 07.05.2013
comment
извините .. я недавно заметил, что @Luca уже связал обсуждение, из которого я взял скрипку! - person user2274431; 07.05.2013

После того, как я поигрался с CSS, чтобы придумать "следующее лучшее" ТОЛЬКО решение для CSS, я пришел к следующему:

p.excerpt { position: relative; height: 63px; line-height: 21px; overflow-y: hidden; }
p.excerpt:after { content: '...'; position: absolute; right: 0; bottom: 0; }

Это всегда предполагает, что у вас есть как минимум 3 строки текста, и с этим есть несколько проблем. Если последнее слово, которое нужно перенести в строку 4, очень длинное, между последним словом и многоточием будет необычно большой пробел. Точно так же оно могло перекрывать последнее слово, если оно было чем-то очень, очень маленьким, например "а".

Вы можете добавить еще один контейнер и иметь многоточие за пределами p, и, немного подправив комментарий, я уверен, что кто-то подберет что-нибудь получше.

person TbWill4321    schedule 18.08.2013
comment
Это мне очень помогло !! Я просто добавил дополнительный класс css для пустых ячеек, чтобы они не отображали ... когда больше нет текста для отображения p.excerpt: empty {height: 0; высота строки: 0; } - person JonSnow; 06.01.2015

Надеюсь, что это ответ на ваш вопрос

  @mixin multilineEllipsis(
  $lines-to-show: 2,
  $width: 100%,
  $font-size: $fontSize-base,
  $line-height: 1.6) {

  display: block; /* Fallback for non-webkit */
  display: -webkit-box;
  max-width: $width;
  height: $font-size * $line-height * $lines-to-show; /* Fallback for non-webkit */
  font-size: $font-size;
  -webkit-line-clamp: $lines-to-show;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

http://codepen.io/martinwolf/pen/qlFdp http://caniuse.com/#search=-webkit-line-clamp

person Julian Tellez    schedule 18.08.2016
comment
Почему этот ответ не пользуется популярностью? Он работает, пока текст длиннее установленной ширины. вы можете создать общую ширину и высоту и получить желаемый результат. - person LUser; 19.08.2017

Если вы можете гарантировать, что контент будет перетекать, вот решение, которое я придумал. Это работает для моего сайта, и я хотел, чтобы он был простым.

html:

<p class="snippet">
   [content]
</p>

css:

.snippet {
    position: relative;
    height: 40px; // for 2 lines
    font-size: 14px; // standard site text-size
    line-height: 1.42857; // standard site line-height
    overflow: hidden;
    margin-bottom: 0;
}
.news-insights .snippet:after {
    content: "\02026";
    position: absolute;
    top: 19px;
    right: 0;
    padding-left: 5px;
    background: linear-gradient(to right, rgba(255, 255, 255, 0), white 20%, white); // use vendor prefixes for production code
}

Затем вы можете поиграть с отступом и градиентом фона, чтобы получить более стильную презентацию.

person Ryan Walton    schedule 22.07.2015

Отображение многоточия нужно обрабатывать по-разному, когда ширина контейнера фиксированная и процентная.

  • При фиксированной ширине контейнера

    .nooverflow{
        display: inline-block;
        overflow: hidden;
        overflow-wrap: normal;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

  • Когда ширина контейнера выражается в процентах или автоматически, в этом сценарии определите другой тег в этом контейнере для визуализации текста и укажите ширину как 0 и минимальную ширину как 100%, таким образом он будет принимать ширину контейнера и отображать многоточие. Ниже приведен используемый класс LESS:

    .nooverflow{
        display: inline-block;
        overflow: hidden!important;
        overflow-wrap: normal;
        text-overflow: ellipsis;
        white-space: nowrap!important;
        width: 0;
        min-width: 100%;
    }

person Dilip Nannaware    schedule 26.09.2016