Si la taille du div dépend du contenu (ce que je suppose être le cas d'après votre description), vous pouvez récupérer la hauteur du div en utilisant:
var divHeight = document.getElementById('content').offsetHeight;
Et divisez par la hauteur de la ligne de police:
document.getElementById('content').style.lineHeight;
Ou pour obtenir la hauteur de ligne si elle n'a pas été explicitement définie:
var element = document.getElementById('content');
document.defaultView.getComputedStyle(element, null).getPropertyValue("lineHeight");
Vous devrez également prendre en compte le remplissage et l'espacement inter-lignes.
ÉDITER
Test entièrement autonome, définissant explicitement la hauteur de ligne:
function countLines() {
var el = document.getElementById('content');
var divHeight = el.offsetHeight
var lineHeight = parseInt(el.style.lineHeight);
var lines = divHeight / lineHeight;
alert("Lines: " + lines);
}
<body onload="countLines();">
<div id="content" style="width: 80px; line-height: 20px">
hello how are you? hello how are you? hello how are you? hello how are you?
</div>
</body>
line-height
(qui n'est pas explicitement défini) serait d'utiliserwindow.getComputedStyle(element, null).getPropertyValue('line-height')
Une solution consiste à inclure chaque mot dans une balise span à l'aide d'un script. Ensuite, si la dimension Y d'une balise span donnée est inférieure à celle de son prédécesseur immédiat, un saut de ligne s'est produit.
la source
Découvrez la fonction getClientRects () qui peut être utilisée pour compter le nombre de lignes dans un élément. Voici un exemple de son utilisation.
Il renvoie un objet DOM javascript. Le nombre de lignes peut être connu en faisant ceci:
Il peut renvoyer la hauteur de chaque ligne, et plus encore. Découvrez la gamme complète de choses qu'il peut faire en l'ajoutant à votre script, puis en consultant le journal de votre console.
Bien que cela ne fonctionne que si l'élément conteneur est en ligne, vous pouvez cependant entourer l'élément en ligne conteneur avec un élément bloc pour contrôler la largeur comme suit:
Bien que je ne recommande pas de coder en dur le style comme ça. C'est juste à titre d'exemple.
la source
Je n'étais pas satisfait des réponses ici et sur d'autres questions. La réponse la mieux notée ne prend pas en compte
padding
ou ne prend pasborder
en compte, et donc de toute évidence l'ignorebox-sizing
également. Ma réponse combine quelques techniques ici et et sur d'autres threads pour obtenir une solution qui fonctionne à ma satisfaction.Ce n'est pas parfait: lorsqu'aucune valeur numérique n'a pu être récupérée pour le
line-height
(par exemplenormal
ouinherit
), il utilise simplement lefont-size
multiplié par1.2
. Peut-être que quelqu'un d'autre peut suggérer un moyen fiable de détecter la valeur du pixel dans ces cas.En dehors de cela, il a été capable de gérer correctement la plupart des styles et des cas que je lui ai lancés.
jsFiddle pour jouer et tester. Également en ligne ci-dessous.
la source
Clonez l'objet conteneur et écrivez 2 lettres et calculez la hauteur. Cela renvoie la hauteur réelle avec tout le style appliqué, la hauteur de la ligne, etc. Maintenant, calculez la hauteur de l'objet / la taille d'une lettre. Dans Jquery, la hauteur dépasse le remplissage, la marge et la bordure, il est bon de calculer la hauteur réelle de chaque ligne:
Si vous utilisez une police rare avec une hauteur différente de chaque lettre, cela ne fonctionne pas. Mais fonctionne avec toutes les polices normales, comme Arial, mono, bandes dessinées, Verdana, etc. Testez avec votre police.
Exemple:
Résultat:
6 Lines
Fonctionne dans tous les navigateurs sans fonctions rares hors normes.
Vérifiez: https://jsfiddle.net/gzceamtr/
la source
clone
→cloneNode
,hide
→style.visibility = "hidden"
,html('a<br>b')
→textContent='a\r\nb'
,appendTo('body')
→document.documentElement.appendChild
,height()
→getBoundingClientRect().height
Pour ceux qui utilisent jQuery http://jsfiddle.net/EppA2/3/
la source
$(selector).css('line-height');
, vous n'obtiendrez pas un nombre de cette fonction.Je suis convaincu que c'est impossible maintenant. C'était, cependant.
L'implémentation de getClientRects par IE7 a fait exactement ce que je voulais. Ouvrez cette page dans IE8, essayez de l'actualiser en variant la largeur de la fenêtre et voyez comment le nombre de lignes dans le premier élément change en conséquence. Voici les principales lignes du javascript de cette page:
Malheureusement pour moi, Firefox renvoie toujours un rectangle client par élément, et IE8 fait de même maintenant. (La page de Martin Honnen fonctionne aujourd'hui car IE la rend en vue compatible IE; appuyez sur F12 dans IE8 pour jouer avec différents modes.)
C'est triste. Il semble qu'une fois de plus l'implémentation littérale mais sans valeur de Firefox de la spécification a gagné sur l'utile de Microsoft. Ou est-ce que je rate une situation où de nouveaux getClientRects peuvent aider un développeur?
la source
basé sur la réponse de GuyPaddock d'en haut, cela semble fonctionner pour moi
l'astuce ici est d'augmenter tellement la hauteur de la ligne qu'elle "engloutira" toutes les différences de navigateur / système d'exploitation dans la façon dont ils rendent les polices
Vérifié avec différents styles et différentes tailles / familles de polices, la seule chose qu'il ne prend pas en compte (car dans mon cas, cela n'avait pas d'importance), c'est le rembourrage - qui peut facilement être ajouté à la solution.
la source
Non, pas de manière fiable. Il y a tout simplement trop de variables inconnues
La liste continue. Un jour, j'espère qu'il y aura une telle méthode pour accomplir cela de manière fiable avec JavaScript, mais jusqu'à ce que ce jour arrive, vous n'avez pas de chance.
Je déteste ce genre de réponses et j'espère que quelqu'un pourra me prouver le contraire.
la source
Vous devriez pouvoir diviser ('\ n'). Length et obtenir les sauts de ligne.
mise à jour: cela fonctionne sur FF / Chrome mais pas IE.
la source
getClientRects
retourne les rects client comme ceci et si vous voulez obtenir les lignes, utilisez la fonction suivante comme cecila source
J'ai trouvé un moyen de calculer le numéro de ligne lorsque je développe un éditeur html. La méthode principale est la suivante:
Dans IE, vous pouvez appeler getBoundingClientRects, il renvoie chaque ligne sous forme de rectangle
Dans le webkit ou le nouveau moteur html standard, il renvoie les rectangles clients de chaque élément ou nœud, dans ce cas, vous pouvez comparer chaque rectangle, je veux dire que chaque rectangle doit être le plus grand, vous pouvez donc ignorer ces rectangles dont la hauteur est plus petite (si le haut du rectangle est plus petit que lui et le bas plus grand que lui, la condition est vraie.)
voyons donc le résultat du test:
Le rectangle vert est le plus grand rectangle de chaque ligne
Le rectangle rouge est la limite de sélection
Le rectangle bleu est la limite du début à la sélection après l'expansion, nous voyons qu'il peut être plus grand que le rectangle rouge, nous devons donc vérifier le bas de chaque rectangle pour limiter qu'il doit être plus petit que le bas du rectangle rouge.
la source
Essayez cette solution:
Vous pouvez le voir en action ici: https://jsfiddle.net/u0r6avnt/
Essayez de redimensionner les panneaux de la page (pour élargir ou raccourcir le côté droit de la page), puis réexécutez-le pour voir qu'il peut indiquer de manière fiable le nombre de lignes.
Ce problème est plus difficile qu'il n'y paraît, mais la plupart des difficultés proviennent de deux sources:
Le rendu du texte est trop bas dans les navigateurs pour être directement interrogé à partir de JavaScript. Même le pseudo-sélecteur CSS :: first-line ne se comporte pas tout à fait comme les autres sélecteurs (vous ne pouvez pas l'inverser, par exemple, pour appliquer un style à tous sauf à la première ligne).
Le contexte joue un grand rôle dans la façon dont vous calculez le nombre de lignes. Par exemple, si la hauteur de ligne n'a pas été explicitement définie dans la hiérarchie de l'élément cible, vous pouvez retrouver "normal" en tant que hauteur de ligne. De plus, l'élément peut utiliser
box-sizing: border-box
et donc être soumis à un rembourrage.Mon approche minimise # 2 en prenant le contrôle de la hauteur de ligne directement et en prenant en compte la méthode de dimensionnement de la boîte, conduisant à un résultat plus déterministe.
la source
Dans certains cas, comme un lien s'étendant sur plusieurs lignes dans un texte non justifié, vous pouvez obtenir le nombre de lignes et toutes les coordonnées de chaque ligne, lorsque vous utilisez ceci:
https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects
Cela fonctionne parce que chaque ligne serait différente même si légèrement. Tant qu'ils le sont, ils sont dessinés comme un "rectangle" différent par le moteur de rendu.
la source
Suite à la suggestion de @BobBrunius 2010, j'ai créé ceci avec jQuery. Cela pourrait sans doute être amélioré, mais cela peut en aider certains.
la source
Vous pouvez comparer la hauteur de l'élément et la hauteur de l'élément avec
line-height: 0
la source