Croix-navigateur multi-ligne de débordement de texte avec des points de suspension ajoutée au sein d'une largeur et une hauteur fixe `<div>`
J'ai fait une image de cette question pour le rendre plus facile à comprendre.
Est-il possible de créer des points de suspension sur un <div>
avec une largeur fixe et plusieurs lignes?
J'ai essayé quelques plugins jQuery, ici et là, mais impossible de trouver celui que je cherche. Toute recommandation? Des idées?
- Voir stackoverflow.com/questions/536814/... et stackoverflow.com/questions/4452985/...)
- et stackoverflow.com/questions/3922739/... pour le css seule solution
- article connexe css-tricks.com/line-clampin
- Pour ceux qui cherchent pour cela à la mi-2016, la réponse est: NON, il n'est pas possible dans l'élégant, de la croix-navigateur, CSS uniquement. La solution souvent donné comme le plus proche de le terminer (codepen.io/romanrudenko/stylo/ymHFh) est donc Goldbergian il rend l'ensemble de votre corps blessé, et encore assez laid.
Vous devez vous connecter pour publier un commentaire.
Juste une petite idée de base.
J'ai été le tester avec le balisage suivant:
Et CSS:
L'application de cette jQuery permettra d'obtenir le résultat désiré:
Il essaie à plusieurs reprises de supprimer le dernier mot du texte jusqu'à ce qu'il atteigne la taille souhaitée. En raison de la overflow: hidden; le processus reste invisible et même avec JS désactivé, le résultat est visuellement correct " (sans les "..." bien sûr).
Si vous combinez cela avec un sensible troncature sur le côté serveur (qui ne laisse qu'une faible charge) puis il va courir plus vite :).
Encore une fois, ce n'est pas une solution complète, juste une idée.
Mise à JOUR: Ajouté un jsFiddle Démo.
li
et à l'intérieur de chacun il y a un.block
et un.block h2
et j'ai besoin de l'appliquer à lah2
à l'intérieur de.block
mais je ne pouvais pas le faire fonctionner. Est-il diferent si il y a plus d'un.block h2
?height*3
de quelques pixels. Easy fix est de 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 trouvé, vous aurez également besoin de vérifier un grand mot.Essayer le jQuery.dotdotdot plugin.
Bibliothèques Javascript pour la "ligne de serrage"
Note que "la ligne de serrage" est également désigné comme "points de suspension sur le bloc de multi-lignes" ou "verticale des points de suspension".
github.com/BeSite/jQuery.dotdotdot
github.com/josephschmitt/Clamp.js
Ici sont un peu plus je n'ai pas étudier encore:
CSS solutions pour la ligne de serrage
Il y a un peu de CSS solutions, mais la plus simple utilise
-webkit-ligne-clamp
qui a une mauvaise prise en charge du navigateur. Voir la démo en direct sur jsfiddle.net/AdrienBe/jthu55v7/Beaucoup de gens ont fait beaucoup d'efforts pour ce faire, à l'aide de CSS. Voir les articles et les questions à ce sujet:
Ce que je vous recommande
Garder les choses simples. Sauf si vous avez une grande quantité de temps à consacrer à cette fonctionnalité, rendez-vous pour le plus simple & solution testée: CSS simple ou un bien testé bibliothèque javascript.
Aller pour quelque chose de fantaisie/complexe/hautement personnalisé & vous allez en payer le prix bas de la route.
Ce que les autres n'
Avoir un fondu comme Airbnb ne pourrait être une bonne solution. C'est probablement le CSS de base couplé avec la base de jQuery. En fait, il semble très similaire à cette solution sur CSSTricks
Oh, et si vous regardez pour la conception inspirations:
Il n'y a pas une telle caractéristique dans le HTML, et c'est très frustrant.
J'ai développé une bibliothèque faire face à cela.
Découvrez mon site pour la capture d'écran, tutoriel, et télécharger lien.
Pur JS solution basée sur bažmegakapa de la solution, et un peu de ménage pour tenir compte des gens qui essaient de donner de la hauteur/max-hauteur qui est inférieure à celle de l'élément lineHeight:
J'ai une solution qui fonctionne bien, mais à la place des points de suspension, il utilise un dégradé. Les avantages sont que vous n'avez pas à faire toute JavaScript calculs, et il fonctionne pour largeur variable conteneurs, y compris les cellules d'un tableau. Il utilise un couple d'extra divs, mais il est très facile à mettre en œuvre.
http://salzerdesign.com/blog/?p=453
Edit: Désolé, je ne sais pas que le lien n'était pas assez. La solution est de mettre un div autour du texte et le style de la div pour le contrôle de la zone de débordement. À l'intérieur de la div mettre une autre div avec un "fondu" de gradient qui peut être fait par l'utilisation de CSS ou une image (pour les vieux IE). Le dégradé va de la transparence à la couleur de fond de la cellule du tableau et est un peu plus large que les points de suspension. Si le texte est long et débordements, il passe sous le "fade" div et regarde "disparu". 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 permettre à une ou plusieurs lignes à afficher par le réglage de la hauteur du conteneur comme un multiple de la ligne de texte à la hauteur. Le "fade" div peut être positionné de façon à ne couvrent que la dernière ligne.
Ici est un pur CSS chemin à suivre: http://www.mobify.com/blog/multiline-ellipsis-in-pure-css/
Voici un résumé:
Voici la vanille, JavaScript solution que vous pouvez utiliser dans un pincement:
JS:
CSS:
HTML:
Vous pouvez jouer avec ça dans la codepen ci-dessous. Essayez de changer la taille de la police dans le panneau CSS et faire une modification mineure dans le panneau HTML (par exemple, ajouter 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é pour le nombre de lignes dans le deuxième paramètre passé à limitLines().
Codepen: http://codepen.io/thdoan/pen/BoXbEK
Pas une réponse exacte à la question, mais je suis tombé sur cette page en essayant de faire de très similaire, mais le désir d'ajouter un lien "voir plus" plutôt que juste un simple bouton de sélection. C'est une fonction jQuery qui permettra d'ajouter un "plus", un lien vers le texte qui déborde d'un conteneur. Personnellement, je suis en utilisant ce avec Bootstrap, mais bien sûr, il fonctionnera sans.
Pour l'utiliser, mettre votre texte dans un conteneur comme suit:
Lorsque la fonction jQuery est ajouté, un des divs qui sont plus grandes que les adjustheight valeur sera tronqué et ont un "Plus" lien ajouté.
Sur cette base, mais mis à jour: http://shakenandstirredweb.com/240/jquery-moreless-text
Mentionnés dotdotdot plugin jQuery de travail agréable angulaire:
Le correspondant de balisage serait:
Pure JS démo (sans jQuery et "tout" en boucle)
Quand j'ai cherché la solution de plusieurs lignes de points de suspension problème que j'ai été surpris qu'il n'y a aucune bonne sans jQuery. Il y a aussi quelques solutions basée sur le "tout" en boucle, mais je pense qu'ils ne sont pas efficaces et dangereuse en raison de la possibilité d'entrer dans une boucle infinie. J'ai donc écrit ce code:
EDIT:
Est venu à travers Rasage qui est JS du plugin qui ne multi ligne de texte troncature basé sur un max-height vraiment bien. Il utilise les binaires de recherche afin de trouver le meilleur point de rupture. Certainement la peine d'enquêter.
RÉPONSE ORIGINALE À CETTE QUESTION:
J'ai dû venir avec un vanilla JS solution pour ce problème. Dans le cas que j'avais travaillé, j'ai dû adapter un long nom du produit dans la largeur limitée et sur deux lignes; tronqué par des points de suspension en cas de besoin.
J'ai utilisé les réponses de divers AFIN de postes de cuisiner quelque chose qui l'adapter à mes besoins. La stratégie est comme suit:
Exemple de Code:
JS:
CSS:
HTML:
PS:
PPS: Viens de réaliser que c'est très similaire à l'approche suggérée par @DanMan et @st.jamais. La caisse des extraits de code pour un exemple de mise en œuvre.
Peut-être beaucoup de retard, mais à l'aide de SCSS vous pouvez déclarer une fonction comme:
Et de l'utiliser comme:
Qui va tronquer le texte à une seule ligne, et sachant qu'elle est de 1,4 son line-height. La sortie attendue est chrome rendre avec
...
à la fin de la FF avec certains frais fondu à la finFirefox
Chrome
Très simple javascript solution. Divs doit être de style f.e.:
Et JS:
Vous ne pouvez probablement pas le faire (pour l'instant?) sans une police à largeur fixe comme Courier. Avec une police à largeur fixe chaque lettre occupe le même espace horizontal, de sorte que vous pourriez probablement compter les lettres et multiplier le résultat avec la taille actuelle de la police dans les ems ou les ex. Ensuite, vous avez juste à tester la façon dont de nombreuses lettres de tenir sur une seule ligne, puis le briser.
Sinon, pour les non-fixe-avec les polices que vous pourriez être en mesure de créer une cartographie de tous les caractères possibles (comme je l'ai = 2px, m = 5px), puis de faire le calcul. Beaucoup de laid travail même si.
Étendre sur @DanMan la solution: dans le cas où la largeur variable de polices sont utilisées, vous pouvez utiliser une moyenne largeur de police. Cela a deux problèmes: 1) un texte avec trop de W, c'est un débordement et 2) un texte avec trop de je serait tronquée plus tôt.
Ou vous pouvez prendre le pire des cas, l'approche et l'utilisation de la largeur de la lettre "W" (qui je crois est le plus large). Cela élimine le problème 1 ci-dessus, mais s'intensifie problème 2.
Une approche différente pourrait être: laissez
overflow: clip
dans le div et ajouter des points de suspension l'article (peut-être une autre div ou de l'image) avecfloat: right; position: relative; bottom: 0px;
(non testé). L'astuce est de faire apparaître l'image ci-dessus à la fin du texte.Vous pouvez également afficher uniquement l'image lorsque vous savez que ça va déborder (dire, après environ 100 caractères)
overflow: clip
? Et ce que vous vous attendriez à ce que CSS avecfloat
faire?Avec ce code il n'y a pas besoin d'un adaptateur supplémentaire div si l'élément a sa hauteur limitée par un max-height style.
Aussi il permet d'économiser le texte original dans un attribut de données qui peuvent être affichées en utilisant seulement les styles, par exemple. au survol de la souris:
Dans mon scénario, je ne pouvais pas obtenir de travail de l'une des fonctions mentionnées ci-dessus et j'ai aussi besoin de le dire à la fonction de combien de lignes pour montrer quelle que soit la taille de police ou la taille du conteneur.
J'ai basé ma solution sur l'utilisation de la Toile.savoir measuretext méthode (qui est un HTML5 fonction) comme expliqué ici par Domi, de sorte qu'il n'est pas complètement de la croix-navigateur.
Vous pouvez voir comment cela fonctionne sur ce violon.
C'est le code:
Et le code HTML pour l'utiliser, il serait comme ça:
Le code pour obtenir la police-famille est plutôt simple, et dans mon cas, œuvres, mais pour des scénarios plus complexes, vous pouvez avoir besoin d'utiliser quelque chose le long de ces lignes.
Aussi, dans mon cas, je suis contant de la fonction de combien de lignes à utiliser, mais vous pouvez calculer le nombre de lignes à afficher en fonction de la taille du conteneur et de la police.
J'ai fait une version qui laisse le html intacte.
jsfiddle exemple
jQuery
CSS
jsfiddle exemple
J'ai écrit une composante angulaire qui permet de résoudre le problème. Il se fend d'un texte donné dans les éléments span. Après le rendu, il supprime tous les débordante éléments et place les points de suspension à droite après le dernier élément visible.
Exemple d'utilisation:
Stackblitz démo: https://stackblitz.com/edit/angular-wfdqtd
Le composant:
Ici j'ai fait une autre bibliothèque avec un algorithme plus rapide. Veuillez vérifier:
https://github.com/i-ahmed-biz/fast-ellipsis
À installer à l'aide de verdure:
À installer à l'aide des mnp:
Espère que vous apprécierez!
ne sais pas si c'est ce que vous cherchez, il utilise min-hauteur au lieu de la hauteur.
Très simple func fera.
Directive:
Vue:
iiiiiiiiii
vsMMMMMMMMMM
(avec la police actuelle pas visible si :D).