Elipsis de desbordamiento de texto en dos líneas

117

Sé que puede usar una combinación de reglas CSS para hacer que el texto termine con puntos suspensivos (...) cuando sea el momento de desbordar (salir de los límites de los padres).

¿Es posible (siéntase libre de decir simplemente no) lograr el mismo efecto, pero dejar que el texto se ajuste a más de una línea?

Aquí tienes una demostración .

div {
  width: 300px; 
  height: 42px; 
  overflow: hidden; 
  text-overflow: ellipsis; 
  white-space: nowrap;
}

Como puede ver, el texto termina con puntos suspensivos cuando es más ancho que el ancho del div. Sin embargo, todavía hay suficiente espacio para que el texto se ajuste en una segunda línea y continúe. Esto es interrumpido porwhite-space: nowrap , que es necesario para que la elipsis funcione.

¿Algunas ideas?

PD: No hay soluciones JS, CSS puro si es posible.

Tony Bogdanov
fuente
¿Qué determina "hay espacio"? ¿Está todo incluido la altura de la fuente en píxeles establecidos? ¿Qué pasaría si un usuario final aumentara el tamaño de fuente en su navegador?
Joel Etherton
@JoelEtherton Supongo que eso le corresponde al navegador decidir y sí, todo está en píxeles en mi caso.
Tony Bogdanov
Esta puede ser una buena solución: stackoverflow.com/questions/6222616/…
ivy
Esta es una lectura realmente agradable hackingui.com/front-end/…
anandharshan

Respuestas:

31

No estoy seguro si has visto ESTO , pero el excelente CSS-Tricks.com de Chris Coyier publicó un enlace a esto hace un tiempo y es una solución CSS pura que logra exactamente lo que busca.

(Haga clic para ver en CodePen)

HTML:

<div class="ellipsis">
    <div>
        <p>
            Call me Ishmael. Some years ago – never mind how long precisely – having
            little or no money in my purse, and nothing particular to interest me on
            shore, I thought I would sail about a little and see the watery part of the
            world. It is a way I have of driving off the spleen, and regulating the
            circulation. Whenever I find myself growing grim about the mouth; whenever it
            is a damp, drizzly November in my soul; whenever I find myself involuntarily
            pausing before coffin warehouses, and bringing up the rear of every funeral I
            meet; and especially whenever my hypos get such an upper hand of me, that it
            requires a strong moral principle to prevent me from deliberately stepping
            into the street, and methodically knocking people's hats off – then, I account
            it high time to get to sea as soon as I can.
        </p>
    </div>
</div>

CSS:

html,body,p {
    margin: 0;
    padding: 0;
    font-family: sans-serif;
}
.ellipsis {
    overflow: hidden;
    height: 200px;
    line-height: 25px;
    margin: 20px;
    border: 5px solid #AAA;
}
.ellipsis:before {
    content: "";
    float: left;
    width: 5px;
    height: 200px;
}
.ellipsis > *:first-child {
    float: right;
    width: 100%;
    margin-left: -5px;
}
.ellipsis:after {
    content: "\02026";
    box-sizing: content-box;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    float: right;
    position: relative;
    top: -25px;
    left: 100%;
    width: 3em;
    margin-left: -3em;
    padding-right: 5px;
    text-align: right;
    background-size: 100% 100%;/* 512x1 image,gradient for IE9. Transparent at 0% -> white at 50% -> white at 100%.*/
    background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAABCAMAAACfZeZEAAAABGdBTUEAALGPC/xhBQAAAwBQTFRF////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAA////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wDWRdwAAAP90Uk5TgsRjMZXhS30YrvDUP3Emow1YibnM9+ggOZxrBtpRRo94gxItwLOoX/vsHdA2yGgL8+TdKUK8VFufmHSGgAQWJNc9tk+rb5KMCA8aM0iwpWV6dwP9+fXuFerm3yMs0jDOysY8wr5FTldeoWKabgEJ8RATG+IeIdsn2NUqLjQ3OgBDumC3SbRMsVKsValZplydZpZpbJOQco2KdYeEe36BDAL8/vgHBfr2CvTyDu8R7esU6RcZ5ecc4+Af3iLcJSjZ1ivT0S/PMs3LNck4x8U7wz7Bv0G9RLtHuEq1TbJQr1OtVqqnWqRdoqBhnmSbZ5mXapRtcJGOc4t2eYiFfH9AS7qYlgAAARlJREFUKM9jqK9fEGS7VNrDI2+F/nyB1Z4Fa5UKN4TbbeLY7FW0Tatkp3jp7mj7vXzl+4yrDsYoVx+JYz7mXXNSp/a0RN25JMcLPP8umzRcTZW77tNyk63tdprzXdmO+2ZdD9MFe56Y9z3LUG96mcX02n/CW71JH6Qmf8px/cw77ZvVzB+BCj8D5vxhn/vXZh6D4uzf1rN+Cc347j79q/zUL25TPrJMfG/5LvuNZP8rixeZz/mf+vU+Vut+5NL5gPOeb/sd1dZbTs03hBuvmV5JuaRyMfk849nEM7qnEk6IHI8/qn049hB35QGHiv0yZXuMdkXtYC3ebrglcqvYxoj1muvC1nDlrzJYGbpcdHHIMo2FwYv+j3QAAOBSfkZYITwUAAAAAElFTkSuQmCC);
    background: -webkit-gradient(linear,left top,right top,
        from(rgba(255,255,255,0)),to(white),color-stop(50%,white));
        background: -moz-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -o-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: -ms-linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
        background: linear-gradient(to right,rgba(255,255,255,0),white 50%,white);
    }

Por supuesto, ser una solución CSS pura significa que también es bastante complicada, pero funciona de forma limpia y elegante. Asumiré que Javascript está fuera de discusión porque esto es mucho más fácil de lograr (y posiblemente más degradable) con Javascript.

Como beneficio adicional, hay un archivo zip descargable del proceso completo (si desea comprenderlo y todo), pero también un archivo de mezcla de SASS para que pueda plegarlo en su proceso fácilmente.

¡Espero que esto ayude!

http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/

dashard
fuente
Acabo de hacer clic en el enlace de Codepen en un teléfono Android y funcionó en Firefox. ¿En qué plataforma / navegador no funciona?
dashard
uploady.com/#!/download/kAwBXv1CqXg/PU68wrP6QzGgydlS Estoy usando Chrome y no hay puntos suspensivos en la vista previa. Sigue agregando líneas de texto, no pasa nada. ¿Después de cuántas líneas empezará a mostrar puntos suspensivos?
coding_idiot
En el enlace de carga que publicó, el texto claramente aún no había desbordado el contenedor. El texto tiene que ser demasiado para que se muestre el contenedor fijo antes de que aparezcan las elipses. Sigue agregando texto para ver el efecto.
dashard
@ MarcosPérezGude - no me sorprende. Aludido a eso con >> "Por supuesto, ser una solución CSS pura significa que también es bastante complicada ..." <<
dashard
137

Las propiedades CSS fáciles pueden hacer el truco. Lo siguiente es para una elipsis de tres líneas.

display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
pxthxk
fuente
15
esto no funciona en Firefox. solo chrome, safari y opera
anyavacy
1
según caniuse , dice que "es poco probable que otros navegadores admitan la propiedad tal cual". Así que levántate.
Matan Bobi
tipo suave .. muy útil
Valentino Pereira
4
También funciona gr8 en firefox
Nisharg Shah
4
Parece tener un gran apoyo ahora: caniuse.com/#search=line-clamp
Joao
52

Eche un vistazo a esta versión css pura: http://codepen.io/martinwolf/pen/qlFdp

display: -webkit-box;
max-width: 400px;
height: 109.2px;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
line-height: 1.625;
amcdnl
fuente
7
Eso es realmente genial, lástima que sea solo webkit. Aquí hay un artículo interesante sobre el tema: css-tricks.com/line-clampin
Tony Bogdanov
¿Por qué declaras dos text-overflowy displayreglas?
j08691
Un gran WoooW. Nunca había visto antes la abrazadera de línea
Mike Aron
1
Para tu información, esto también funciona bien en Firefox en estos días. ¡Gran solución!
Athoxx
solo 1 pregunta, cuando tengo una línea o dos líneas de texto, las quiero centradas, ¿cómo lo hago? Si agrego display flex pierdo los puntos suspensivos, parece que esto solo funciona si la pantalla: -webkit box está configurado
PirateApp
10

CSS a continuación debería hacer el truco.

Después de la segunda línea, el texto contendrá ...

line-height: 1em;
max-height: 2em;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
anandharshan
fuente
esto funcionó bien pero tuve que agregaroverflow:hidden
timhysniu
3

Use esto si lo anterior no funciona

 display: block;
 display: -webkit-box;
 max-width: 100%;
 margin: 0 auto;
 -webkit-line-clamp: 2;
 /* autoprefixer: off */
 -webkit-box-orient: vertical;
 /* autoprefixer: on */
 overflow: hidden;
 text-overflow: ellipsis;
Vikas Verma
fuente
2

Mi solución reutiliza la de amcdnl, pero mi alternativa consiste en usar una altura para el contenedor de texto:

.my-caption h4 {
    display: -webkit-box;
    margin: 0 auto;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    text-overflow: ellipsis;

    height: 40px;/* Fallback for non-webkit */
}
VincentPerrin.com
fuente
-webkit-line-clampno funciona para IE11, Edge o Firefox.
Gaʀʀʏ
@Garry, tienes razón, en ese momento habrías necesitado una corrección de JS, pero ahora funciona bien. caniuse.com/#search=webkit-line-clamp
VincentPerrin.com
1

Basado en una respuesta que vi en stackoveflow, creé este mixin MENOS ( use este enlace para generar el código CSS ):

.max-lines(@lines: 3; @line-height: 1.2) {
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: @lines;
  line-height: @line-height;
  max-height: @line-height * @lines;
}

Uso

.example-1 {
    .max-lines();
}

.example-2 {
    .max-lines(3);
}

.example-3 {
    .max-lines(3, 1.5);
}
Nabil Kadimi
fuente
1

Parece más elegante combinar dos clases. Puede abandonar la two-linesclase si solo necesita ver una fila:

.ellipse {
          white-space: nowrap;
          display:inline-block;
          overflow: hidden;
          text-overflow: ellipsis;
       }
      .two-lines {
          -webkit-line-clamp: 2;
          display: -webkit-box;
          -webkit-box-orient: vertical;
          white-space: normal;
      }
      .width{
          width:100px;
          border:1px solid hotpink;
      }
        <span class='width ellipse'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

       <span class='width ellipse two-lines'>
          some texts some texts some texts some texts some texts some texts some texts
       </span>

Derrocamiento de la juventud
fuente
1

La restricción a unas pocas líneas funcionará en casi todos los navegadores, pero no se mostrará una elipsis (3 puntos) en Firefox e IE. Demostración: http://jsfiddle.net/ahzo4b91/1/

div {
width: 300px;
height: 2.8em;
line-height: 1.4em;
display: flex;
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden; 
}
Nikith Reddy
fuente
0
          text-overflow: ellipsis;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          line-height: 36px;
          max-height: 18px;
          -webkit-line-clamp: 2;
          -webkit-box-orient: vertical;

Encontré una combinación de trabajos de sujeción de línea y altura de línea: D

jimmyNames
fuente
0

En mi aplicación angular, el siguiente estilo me funcionó para lograr puntos suspensivos en el desbordamiento de texto en la segunda línea :

 <div style="height:45px; overflow: hidden; position: relative;">
     <span class=" block h6 font-semibold clear" style="overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box; 
        line-height: 20px; /* fallback */
        max-height: 40px; /* fallback */
        -webkit-line-clamp: 2; /* number of lines to show */
        -webkit-box-orient: vertical;">
        {{ event?.name}} </span>
 </div>

Espero que ayude a alguien.

Nodirabegimxonoyim
fuente
0

Para aquellos que trabajan en scss , debe agregar!autoprefixer al comienzo del comentario para que se conserve para postcss:

Me enfrenté a ese problema, por eso lo publiqué aquí.

line-height: 1em;
max-height: 2em;
display: -webkit-box;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

Referencia

Awais
fuente
0

Puede usar un efecto de disolución en lugar de puntos suspensivos, CSS puro y un aspecto más profesional:

    <div style="width: 293px; height:48px; overflow: hidden; ">
        More than two line of text goes here-More than two line of text goes here
    </div>
    <div style="position: relative; top: -24px; width: 293px; height:24px; 
             background: linear-gradient(90deg, rgba(255,0,0,0) 40%, rgba(255,255,255,1) 99%);">
    </div>

Aquí he asumido que su color de fondo es blanco.

Mahan Lamei
fuente
-1

Este es un truco total, pero funciona:

http://jsfiddle.net/2wPNg/

div {
    width: 30%;
    float: left;
    margin-right: 2%;
    height: 94px;
    overflow: hidden;
    position: relative;
}

div:after {
     display: block;
      content: '...';
      width: 1em;
  height: 1.5em;
  background: #fff;
  position: absolute;
  bottom: -6px;
  right: 0;
    }

Tiene problemas ... podría cortar una letra de forma incómoda y probablemente tendrá algunos resultados extraños en un sitio receptivo.

Morgan Kay
fuente
5
Esta no será la solución correcta porque si el contenido es más pequeño, también agregará '...' al final. Fiddle: jsfiddle.net/2wPNg
Sachin
-1

Aquí hay un script simple para administrar los puntos suspensivos usando jQuery. Inspecciona la altura real del elemento y crea un nodo original oculto y un nodo truncado. Cuando el usuario hace clic, cambia entre las dos versiones.

Uno de los grandes beneficios es que la "elipsis" está cerca de la última palabra, como se esperaba.

Si usa soluciones CSS puras, los tres puntos aparecen distantes de la última palabra.

function manageShortMessages() {

        $('.myLongVerticalText').each(function () {
            if ($(this)[0].scrollHeight > $(this)[0].clientHeight)
                $(this).addClass('ellipsis short');
        });

        $('.myLongVerticalText.ellipsis').each(function () {
            var original = $(this).clone().addClass('original notruncation').removeClass('short').hide();
            $(this).after(original);

            //debugger;
            var shortText = '';
            shortText = $(this).html().trim().substring(0, 60) + '...';
            $(this).html(shortText);
        });
        
        $('.myLongVerticalText.ellipsis').click(function () {
            $(this).hide();

            if ($(this).hasClass('original'))
            {
                $(this).parent().find('.short').show();
            }
            else
            {
                $(this).parent().find('.original').show();
            }
        });
    }
	
  manageShortMessages();
div {
 border:1px solid red;
 margin:10px;
}

div.myLongVerticalText {
  height:30px;
  width:450px;
}

div.myLongVerticalText.ellipsis {
 cursor:pointer;
}

div.myLongVerticalText.original {
  display:inline-block;
  height:inherit;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="myLongVerticalText">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse sit amet quam hendrerit, sagittis augue vel, placerat erat. Aliquam varius porta posuere. Aliquam erat volutpat. Phasellus ullamcorper malesuada bibendum. Etiam fringilla, massa vitae pulvinar vehicula, augue orci mollis lorem, laoreet viverra massa eros id est. Phasellus suscipit pulvinar consectetur. Proin dignissim egestas erat at feugiat. Aenean eu consectetur erat. Nullam condimentum turpis eu tristique malesuada.

Aenean sagittis ex sagittis ullamcorper auctor. Sed varius commodo dui, nec consectetur ante condimentum et. Donec nec blandit mi, vitae blandit elit. Phasellus efficitur ornare est facilisis commodo. Donec convallis nunc sed mauris vehicula, non faucibus neque vehicula. Donec scelerisque luctus dui eu commodo. Integer eu quam sit amet dui tincidunt pharetra eu ac quam. Quisque tempus pellentesque hendrerit. Sed orci quam, posuere eu feugiat at, congue sed felis. In ut lectus gravida, volutpat urna vitae, cursus justo. Nam suscipit est ac accumsan consectetur. Donec rhoncus placerat metus, ut elementum massa facilisis eget. Donec at arcu ac magna viverra tincidunt.
</div>


<div class="myLongVerticalText">
One Line Lorem ipsum dolor sit amet.  
</div>
</body>

Matteo Conta
fuente
Si rechaza esta solución, explique por qué aquí, se lo agradeceré.
Matteo Conta
1
OP solicitó una solución CSS y ofreció jQuery?
dashard
Me perdí que era un requisito fuerte la ausencia de javascript, en mi caso la solución CSS pura presentó problemas de renderizado, la solución jQuery me dio más control sobre la renderización final y la posición de puntos suspensivos.
Matteo Conta
Totalmente de acuerdo. En mi respuesta, noté que esto era infinitamente más fácil de lograr con JS.
dashard
-3

No estoy seguro de cuál es su objetivo, pero ¿desea que el texto aparezca en la segunda línea?

Aquí está su jsFiddle: http://jsfiddle.net/8kvWX/4/ acaba de eliminar lo siguiente:

     white-space:nowrap;  

No estoy seguro de si esto es lo que estás buscando o no.

Saludos,

Mee

Mee
fuente
1
Quiere la elipsis al final de la segunda línea, que no es tan fácil de hacer sin JavaScript ...
Marc Audet
@MarcAudet exactamente :)
Tony Bogdanov
Bien, encontré a otra persona pidiendo tener las líneas en la segunda línea y su CSS era prácticamente el mismo que el suyo, pero la clase estaba apuntando a una etiqueta ul en su lugar. De todos modos, lo siento Tony. Lo revisaré de nuevo y actualizaré mi respuesta si tengo éxito.
Mee
bueno, creo que la mejor solución es la de @Itay Gal. Por lo que vi, ese está funcionando.
Mee