Hice una imagen para esta pregunta para que sea más fácil de entender.
¿Es posible crear una elipsis en un <div>
ancho fijo y varias líneas?
He probado algunos complementos de jQuery aquí y allá, pero no puedo encontrar el que estoy buscando. ¿Alguna recomendacion? Ideas?
javascript
jquery
html
css
Eduardo
fuente
fuente
Respuestas:
Solo una idea básica rápida.
Estaba probando con el siguiente marcado:
Y CSS:
Aplicando este jQuery logrará el resultado deseado:
Intenta eliminar repetidamente la última palabra del texto hasta que alcanza el tamaño deseado. Debido al desbordamiento: oculto; el proceso permanece invisible e incluso con JS apagado, el resultado sigue siendo 'visualmente correcto' (sin el "...", por supuesto).
Si combina esto con un truncamiento sensible en el lado del servidor (que deja solo una pequeña sobrecarga), se ejecutará más rápido :).
Nuevamente, esta no es una solución completa, solo una idea.
ACTUALIZACIÓN: se agregó una demostración jsFiddle .
fuente
li
y dentro de cada uno hay.block
un.block h2
y ay necesito aplicar esto alh2
interior,.block
pero no pude hacerlo funcionar. ¿Es diferente si hay más de uno.block h2
?height*3
por unos pocos píxeles. La solución fácil es simplemente agregar algunos píxeles adivh
while
línea: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;}}
. Como encontró @KrisWebDev, también querrá verificar si hay una palabra gigante.Pruebe el complemento jQuery.dotdotdot .
fuente
Bibliotecas Javascript para "sujeción de línea"
Tenga en cuenta que "sujeción de línea" también se conoce como "puntos suspensivos en el bloque de líneas múltiples" o "puntos suspensivos verticales".
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Aquí hay algunos más que aún no investigué:
Soluciones CSS para sujeción de línea
Hay algunas soluciones CSS, pero los usos más simples
-webkit-line-clamp
que tienen poca compatibilidad con el navegador . Ver demostración en vivo en jsfiddle.net/AdrienBe/jthu55v7/Muchas personas hicieron grandes esfuerzos para que esto suceda utilizando solo CSS. Ver artículos y preguntas al respecto:
Lo que recomiendo
Mantenlo simple. A menos que tenga una gran cantidad de tiempo para dedicar a esta función, busque la solución más simple y probada: CSS simple o una biblioteca de JavaScript bien probada.
Ve por algo elegante / complejo / altamente personalizado y pagarás el precio por esto en el futuro.
Lo que otros hacen
Tener un desvanecimiento como lo hace Airbnb podría ser una buena solución. Probablemente sea CSS básico junto con jQuery básico. En realidad, parece muy similar a esta solución en CSSTricks
Ah, y si buscas inspiraciones de diseño:
fuente
No existe tal característica en HTML, y esto es muy frustrante.
He desarrollado una biblioteca para lidiar con esto.
Mira mi sitio para ver capturas de pantalla, tutoriales y enlaces de descarga.
fuente
Solución JS pura basada en la solución de bažmegakapa, y algunas limpiezas para tener en cuenta a las personas que intentan dar una altura / altura máxima que es menor que la línea del elemento
fuente
Tengo una solución que funciona bien, pero en lugar de puntos suspensivos, usa un gradiente. Las ventajas son que no tiene que hacer ningún cálculo de JavaScript y funciona para contenedores de ancho variable, incluidas las celdas de la tabla. Utiliza un par de divs adicionales, pero es muy fácil de implementar.
http://salzerdesign.com/blog/?p=453
Editar: Lo siento, no sabía que el enlace no era suficiente. La solución es poner un div alrededor del texto y diseñar el div para controlar el desbordamiento. Dentro del div coloque otro div con un gradiente de "desvanecimiento" que se puede hacer utilizando CSS o una imagen (para IE antiguo). El degradado va de transparente al color de fondo de la celda de la tabla y es un poco más ancho que los puntos suspensivos. Si el texto es largo y se desborda, pasa por debajo del div "desvanecimiento" y se ve "desvanecido". Si el texto es corto, el desvanecimiento es invisible, por lo que no hay problema. Los dos contenedores se pueden ajustar para que se muestren una o varias líneas configurando la altura del contenedor como un múltiplo de la altura de la línea de texto. El div "fade" se puede colocar para cubrir solo la última línea.
fuente
Aquí hay una manera pura de CSS para lograr esto: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Aquí hay un resumen:
fuente
Puede usar la
-webkit-line-clamp
propiedad condiv
.-webkit-line-clamp: <integer>
lo que significa establecer el número máximo de líneas antes de truncar el contenido y luego muestra puntos suspensivos(…)
al final de la última línea.fuente
Aquí hay una solución JavaScript vainilla que puede usar en caso de apuro:
Puedes jugar con él en el codepen a continuación. Intente cambiar el tamaño de fuente en el panel CSS y realice una edición menor en el panel HTML (por ejemplo, agregue un espacio adicional en algún lugar) para actualizar los resultados. Independientemente del tamaño de fuente, el párrafo central siempre debe truncarse al número de líneas en el segundo parámetro pasado a limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
fuente
EDITAR: me encontré con Shave, que es un complemento JS que hace un truncamiento de texto de varias líneas basado en una altura máxima dada realmente bien. Utiliza la búsqueda binaria para encontrar el punto de ruptura óptimo. Definitivamente vale la pena investigar.
RESPUESTA ORIGINAL:
Tuve que encontrar una solución JS de vainilla para este problema. En el caso en que había trabajado, tuve que ajustar un nombre de producto largo en un ancho limitado y en dos líneas; truncada por puntos suspensivos si es necesario.
Utilicé respuestas de varias publicaciones SO para preparar algo que se ajustara a mis necesidades. La estrategia es la siguiente:
Código de muestra:
PD:
PPS: Acabo de darme cuenta de que esto es muy similar al enfoque sugerido por @DanMan y @ st.never. Verifique los fragmentos de código para un ejemplo de implementación.
fuente
Solución javascript muy simple. Divs tiene que ser diseñado fe:
Y JS:
fuente
No es una respuesta exacta a la pregunta, pero me encontré con esta página cuando intentaba hacer algo muy similar, pero quería agregar un enlace para "ver más" en lugar de simplemente puntos suspensivos. Esta es una función jQuery que agregará un enlace "más" al texto que desborda un contenedor. Personalmente, estoy usando esto con Bootstrap, pero por supuesto funcionará sin él.
Para usar, coloque su texto en un contenedor de la siguiente manera:
Cuando se agrega la siguiente función jQuery, cualquiera de los divs que sean más grandes que el valor de ajuste de altura se truncará y se agregará un enlace "Más".
Basado en esto, pero actualizado: http://shakenandstirredweb.com/240/jquery-moreless-text
fuente
El plugin dotdotdot jQuery mencionado funciona bien con angular:
El marcado correspondiente sería:
fuente
Demo JS pura (sin jQuery y bucle 'while')
Cuando busqué la solución del problema de elipsis multilínea, me sorprendió que no haya ninguna buena sin jQuery. También hay algunas soluciones basadas en el ciclo 'while', pero creo que no son efectivas y peligrosas debido a la posibilidad de entrar en el ciclo infinito. Entonces escribí este código:
fuente
Tal vez bastante tarde, pero usando SCSS puede declarar una función como:
Y úsalo como:
Lo cual truncará el texto en una línea y sabiendo que es 1.4 su altura de línea. La salida esperada es de cromo para renderizar
...
al final y FF con un desvanecimiento genial al finalFirefox
Cromo
fuente
Encontré esta breve solución solo para CSS en la respuesta de Adrien Be :
A partir de marzo de 2020 , la compatibilidad del navegador es del 95,3% , no se admite en IE y Opera Mini. Funciona en Chrome, Safari, Firefox y Edge.
fuente
Probablemente no pueda hacerlo (¿actualmente?) Sin una fuente de ancho fijo como Courier. Con una fuente de ancho fijo, cada letra ocupa el mismo espacio horizontal, por lo que probablemente pueda contar las letras y multiplicar el resultado con el tamaño de fuente actual en ems o exs. Luego, solo tendría que probar cuántas letras caben en una línea y luego dividirlas.
Alternativamente, para fuentes no fijas, es posible que pueda crear una asignación para todos los caracteres posibles (como i = 2px, m = 5px) y luego hacer los cálculos. Aunque mucho trabajo feo.
fuente
Para ampliar la solución de @ DanMan: en el caso de que se usen fuentes de ancho variable, puede usar un ancho de fuente promedio. Esto tiene dos problemas: 1) un texto con demasiados W se desbordaría y 2) un texto con demasiados I se truncaría antes.
O podría adoptar el enfoque del peor de los casos y utilizar el ancho de la letra "W" (que creo que es la más amplia). Esto elimina el problema 1 anterior pero intensifica el problema 2.
Un enfoque diferente podría ser: dejar
overflow: clip
en el div y agregar una sección de puntos suspensivos (tal vez otro div o imagen) confloat: right; position: relative; bottom: 0px;
(sin probar). El truco es hacer que la imagen aparezca sobre el final del texto.También solo puede mostrar la imagen cuando sabe que se desbordará (por ejemplo, después de unos 100 caracteres)
fuente
overflow: clip
? ¿Y qué esperarías quefloat
haga CSS ?Con este código no hay necesidad de un contenedor adicional div si el elemento tiene su altura limitada por un estilo de altura máxima.
También guarda el texto original en un atributo de datos que se puede mostrar utilizando solo estilos, por ejemplo el ratón por encima:
fuente
En mi situación, no pude trabajar con ninguna de las funciones mencionadas anteriormente y también tuve que decirle a la función cuántas líneas mostrar, independientemente del tamaño de fuente o el tamaño del contenedor.
Basé mi solución en el uso del método Canvas.measureText (que es una función HTML5 ) como lo explica Domi aquí, por lo que no es completamente un navegador cruzado.
Puedes ver cómo funciona en este violín .
Este es el código:
Y el HTML para usarlo sería así:
El código para obtener la familia de fuentes es bastante simple, y en mi caso funciona, pero para escenarios más complejos puede que necesite usar algo en esta línea .
Además, en mi caso le digo a la función cuántas líneas usar, pero podría calcular cuántas líneas mostrar de acuerdo con el tamaño del contenedor y la fuente.
fuente
He creado una versión que deja el html intacto. Ejemplo de jsfiddle
jQuery
CSS
Ejemplo de jsfiddle
fuente
Escribí un componente angular que resuelve el problema. Divide un texto dado en elementos span. Después de renderizar, elimina todos los elementos que se desbordan y coloca los puntos suspensivos justo después del último elemento visible.
Ejemplo de uso:
Demo de Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
El componente:
fuente
Aquí hice otra biblioteca con un algoritmo más rápido. Por favor, compruebe:
https://github.com/i-ahmed-biz/fast-ellipsis
Para instalar usando bower:
Para instalar usando npm:
¡Espero que lo disfrutes!
fuente
No estoy seguro de si esto es lo que está buscando, usa altura mínima en lugar de altura.
fuente
Func muy simple hará.
Directiva:
Ver:
fuente
iiiiiiiiii
vsMMMMMMMMMM
(aunque la fuente actual no es tan visible: D).