Je dois afficher le texte saisi par l'utilisateur dans une div de taille fixe. Ce que je veux, c'est que la taille de la police soit automatiquement ajustée afin que le texte remplisse la boîte autant que possible.
Donc - Si le div est de 400 px x 300 px. Si quelqu'un entre dans ABC, c'est vraiment une grosse police. S'ils entrent dans un paragraphe, ce serait une police minuscule.
Je voudrais probablement commencer avec une taille de police maximale - peut-être 32 pixels, et bien que le texte soit trop gros pour tenir dans le conteneur, réduisez la taille de la police jusqu'à ce qu'elle tienne.
Réponses:
Merci Attack . Je voulais utiliser jQuery.
Vous m'avez pointé dans la bonne direction, et voici ce que j'ai fini avec:
Voici un lien vers le plugin: https://plugins.jquery.com/textfill/
Et un lien vers la source: http://jquery-textfill.github.io/
et mon html est comme ça
Ceci est mon premier plugin jquery, donc ce n'est probablement pas aussi bon qu'il devrait l'être. Les pointeurs sont certainement les bienvenus.
la source
404
.Je n'ai trouvé aucune des solutions précédentes suffisamment adéquate en raison de mauvaises performances, j'ai donc créé la mienne qui utilise des mathématiques simples au lieu de boucler. Devrait également fonctionner correctement dans tous les navigateurs.
Selon ce cas de test de performance, il est beaucoup plus rapide que les autres solutions trouvées ici.
Si vous voulez contribuer, je l'ai ajouté à Gist .
la source
.css("font-size")
en boucle. Où est-ce que tu as trouvé ça? Ma solution est probablement plus rapide car elle n'a aucun des éléments fantaisie que vous avez ajoutés à votre plugin. Vous êtes les bienvenus pour ajouter votre plugin au jsperf et nous verrons lequel est le plus rapide;)Autant j'aime les votes positifs occasionnels que j'obtiens pour cette réponse (merci!), Ce n'est vraiment pas la meilleure approche de ce problème. Veuillez consulter quelques-unes des autres merveilleuses réponses ici, en particulier celles qui ont trouvé des solutions sans boucle.
Pourtant, à titre de référence, voici ma réponse originale :
Et voici une version avec des classes :
la source
offsetWidth
, j'ai aussi dû créer une variable pour la taille et ensuite ajouter le pxtextSpan.style.fontSize = size+"px";
La plupart des autres réponses utilisent une boucle pour réduire la taille de la police jusqu'à ce qu'elle tienne sur le div, ce qui est TRÈS lent car la page doit restituer l'élément à chaque fois que la police change de taille. J'ai finalement dû écrire mon propre algorithme pour le faire fonctionner d'une manière qui m'a permis de mettre à jour son contenu périodiquement sans geler le navigateur de l'utilisateur. J'ai ajouté quelques autres fonctionnalités (rotation du texte, ajout de remplissage) et je l'ai empaqueté en tant que plugin jQuery, vous pouvez l'obtenir à:
https://github.com/DanielHoffmann/jquery-bigtext
appelez simplement
et il s'adaptera parfaitement à votre conteneur.
Voyez-le en action ici:
http://danielhoffmann.github.io/jquery-bigtext/
Pour l'instant, il a quelques limitations, le div doit avoir une hauteur et une largeur fixes et il ne prend pas en charge l'habillage du texte sur plusieurs lignes.
Je vais travailler sur l'obtention d'une option pour définir la taille de police maximale.
Edit: J'ai trouvé quelques problèmes avec le plugin, il ne gère pas d'autres modèles de boîtes en plus du modèle standard et le div ne peut pas avoir de marges ou de bordures. J'y travaillerai.
Edit2: J'ai maintenant corrigé ces problèmes et limitations et ajouté plus d'options. Vous pouvez définir la taille de police maximale et vous pouvez également choisir de limiter la taille de police en utilisant soit la largeur, la hauteur ou les deux. Je vais travailler à accepter des valeurs max-width et max-height dans l'élément wrapper.
Edit3: J'ai mis à jour le plugin vers la version 1.2.0. Nettoyage majeur du code et de nouvelles options (verticalAlign, horizontalAlign, textAlign) et prise en charge des éléments internes à l'intérieur de la balise span (comme les sauts de ligne ou les icônes impressionnantes de police.)
la source
Ceci est basé sur ce que GeekyMonkey a publié ci-dessus, avec quelques modifications.
la source
Voici une méthode de bouclage améliorée qui utilise la recherche binaire pour trouver la plus grande taille possible qui s'adapte au parent dans le moins d'étapes possible (c'est plus rapide et plus précis que de marcher avec une taille de police fixe). Le code est également optimisé de plusieurs manières pour les performances.
Par défaut, 10 étapes de recherche binaire seront effectuées, ce qui correspondra à 0,1% de la taille optimale. Vous pouvez plutôt définir numIter sur une valeur N pour obtenir à l'intérieur de 1/2 ^ N de la taille optimale.
Appelez-le avec un sélecteur CSS, par exemple:
fitToParent('.title-span');
la source
vAlign
etpadding
.vAlign == true
définit la hauteur de ligne de l'élément sélectionné sur celle de la hauteur des parents. Le remplissage diminue la taille finale de la valeur transmise. Il est par défaut à 5. Je pense que ça a l'air vraiment sympa.J'ai créé une directive pour AngularJS - très inspirée par la réponse de GeekyMonkey mais sans la dépendance jQuery.
Démo: http://plnkr.co/edit/8tPCZIjvO3VSApSeTtYr?p=preview
Marquage
<div class="fittext" max-font-size="50" text="Your text goes here..."></div>
Directif
la source
resizeText
semble être appelé avant d'ng-bind
assigner réellement le texte à l'élément, ce qui entraîne un dimensionnement basé sur le texte précédent plutôt que sur le texte actuel. Ce n'est pas trop mal dans la démo ci-dessus où il est appelé à plusieurs reprises au fur et à mesure que l'utilisateur tape, mais s'il est appelé une fois en passant de null à la valeur réelle (comme dans une liaison à sens unique), il reste à la taille maximale.J'ai bifurqué le script ci-dessus de Marcus Ekwall: https://gist.github.com/3945316 et l'ai ajusté à mes préférences, il se déclenche maintenant lorsque la fenêtre est redimensionnée, de sorte que l'enfant tient toujours son conteneur. J'ai collé le script ci-dessous pour référence.
la source
Voici ma modification de la réponse du PO.
En bref, de nombreuses personnes qui ont tenté d'optimiser cela se sont plaintes de l'utilisation d'une boucle. Oui, alors que les boucles peuvent être lentes, d'autres approches peuvent être inexactes.
Par conséquent, mon approche utilise la recherche binaire pour trouver la meilleure taille de police:
Cela permet également à l'élément de spécifier la police minimale et maximale:
De plus, cet algorithme est sans unité. Vous pouvez spécifier
em
,rem
,%
, etc. , et il utilisera que pour son résultat final.Voici le violon: https://jsfiddle.net/fkhqhnqe/1/
la source
J'ai eu exactement le même problème avec mon site Web. J'ai une page qui s'affiche sur un projecteur, sur des murs, sur de grands écrans ..
Comme je ne connais pas la taille maximale de ma police, j'ai réutilisé le plugin ci-dessus de @GeekMonkey mais en incrémentant la taille de la police:
la source
Voici une version de la réponse acceptée qui peut également prendre un paramètre minFontSize.
la source
Vous pouvez utiliser FitText.js ( page github ) pour résoudre ce problème. Est vraiment petit et efficace par rapport à TextFill. TextFill utilise une boucle while coûteuse et FitText non.
FitText est également plus flexible (je l'utilise dans un projet avec des exigences très spéciales et fonctionne comme un champion!).
HTML:
Vous pouvez également lui définir des options:
CSS:
Et si vous en avez besoin, FitText a également une version sans jQuery .
la source
EDIT: Ce code a été utilisé pour afficher des notes au-dessus d'une vidéo HTML5. Il change la taille de la police à la volée lorsque la vidéo est redimensionnée (lorsque la fenêtre du navigateur est redimensionnée.) Les notes étaient connectées à la vidéo (tout comme les notes sur YouTube), c'est pourquoi le code utilise des instances au lieu d'une poignée DOM directement.
Selon la demande, je vais ajouter du code que j'ai utilisé pour y parvenir. (Zones de texte sur une vidéo HTML5.) Le code a été écrit il y a longtemps, et je pense franchement que c'est assez compliqué. Étant donné que la question a déjà reçu une réponse et qu'une réponse est déjà acceptée il y a longtemps, je ne me soucie pas de la réécrire. Mais si quelqu'un veut simplifier un peu cela, vous êtes le bienvenu!
Vous devrez probablement modifier ces chiffres de la famille de polices à la famille de polices. Un bon moyen de le faire est de télécharger un visualiseur graphique gratuit appelé GeoGebra. Modifiez la longueur du texte et la taille de la boîte. Ensuite, vous définissez manuellement la taille. Tracez les résultats manuels dans le système de coordonnées. Ensuite, vous entrez les deux équations que j'ai publiées ici et vous ajustez les nombres jusqu'à ce que "mon" graphique corresponde à vos propres points tracés manuellement.
la source
Les solutions itératives proposées peuvent être accélérées de façon spectaculaire sur deux fronts:
1) Multipliez la taille de la police par une constante, plutôt que d'ajouter ou de soustraire 1.
2) D'abord, zéro en utilisant une constante de cap, par exemple, doublez la taille de chaque boucle. Ensuite, avec une idée approximative de l'endroit où commencer, faites la même chose avec un ajustement plus fin, disons, multipliez par 1,1. Bien que le perfectionniste puisse vouloir la taille exacte en pixels entiers de la police idéale, la plupart des observateurs ne remarquent pas la différence entre 100 et 110 pixels. Si vous êtes perfectionniste, répétez une troisième fois avec un réglage encore plus fin.
Plutôt que d'écrire une routine ou un plug-in spécifique qui répond à la question exacte, je m'appuie simplement sur les idées de base et j'écris des variantes du code pour gérer toutes sortes de problèmes de mise en page, pas seulement le texte, y compris les divs, les étendues, les images. .. par largeur, hauteur, surface, ... dans un conteneur, correspondant à un autre élément ....
Voici un exemple:
la source
C'est la solution la plus élégante que j'ai créée. Il utilise la recherche binaire, faisant 10 itérations. La manière naïve était de faire une boucle while et d'augmenter la taille de la police de 1 jusqu'à ce que l'élément commence à déborder. Vous pouvez déterminer quand un élément commence à déborder en utilisant element.offsetHeight et element.scrollHeight . Si scrollHeight est plus grand que offsetHeight, votre taille de police est trop grande.
La recherche binaire est un bien meilleur algorithme pour cela. Il est également limité par le nombre d'itérations que vous souhaitez effectuer. Appelez simplement flexFont et insérez l'ID div et cela ajustera la taille de la police entre 8px et 96px .
J'ai passé un peu de temps à faire des recherches sur ce sujet et à essayer différentes bibliothèques, mais en fin de compte, je pense que c'est la solution la plus simple et la plus simple qui fonctionnera réellement.
Notez que si vous le souhaitez, vous pouvez modifier pour utiliser
offsetWidth
etscrollWidth
, ou ajouter les deux à cette fonction.la source
ReferenceError: lastSizeTooSmall is not defined
. Peut-être que cela doit être défini quelque part?J'ai le même problème et la solution consiste essentiellement à utiliser javascript pour contrôler la taille de la police. Vérifiez cet exemple sur codepen:
https://codepen.io/ThePostModernPlatonic/pen/BZKzVR
Cet exemple ne concerne que la hauteur, vous devrez peut-être mettre quelques if sur la largeur.
la source
J'ai aimé
la source
Je voulais juste ajouter ma version pour contenteditables.
la source
J'ai trouvé un moyen d'empêcher l'utilisation de boucles pour réduire le texte. Il ajuste la taille de la police en la multipliant par le taux entre la largeur du conteneur et la largeur du contenu. Donc, si la largeur du conteneur est 1/3 du contenu, la taille de la police sera réduite de 1/3 et la largeur du conteneur. Pour évoluer, j'ai utilisé une boucle while, jusqu'à ce que le contenu soit plus grand que le conteneur.
Ce code fait partie d'un test que j'ai téléchargé sur Github https://github.com/ricardobrg/fitText/
la source
Je suis allé avec la solution geekMonkey, mais c'est trop lent. Ce qu'il fait, c'est qu'il ajuste la taille de la police au maximum (maxFontPixels) puis vérifie si elle tient à l'intérieur du conteneur. sinon, il réduit la taille de la police de 1px et vérifie à nouveau. Pourquoi ne pas simplement vérifier la hauteur du conteneur précédent et soumettre cette valeur? (oui, je sais pourquoi, mais j'ai maintenant fait une solution, qui ne fonctionne que sur la hauteur et a également une option min / max)
Voici une solution beaucoup plus rapide:
et ce serait le HTML:
Encore une fois: cette solution vérifie UNIQUEMENT la hauteur du conteneur. C'est pourquoi cette fonction n'a pas à vérifier si l'élément rentre à l'intérieur. Mais j'ai également implémenté une valeur min / max (40min, 150max) donc pour moi cela fonctionne parfaitement bien (et fonctionne également sur le redimensionnement des fenêtres).
la source
Voici une autre version de cette solution:
la source