OVH Cloud OVH Cloud

Connaitre le "width" d'un DIV contenant du texte sans le fixer

9 réponses
Avatar
Choub
Bonjour,
Apr=E8s beaucoup de recherche, je n'arrive toujours pas =E0 compl=E9ter ce
bug.

Il s'av=E8re qu'en cr=E9ant un div avec document.createElement("div"),
puis en y ins=E9rant un texte, on ne peut pas connaitre la taille de ce
div avant de l'avoir ins=E9r=E9.
Soit.

Une fois qu'il est ins=E9r=E9, avec document.body.appendChild(div) par
exemple, je veux r=E9cup=E9rer la taille.

Je teste alors div.offsetWidth, qui ne fonctionne pas (retourne 0).

Comment r=E9cup=E9rer la taille d'un div avant son insertion (ou juste
apr=E8s) en Javascript ?

9 réponses

Avatar
ASM

Comment récupérer la taille d'un div avant son insertion (ou juste
après) en Javascript ?


ceci fonctionne avec mon Fx :

<html>
<script type="text/javascript">
var ind=0;
function newdiv(txt) {
var div = document.createElement('DIV');
ind++;
div.id = 'div_'+ind;
div.style.position = 'absolute';
div.style.top = ind+'em';
div.innerHTML = txt;
var cible = document.getElementById('insert');
cible.appendChild(div);
alert('largeur = '+document.getElementById('div_'+ind).offsetWidth);
}
</script>
<p><a href="#"
onclick="newdiv('voici un nouveau div');return false;">div 1</a></p>
<p><a href="#"
onclick="newdiv('voici un autre div');return false;">div 2</a></p>
<p id="insert" style="position:relative">ici les nouveaux divs :</p>
</html>



--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Choub
Merci d'avoir répondu.

Effectivement cela marche, mais je me rend compte que ça n'est pas ce
que je souhaite, car je me suis mal exprimé.
Je veux que le div ait la taille du texte qu'il contient, mais en lui
fixant sa taille.
Donc en fait, ça n'est pas comment connaître la taille du div, mais
comment connaître la taille du texte qu'il contient, pour ensuite lui
fixer la valeur en pixel.

Car par défaut, un div prend la taille de son conteneur, et cela me
pose problème car je veux réaliser le même effet que pour un objet
Label en Java.
Avatar
olivier

Car par défaut, un div prend la taille de son conteneur, et cela me
pose problème car je veux réaliser le même effet que pour un objet
Label en Java.


As-tu essayé display:inline-block ?

--
olivier

Avatar
CrazyCat
olivier wrote:
Car par défaut, un div prend la taille de son conteneur, et cela me
pose problème car je veux réaliser le même effet que pour un objet
Label en Java.
As-tu essayé display:inline-block ?



ou, pourquoi pas un span?

--
Astuces informatiques: http://www.crazycat.info
Tchattez en liberté: http://www.crazy-irc.net


Avatar
ASM
Merci d'avoir répondu.

Effectivement cela marche, mais je me rend compte que ça n'est pas ce
que je souhaite, car je me suis mal exprimé.
Je veux que le div ait la taille du texte qu'il contient, mais en lui
fixant sa taille.
Donc en fait, ça n'est pas comment connaître la taille du div, mais
comment connaître la taille du texte qu'il contient, pour ensuite lui
fixer la valeur en pixel.


ne reste qu'à faire une règle de 3 ...
tu as la taille 'normale' du div
tu réduis/agrandis la taille du caractère en fonction

<html>
<script type="text/javascript">
var ind=0;
function newdiv(txt,larg) {
var div = document.createElement('DIV');
ind++;
div.id = 'div_'+ind;
div.style.position = 'absolute';
div.style.top = ind+'em';
div.style.fontSize = '2em';
div.innerHTML = txt;
var cible = document.getElementById('insert');
cible.appendChild(div);
div = document.getElementById('div_'+ind);
div.style.fontSize = (2*larg/div.offsetWidth)+'em';
alert('largeur = '+div.offsetWidth);
}
</script>
<p><a href="#"
onclick="newdiv('voici un nouveau div',120);return false;">
div 1</a>
</p>
<p><a href="#"
onclick="newdiv('voici un autre div',120);return false;">
div 2</a>
</p>
<p><a href="#"
onclick="newdiv('autre div, largeur 150',150);return false;">
div 3</a>
</p>
<div id="insert" style="position:relative">
<p>ici les nouveaux divs :</p>
</div>
</html>

Car par défaut, un div prend la taille de son conteneur,


c'est selon ...

dans l'exemple les nouveaux divs sont en absolute
la largeur du div s'adapte au contenu (au morceau de texte y inséré)

si les divs sont non positionnés ou positionnés en relative
cette fois, en l'absence de largeur fixée, le div est de la largeur de
l'écran moins les marges (et autres contraintes)

et cela me
pose problème car je veux réaliser le même effet que pour un objet
Label en Java.


sais pas c'que c'est ... je ne connais que le JavaScript.


--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Bobe
CrazyCat nous a dit le 04.05.2006 17:37:
olivier wrote:
Car par défaut, un div prend la taille de son conteneur, et cela me
pose problème car je veux réaliser le même effet que pour un objet
Label en Java.
As-tu essayé display:inline-block ?



ou, pourquoi pas un span?



Par défaut, la largeur du span ne pourra pas être fixée (les boîtes
en-ligne n'acceptent pas les spécifications de largeur et hauteur
notamment).

--
Aurélien Maille



Avatar
Choub
En fait, c'est l'inverse que je veux. :D
Ne pas fixer la taille du div au moment de l'insertion, mais que la
taille soit calculée et fixée après automatiquement en fonction de
la taille du texte.

J'ai pas encore trouvé la solution adéquate.. ..
Avatar
ASM
En fait, c'est l'inverse que je veux. :D
Ne pas fixer la taille du div au moment de l'insertion, mais que la
taille soit calculée et fixée après automatiquement en fonction de
la taille du texte.


si c'est la largeur qui est à fixer "automatiquent" position: absolute;
si c'est la hauteur qui est à fixer "automatiquent" position: relative;

J'ai pas encore trouvé la solution adéquate.. ..


Le compliqué est de placer le nouveau div (top et left) s'il est en
absolute.


<html>
<script type="text/javascript">
var ind=0;
function newdiv(txt) {
var div = document.createElement('DIV');
ind++;
div.id = 'div_'+ind;
div.style.position = 'absolute';
div.style.top = ind+'em';
div.innerHTML = txt;
var cible = document.getElementById('insert');
cible.style.height = (ind*1+1*1)+'em';
cible.appendChild(div);
alert('largeur = '+div.offsetWidth);
}
</script>
<p><a href="#"
onclick="newdiv('voici un nouveau div');return false;">
div 1</a>
</p>
<p><a href="#"
onclick="newdiv('autre div');return false;">
div 2</a>
</p>
<p><a href="#"
onclick="newdiv('voici encore un autre div');return false;">
div 3</a>
</p>
<div id="insert" style="position:relative">
<p>ici les nouveaux divs :</p>
</div>
</html>




sorte de demo pour 'relative' :
http://perso.wanadoo.fr/stephane.moriaux/truc/cadre/



--
Stephane Moriaux et son [moins] vieux Mac

Avatar
YD
En fait, c'est l'inverse que je veux. :D
Ne pas fixer la taille du div au moment de l'insertion, mais que la
taille soit calculée et fixée après automatiquement en fonction de
la taille du texte.

J'ai pas encore trouvé la solution adéquate.. ..


Dupliquer le div en question en lui ajoutant les attributs de style :
position: absolute;
visibility: hidden;

Puis ce script après l'insertion des deux div :

<script type="text/javascript">
document.getElementById("label").style.width=document.getElementById("invisible").offsetWidth
+ "px";
</script>

où 'label' est l'id du champ à redimensionner et 'invisible' celui qui sert à
calculer la largeur.

Bien sûr si le nombre d'éléments/de pages où il est nécessaire de procéder ainsi
le justifie, cela peut être entièrement fait par DOM/Javascript, en recherchant
dans les DIV (document.getElementsByTagName('DIV')) ceux qui ont une certaine
classe, en les clonant (cloneNode()), en leur ajoutant la classe 'invisible',
en les insérant dans le flux HTML, en calculant leur largeur, et enfin en les
supprimant.

HTH
--
Y.D.