49 votes

Obtenir la hauteur totale d'un DIV coupé

Comment puis-je obtenir la hauteur de la div qui inclut la zone coupée de la div ?

<div style="height: 20px; overflow: hidden">
  content<br>content<br>content<br>
  content<br>content<br>content<br>
  content<br>content<br>content<br>
</div>

3 votes

Pour ceux qui recherchent la meilleure approche, ignorez la réponse acceptée et essayez la réponse de @Colt.

2 votes

Sauf que cette réponse utilise jQuery, et que cette question ne portait pas sur jQuery.

0 votes

Je pense qu'il s'agit de l'utilisation de scrollHeight ... pas le jQuery

50voto

jolt Points 4824

Vous ne pouvez pas le faire de cette façon, mais c'est possible en ajoutant un élément interne à votre conteneur, comme ceci :

<div id="element" style="height: 20px; overflow: hidden;">
    <p id="innerElement"> <!-- notice this inner element -->
        content<br />content<br />content<br />
        content<br />content<br />content<br />
        content<br />content<br />content<br />
    </p>
</div>

note en marge : Le fait de placer le contenu à l'intérieur des paragraphes est également une bonne pratique, et cet élément supplémentaire ne pose pas tant de problèmes que cela, si tant est qu'il en pose...

Et JavaScript :

var innerHeight = document.getElementById('innerElement').offsetHeight;
alert(innerHeight);

P.S. Pour que ce JavaScript fonctionne, placez-le après votre #element car le JavaScript ordinaire est exécuté avant que le DOM ne soit prêt s'il n'en reçoit pas l'instruction. Pour que cela fonctionne lorsque le DOM est prêt, vérifier ceci .

Mais je suggérerais d'obtenir jQuery Il vous sera utile plus tard si vous souhaitez étendre les opérations JavaScript dans votre site.

De plus, jQuery est le pouvoir pour de vrai !

Ainsi, il suffit d'ajouter ce script à votre <head /> (en supposant que vous ayez inclus jQuery) :

$(document).ready(function() {
 var innerHeight = $('#innerElement').height();
 alert(innerHeight);
});

Exemple @jsFiddle utilisant la méthode jQuery !

0 votes

Oui. Il semble que ce soit la meilleure façon de procéder. Je vous remercie. Oh et oui, j'adore jQuery. C'est une très belle bibliothèque.

2 votes

Conseil : (je viens de le découvrir) si vous obtenez toujours 0 en retour de height ou offsetHeight, assurez-vous que vous avez configuré vos éléments pour qu'ils soient visibles avant de les mesurer.

0 votes

C'est une excellente façon de procéder. Nous vous en remercions.

46voto

Colt Points 179

Cela fonctionne dans tous les cas, qu'il s'agisse d'un nœud de texte ou d'un conteneur. Ceci utilise jquery, mais vous n'en avez pas besoin.

//return the total height.
totalHeight = $('#elem')[0].scrollHeight;
//return the clipped height.
visibleHeight = $('#elem').height();

$('#elem')[0] renvoie l'élément dom à partir de l'appel jquery. Vous pouvez donc l'utiliser sur n'importe quel élément dom en utilisant du simple javascript.

1 votes

L'astuce réside dans la propriété scrollHeight, qui contient la hauteur de l'élément avant l'écrêtage. Cette propriété est disponible sans jQuery.

8voto

Shadow Wizard Points 38568

Voici une façon de réaliser ce que vous souhaitez, en utilisant l'idée de Fabian :

function GetHeight() {
    var oDiv = document.getElementById("MyDiv");
    var sOriginalOverflow = oDiv.style.overflow;
    var sOriginalHeight = oDiv.style.height;
    oDiv.style.overflow = "";
    oDiv.style.height = "";
    var height = oDiv.offsetHeight;
    oDiv.style.height = sOriginalHeight;
    oDiv.style.overflow = sOriginalOverflow;
    alert("Real height is " + height);
}

Démonstration en direct et cas d'essai : http://jsfiddle.net/yahavbr/7Lbz9/

0 votes

Oui, cela conviendrait. J'espérais toutefois ne pas avoir à retirer le trop-plein avant de calculer la hauteur.

0 votes

En fait, cela résout parfaitement mon problème, car la vitesse à laquelle le trop-plein est réglé/réinitialisé n'entraîne pas de défilement.

0 votes

@Prakash : je ne fais que définir une variable, puis je rétablis le débordement et la hauteur d'origine. Cela se fait dans un "tick" de l'unité centrale, de sorte que l'utilisateur ne verra pas de changement dans l'interface utilisateur.

5voto

Vishwajeet Points 151

Utilice scrollHeight de l'élément au lieu de clientHeight o offsetHeight .

L'approche consistant à envelopper le contenu est cependant plus efficace.

2voto

Fabian Points 6438

Ce n'est pas possible à première vue. Ce que vous pouvez essayer, c'est de supprimer ce style et de le définir à l'aide de javascript après avoir obtenu la hauteur. Ce n'est pas la solution la plus élégante, mais je pense que c'est la seule.

0 votes

J'ai donné de la chair et des os à cette idée, IMO elle est assez élégante lorsqu'elle est bien enveloppée dans une fonction :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X