puntos suspensivos css en segunda línea


208

CSS text-overflow: ellipsisen la segunda línea, ¿es esto posible? No puedo encontrarlo en la red.

ejemplo:

lo que quiero es así:

I hope someone could help me. I need 
an ellipsis on the second line of...

pero lo que pasa es esto:

I hope someone could help me. I ... 

3
AFAIK la elipsis aparecerá y cortará el texto al final del ancho del elemento. No fluirá a la siguiente línea. La mejor solución aquí sería implementar algún script del lado del servidor o del cliente que recorte automáticamente el texto a una cierta cantidad de caracteres y luego agregue los puntos suspensivos. Supongo que un script del lado del cliente sería mejor, lo que le permitiría tener disponible todo el texto original si lo necesita.
FarligOpptreden

Aquí hay una pregunta similar: stackoverflow.com/questions/3922739/…
Evgeny

tl; dr: solo es posible en webkit
Evgeny

Lo más cerca que llegué a lograr esto fue agregar un pseudo-elemento 'after' para los puntos suspensivos y colocarlo en línea, directamente después del elemento que contiene el texto. Pero los puntos suspensivos desaparecen si el texto del elemento es demasiado largo, por lo que tendría que recortar el texto de alguna manera para que esto sea confiable.
Jonathan

Respuestas:


105

Un requisito para text-overflow: ellipsis;trabajar es una versión de una línea de white-space( pre, nowrapetc.). Lo que significa que el texto nunca llegará a la segunda línea.

Es decir. No es posible en CSS puro.

Mi fuente cuando estaba buscando exactamente lo mismo en este momento: http://www.quirksmode.org/css/textoverflow.html (¡Quirksmode ftw!)

EDITAR Si los buenos dioses CSS implementarán http://www.w3.org/TR/css-overflow-3/#max-lines podemos hacer esto en CSS puro usando fragments(new) y max-lines(new). También más información en http://css-tricks.com/line-clampin/

EDIT 2 WebKit / Blink tiene line-clamp: -webkit-line-clamp: 2pondrá puntos suspensivos en la segunda línea.


9
Vigilando, pero hasta ahora parece que los dioses aún no están con nosotros: caniuse.com/#search=max-lines
Daniel

1
¿Cómo lograr la característica anterior que con saas? @Rudie
Bhoomi Bhalani

144

Esto debería funcionar en los navegadores webkit :

overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;

1
Tenga en cuenta que, a partir de este comentario, -webkit-line-clamp no respeta la visibilidad: oculto. bugs.webkit.org/show_bug.cgi?id=45399
Kevin

1
Oye, parece agradable pero no funciona para mí. Simplemente pone '...' en la línea de fijación dada, pero no corta el resto del texto (incluso con espacio en blanco)
lemoide

3
Es posible que deba agregar overflow: hiddenpara que esto funcione.
Robert

Esto no funcionará en Firefox, webkit no compatible con el motor gecko
ZetaPR

Esta debería ser la respuesta aceptada. Tampoco desea ningún relleno en la parte inferior del elemento al que aplique esto, ya que puede ver el resto del texto asomándose.
Tr1stan

34

Como otros ya han respondido, no existe una solución CSS pura. Hay un complemento jQuery que es muy fácil de usar, se llama dotdotdot . Utiliza el ancho y la altura del contenedor para calcular si necesita truncar y agregar puntos suspensivos.

$("#multilinedElement").dotdotdot();

Aquí hay un jsFiddle .


Este complemento también proporciona muchas otras utilidades como agregar enlaces "leer más", también puede analizar URI y marcado HTML. ¡Buen descubrimiento!
Martin Andersson

2
Probé jQuery dotdotdot 1.7.3 para una tienda de comercio electrónico, para limitar los nombres de productos en una página de categoría de cuadrícula a dos líneas. Después de una prueba exhaustiva, decidimos no usar este complemento porque a veces, después de una actualización de turno, el diseño de la página de categoría se rompería. YMMV. Al final, elegimos una solución JS de vainilla muy simple: si el elemento de nombre del producto clientHeight es menor que su scrollHeight, trunca el texto en un límite preestablecido y agrega "...". A veces, algunos nombres de productos pueden ser demasiado cortos debido al límite preestablecido, pero es súper estable.
thdoan

1
Fácil de implementar y funciona de maravilla. ¡Gracias!
Rachel S

Aunque funciona bien, desafortunadamente sufre problemas de rendimiento. Si su proyecto requiere múltiples usos de puntos suspensivos, considere otra opción. Además, aquí hay una cita del repositorio: "Debido a que su rendimiento no se puede mejorar, este complemento ya no se mantiene activamente".
boyomarinov

1
Además, no funcionaría si el texto cambia dinámicamente después de la carga :(
Dejell

34

Descubrí que la respuesta de Skeep no era suficiente y también necesitaba un overflowestilo:

overflow: hidden;
text-overflow: ellipsis;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;

18

Si alguien está usando SASS / SCSS y se topa con esta pregunta, tal vez esta combinación podría ser de ayuda:

@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');
}

esto solo agrega puntos suspensivos en los navegadores webkit. el descanso simplemente lo corta.


1
Usando LESS, tuve que cambiar /* autoprefixer: off */para que, de lo /*! autoprefixer: off */contrario , me -webkit-box-orient: vertical;eliminaran después de la compilación, lo que significa que los puntos suspensivos nunca aparecieron
Nathan

18

Solo use line-clamp para los navegadores que lo admiten (la mayoría de los navegadores modernos) y retroceda a 1 línea para los más antiguos.

  .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;
    }
  }

1
espacio en blanco: inicial; me salvó
James

10

¡Qué pena que no puedas hacer que funcione en dos líneas! ¡Sería increíble si el elemento fuera bloque de visualización y tuviera una altura establecida en 2em o algo así, y cuando el texto se desbordara mostraría una elipsis!

Para un solo revestimiento puede usar:

.show-ellipsis {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Para varias líneas, tal vez podría usar un Polyfill como jQuery autoellipsis que está en github http://pvdspek.github.com/jquery.autoellipsis/


Ese complemento es demasiado pesado para lo que hace. Tiene 5 años Más bien uso dotdotdotmencionado en otra publicación.
adi518

10

No soy un profesional de JS, pero descubrí un par de formas en que podrías hacer esto.

El 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>

Luego, con jQuery lo trunca a un recuento de caracteres específico, pero deja la última palabra así:

// 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);
}

El resultado se ve así:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
elementum consequat tortor et ...

O simplemente puede truncarlo a un recuento de caracteres específico como este:

// Truncate to specific character
var myTag = $('#truncate').text();
if (myTag.length > 15) {
  var truncated = myTag.trim().substring(0, 100) + "…";
  $('#truncate').text(truncated);
}

El resultado se ve así:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi
elementum consequat tortor et euismod ...

Espero que esto ayude un poco.

Aquí está el jsFiddle .


7

Aquí hay un buen ejemplo en CSS puro.

.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>


Bastante buena solución, solo trunca los textos incluso si la segunda línea es demasiado corta para ser truncada, pero aún así, pulgares arriba
Amin


4

Es un CSS no estándar, que no está cubierto en la versión actual de CSS (Firefox no lo admite). Intenta usar JavaScript en su lugar.


4

Manera css pura de recortar texto multilínea con puntos suspensivos

Ajuste la altura del contenedor de texto, línea de control para romper por -webkit-line-clamp: 2;

.block-ellipsis {
  display: block;
  display: -webkit-box;
  max-width: 100%;
  height: 30px;
  margin: 0 auto;
  font-size: 14px;
  line-height: 1;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}

3

He encontrado este problema antes, y no existe una solución CSS pura

Es por eso que he desarrollado una pequeña biblioteca para tratar este problema (entre otros). La biblioteca proporciona objetos para modelar y realizar la representación de texto a nivel de letra. Por ejemplo, puede emular un desbordamiento de texto: puntos suspensivos con un límite arbitrario (no es necesario una línea)

Lea más en http://www.samuelrossille.com/home/jstext.html para captura de pantalla, tutorial y enlace de descarga.


3

Si alguien está tratando de hacer que la pinza de línea funcione en flexbox , es un poco más complicado, especialmente una vez que está realizando pruebas de tortura con palabras realmente largas. Las únicas diferencias reales en este fragmento de código están min-width: 0;en el elemento flexible que contiene texto truncado, y word-wrap: break-word;. Una sugerencia para https://css-tricks.com/flexbox-truncated-text/ para obtener información. Descargo de responsabilidad: esto sigue siendo webkit solo hasta donde yo sé.

.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 (versión codepen)


1

Todas las respuestas aquí son incorrectas, faltan piezas importantes, la altura

.container{
    width:200px;
    height:600px;
    background:red
}
.title {
        overflow: hidden;
        line-height: 20px;
        height: 40px;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
    }
<div class="container">
    <div class="title">this is a long text you cant cut it in half</div>
</div>

0

Una base de método CSS pura en -webkit-line-clamp, que funciona en 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>



-6

Encontré una solución, sin embargo, necesita saber una longitud aproximada de caracteres que se ajuste a su área de texto, luego unir ... al espacio anterior.

La forma en que hice esto es:

  1. suponga una longitud aproximada de caracteres (en este caso 200) y pase a una función junto con su texto
  2. divide los espacios para que tengas una cadena larga
  3. use jQuery para cortar el primer "" espacio después de la longitud de su personaje
  4. únete al resto ...

codigo:

truncate = function(description){
        return description.split('').slice(0, description.lastIndexOf(" ",200)).join('') + "...";           
}

Aquí hay un violín: http://jsfiddle.net/GYsW6/1/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.