J'ai fait une image pour cette question pour la rendre plus facile à comprendre.
Est-il possible de créer une ellipse sur un <div>
avec une largeur fixe et plusieurs lignes?
J'ai essayé des plugins jQuery ici et là, mais je ne trouve pas celui que je recherche. Une recommandation? Des idées?
javascript
jquery
html
css
Edward
la source
la source
Réponses:
Juste une petite idée de base.
Je testais avec le balisage suivant:
Et CSS:
L'application de ce jQuery obtiendra le résultat souhaité:
Il essaie à plusieurs reprises de supprimer le dernier mot du texte jusqu'à ce qu'il atteigne la taille souhaitée. En raison du débordement: caché; le processus reste invisible et même avec JS désactivé, le résultat reste «visuellement correct» (sans le «...» bien sûr).
Si vous combinez cela avec une troncature judicieuse côté serveur (qui ne laisse qu'une petite surcharge), cela fonctionnera plus vite :).
Encore une fois, ce n'est pas une solution complète, juste une idée.
MISE À JOUR: Ajout d'une démo jsFiddle .
la source
li
et à l'intérieur de chacun il y a un.block
et un.block h2
et je dois l'appliquer à l'h2
intérieur.block
mais je n'ai pas pu le faire fonctionner. Est-ce différent s'il y en a plus d'un.block h2
?height*3
de quelques pixels. La solution facile consiste simplement à ajouter quelques pixels àdivh
while
ligne: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;}}
. Comme @KrisWebDev l'a trouvé, vous voudrez également rechercher un mot géant.Essayez le plugin jQuery.dotdotdot .
la source
Bibliothèques Javascript pour "line clamping"
Notez que le "serrage de ligne" est également appelé "Ellipse sur bloc de multi-lignes" ou "ellipse verticale".
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
En voici quelques autres sur lesquelles je n'ai pas encore enquêté:
Solutions CSS pour le serrage de ligne
Il existe des solutions CSS, mais les utilisations les plus simples
-webkit-line-clamp
ont une mauvaise prise en charge du navigateur . Voir la démo en direct sur jsfiddle.net/AdrienBe/jthu55v7/Beaucoup de gens ont déployé de grands efforts pour que cela se produise en utilisant uniquement CSS. Voir les articles et les questions à ce sujet:
Ce que je recommanderais
Rester simple. À moins que vous n'ayez beaucoup de temps à consacrer à cette fonctionnalité, optez pour la solution la plus simple et la plus testée: un CSS simple ou une bibliothèque javascript bien testée.
Optez pour quelque chose de sophistiqué / complexe / hautement personnalisé et vous en paierez le prix plus tard.
Ce que font les autres
Avoir un fondu comme Airbnb pourrait être une bonne solution. Il s'agit probablement d'un CSS de base couplé à un jQuery de base. En fait, cela semble très similaire à cette solution sur CSSTricks
Oh, et si vous recherchez des inspirations de design:
la source
Il n'y a pas de telle fonctionnalité en HTML, et c'est très frustrant.
J'ai développé une bibliothèque pour gérer cela.
Consultez mon site pour une capture d'écran, un didacticiel et un lien de téléchargement.
la source
Solution JS pure basée sur la solution de bažmegakapa, et quelques nettoyages pour tenir compte des personnes qui essaient de donner une hauteur / hauteur maximale inférieure à la ligne de l'élément
la source
J'ai une solution qui fonctionne bien mais à la place des points de suspension, elle utilise un dégradé. Les avantages sont que vous n'avez pas à effectuer de calculs JavaScript et que cela fonctionne pour les conteneurs de largeur variable, y compris les cellules de tableau. Il utilise quelques div supplémentaires, mais c'est très facile à implémenter.
http://salzerdesign.com/blog/?p=453
Edit: Désolé, je ne savais pas que le lien n'était pas suffisant. La solution est de mettre un div autour du texte et de styliser le div pour contrôler le débordement. À l'intérieur du div mettez un autre div avec un dégradé de "fondu" qui peut être fait en utilisant CSS ou une image (pour l'ancien IE). Le dégradé va du transparent à la couleur d'arrière-plan de la cellule du tableau et est un peu plus large qu'une ellipse. Si le texte est long et déborde, il passe sous le div "fondu" et semble "fondu". Si le texte est court, le fondu est invisible donc il n'y a pas de problème. Les deux conteneurs peuvent être ajustés pour laisser apparaître une ou plusieurs lignes en définissant la hauteur du conteneur comme un multiple de la hauteur de la ligne de texte. Le div "fade" peut être positionné pour ne couvrir que la dernière ligne.
la source
Voici un moyen CSS pur pour y parvenir: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Voici un résumé:
la source
Vous pouvez utiliser la
-webkit-line-clamp
propriété avecdiv
.-webkit-line-clamp: <integer>
ce qui signifie définir le nombre maximum de lignes avant de tronquer le contenu, puis afficher une ellipse(…)
à la fin de la dernière ligne.la source
Voici une solution JavaScript vanille que vous pouvez utiliser à la rigueur:
Vous pouvez jouer avec dans le codepen ci-dessous. Essayez de changer la taille de la police dans le panneau CSS et faites une modification mineure dans le panneau HTML (par exemple, ajoutez un espace supplémentaire quelque part) pour mettre à jour les résultats. Quelle que soit la taille de la police, le paragraphe du milieu doit toujours être tronqué au nombre de lignes dans le deuxième paramètre passé à limitLines ().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
la source
EDIT: Je suis tombé sur tombé Shave, un plugin JS qui fait très bien la troncature de texte sur plusieurs lignes en fonction d'une hauteur maximale donnée. Il utilise la recherche binaire pour trouver le point de rupture optimal. Vaut vraiment le détour.
RÉPONSE ORIGINALE:
J'ai dû trouver une solution JS vanille pour ce problème. Dans le cas sur lequel j'avais travaillé, je devais adapter un long nom de produit à une largeur limitée et sur deux lignes; tronqué par des points de suspension si nécessaire.
J'ai utilisé les réponses de divers messages SO pour préparer quelque chose qui correspond à mes besoins. La stratégie est la suivante:
Exemple de code:
PS:
PPS: Je viens de réaliser que c'est très similaire à l'approche suggérée par @DanMan et @ st.never. Consultez les extraits de code pour un exemple d'implémentation.
la source
Solution javascript très simple. Divs doit être stylé par exemple:
Et JS:
la source
Pas une réponse exacte à la question, mais je suis tombé sur cette page en essayant de faire très similaire, mais en voulant ajouter un lien pour "voir plus" plutôt que juste une simple ellipse. Il s'agit d'une fonction jQuery qui ajoutera un lien "plus" vers du texte qui déborde d'un conteneur. Personnellement, je l'utilise avec Bootstrap, mais bien sûr, cela fonctionnera sans.
Pour l'utiliser, placez votre texte dans un conteneur comme suit:
Lorsque la fonction jQuery suivante est ajoutée, tous les div qui sont plus grands que la valeur Adjustheight seront tronqués et un lien «Plus» sera ajouté.
Basé sur ceci, mais mis à jour: http://shakenandstirredweb.com/240/jquery-moreless-text
la source
Le plugin jQuery dotdotdot mentionné fonctionne bien avec angular:
Le balisage correspondant serait:
la source
Démo Pure JS (sans jQuery et boucle 'while')
Lorsque j'ai cherché une solution au problème des ellipses multilignes, j'ai été surpris qu'il n'y en ait pas de bon sans jQuery. Il existe également quelques solutions basées sur la boucle «while», mais je pense qu'elles ne sont pas efficaces et dangereuses en raison de la possibilité d'entrer dans une boucle infinie. J'ai donc écrit ce code:
la source
Peut-être assez tard mais en utilisant SCSS, vous pouvez déclarer une fonction comme:
Et utilisez-le comme:
Ce qui tronquera le texte à une ligne et sachant qu'il est de 1,4 sa hauteur de ligne. La sortie attendue est le rendu de chrome avec
...
à la fin et FF avec un fondu cool à la finFirefox
Chrome
la source
J'ai trouvé cette courte solution CSS uniquement dans la réponse d'Adrien Be :
En mars 2020, la prise en charge du navigateur était de 95,3% , non prise en charge dans IE et Opera Mini. Fonctionne sur Chrome, Safari, Firefox et Edge.
la source
Vous ne pouvez probablement pas le faire (actuellement?) Sans une police à largeur fixe comme Courier. Avec une police à largeur fixe, chaque lettre occupe le même espace horizontal, vous pouvez donc probablement compter les lettres et multiplier le résultat avec la taille de police actuelle en ems ou exs. Ensuite, il vous suffirait de tester le nombre de lettres sur une ligne, puis de la diviser.
Sinon, pour les polices non fixes, vous pourrez peut-être créer un mappage pour tous les caractères possibles (comme i = 2px, m = 5px), puis faire le calcul. Beaucoup de travail laid cependant.
la source
Pour développer la solution de @ DanMan: dans le cas où des polices à largeur variable sont utilisées, vous pouvez utiliser une largeur de police moyenne. Cela pose deux problèmes: 1) un texte avec trop de W déborderait et 2) un texte avec trop de I serait tronqué plus tôt.
Ou vous pouvez adopter une approche du pire des cas et utiliser la largeur de la lettre «W» (qui, je crois, est la plus large). Cela supprime le problème 1 ci-dessus mais intensifie le problème 2.
Une approche différente pourrait être: laisser
overflow: clip
dans le div et ajouter une section de points de suspension (peut-être un autre div ou une image) avecfloat: right; position: relative; bottom: 0px;
(non testé). L'astuce consiste à faire apparaître l'image au-dessus de la fin du texte.Vous pouvez également afficher l'image uniquement lorsque vous savez qu'elle va déborder (par exemple, après environ 100 caractères)
la source
overflow: clip
? Et qu'attendriez-vous de ce CSSfloat
?Avec ce code, il n'est pas nécessaire d'avoir un div wrapper supplémentaire si l'élément a sa hauteur limitée par un style max-height.
En outre, il enregistre le texte d'origine dans un attribut de données qui peut être affiché en utilisant uniquement des styles, par exemple. au survol de la souris:
la source
Dans mon scénario, je ne pouvais utiliser aucune des fonctions mentionnées ci-dessus et je devais également indiquer à la fonction le nombre de lignes à afficher, quelle que soit la taille de la police ou la taille du conteneur.
J'ai basé ma solution sur l'utilisation de la méthode Canvas.measureText (qui est une fonctionnalité HTML5 ) comme expliqué ici par Domi , donc ce n'est pas complètement cross-browser.
Vous pouvez voir comment cela fonctionne sur ce violon .
Voici le code:
Et le HTML pour l'utiliser serait comme ceci:
Le code pour obtenir la famille de polices est plutôt simple et, dans mon cas, fonctionne, mais pour des scénarios plus complexes, vous devrez peut-être utiliser quelque chose du genre .
De plus, dans mon cas, je dis à la fonction combien de lignes utiliser, mais vous pouvez calculer le nombre de lignes à afficher en fonction de la taille et de la police du conteneur.
la source
J'ai fait une version qui laisse le html intact. exemple jsfiddle
jQuery
CSS
exemple jsfiddle
la source
J'ai écrit un composant angulaire qui résout le problème. Il divise un texte donné en éléments span. Après le rendu, il supprime tous les éléments débordants et place les points de suspension juste après le dernier élément visible.
Exemple d'utilisation:
Démo Stackblitz: https://stackblitz.com/edit/angular-wfdqtd
Le composant:
la source
Ici, j'ai créé une autre bibliothèque avec un algorithme plus rapide. Vérifiez s'il vous plaît:
https://github.com/i-ahmed-biz/fast-ellipsis
Pour installer à l'aide de bower:
Pour installer à l'aide de npm:
Espérons que vous apprécierez!
la source
Je ne sais pas si c'est ce que vous recherchez, il utilise la hauteur minimale au lieu de la hauteur.
la source
Une fonction très simple fera l'affaire.
Directif:
Vue:
la source
iiiiiiiiii
vsMMMMMMMMMM
(avec la police actuelle pas si visible que: D).