103 votes

Détecter si le texte a débordé

Comment détecter si un texte a débordé ? Par exemple, le texte suivant est plus long que ne le permet son conteneur div. Comment puis-je le détecter en javascript ?

<div style="max-width: 100px; white-space:nowrap; overflow: hidden;">
    Lorem ipsum dolor sit amet, consectetur adipisicing elit
</div>

167voto

Nathan Bell Points 1103

Si vous utilisez jQuery, vous pouvez essayer de comparer la largeur de la division à sa scrollWidth.

if ($('#div-id')[0].scrollWidth >  $('#div-id').innerWidth()) {
    //Text has over-flown
}

28 votes

J'ai dû aussi utiliser innerWidth() au lieu de width() pour prendre en compte les paddings.

1 votes

J'utilise la même technique, mais en comparant la scrollHeight contre innerHeight()

4 votes

Modifié pour utiliser innerWidth() au lieu de width()

20voto

artnikpro Points 440

Vous pouvez détecter si le texte s'adaptera avant vous affichez l'élément. Vous pouvez donc utiliser cette fonction qui ne nécessite pas que l'élément soit à l'écran.

function textWidth(text, fontProp) {
    var tag = document.createElement('div')
    tag.style.position = 'absolute'
    tag.style.left = '-99in'
    tag.style.whiteSpace = 'nowrap'
    tag.style.font = fontProp
    tag.innerHTML = text

    document.body.appendChild(tag)
    var result = tag.clientWidth
    document.body.removeChild(tag)
    return result;
}

Utilisation :

if (textWidth('Text', 'bold 13px Verdana') > elementWidth) {
    ...
}

0 votes

Cela a fonctionné pour moi lorsque scrollWidth est égal à zéro, ce qui semble se produire parfois (je n'ai pas trouvé pourquoi...).

1 votes

Très utile ! J'ai en gros juste assemblé ma propre version simplifiée de Fitty.js pour parcourir en boucle les éléments d'une page et si l'un d'entre eux est plus grand que son conteneur, diminuer la police de 1px à la fois jusqu'à ce qu'elle s'adapte :-)

0 votes

A bien fonctionné pour moi

6voto

Flash Points 130

Plugin jQuery pour vérifier si le texte a débordé, pas très bien écrit, mais fonctionne comme il est censé fonctionner. Je poste ceci parce que je n'ai pas trouvé de plugin fonctionnel pour cela nulle part.

jQuery.fn.hasOverflown = function () {
   var res;
   var cont = $('<div>'+this.text()+'</div>').css("display", "table")
   .css("z-index", "-1").css("position", "absolute")
   .css("font-family", this.css("font-family"))
   .css("font-size", this.css("font-size"))
   .css("font-weight", this.css("font-weight")).appendTo('body');
   res = (cont.width()>this.width());
   cont.remove();
   return res;
}

1 votes

Beau plugin, mais le passé correct de 'overflow' est 'overflowed' =)

0 votes

Cela fonctionne très bien ! Pourriez-vous expliquer comment cela fonctionne ? D'après ce que je peux voir, c'est mieux que l'option isEllipsisActive que vous pouvez trouver ici sur SO, car elle fonctionne même dans certains cas limites, lorsque la largeur du texte débordé est la même que celle du texte non débordé. overflow:hidden; y text-overflow: ellipsis

0 votes

Cela fonctionne, mais uniquement pour les éléments qui contiennent une seule ligne de texte. Pour les éléments de largeur fixe qui couvrent plusieurs lignes, modifiez cette fonction pour tester la hauteur au lieu de la largeur.

0voto

mVChr Points 26738

À titre d'exemple, disons que votre div a pour nom id="d" alors vous pourriez le faire :

var d = document.getElementById('d'),
    dWider;
d.style.maxWidth = '9999em';
d.style.overflow = 'visible';
dWider = d.offsetWidth > 100;
d.style.maxWidth = '100px';
d.style.overflow = 'hidden';

Ensuite, la var dWider sera vrai si le texte déborde et faux s'il ne déborde pas.

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