Agrandissement progressif d'un div

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Agrandissement progressif d'un div

Re: Agrandissement progressif d'un div

par Stef » 18 mars 2010, 18:47

Yeeeehouuuuuuuuuuu :D merci AB!

J'vais tester et essayer de bien tout comprendre! Merci pour le temps que tu y as donné!!

Re: Agrandissement progressif d'un div

par AB » 18 mars 2010, 17:15

Testes ça :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<title>Test... :S</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<script type="text/javascript">
        var hauteur_instant = 0;

        function cch(id_div,hauteur) {
               
                var mydivb = document.getElementById(id_div);               
                var increment = 7;
				
		if (hauteur_instant < hauteur) 
			{ 
				var hauteur_div = hauteur_instant + increment <=  hauteur ? hauteur_instant + increment : hauteur;
					 
                                mydivb.style.height = hauteur_div+'px';
			        hauteur_instant += increment;
						
			        setTimeout(function(){cch(id_div,hauteur)},0);
                        }
               
        }
		
        function progressif(id_div) {
               
                var mydiv = document.getElementById(id_div);
               
                mydiv.style.display = 'block';
				
		var largeur = mydiv.offsetWidth;
 		var hauteur = mydiv.offsetHeight; 
				
		mydiv.style.width = largeur+'px';				
               
		mydiv.style.height = 0+'px';
				
		hauteur_instant = 0;
		cch(id_div,hauteur);	

        }       
</script>
<style type="text/css">
#lediv {
                margin: 0;  
                white-space: nowrap;
                border:1px solid black;
                overflow: hidden;
		width:300px;
		height:150px;
		display:none;
        }
</style>
</head>
<body>
         <span onclick="progressif('lediv')" style="cursor:pointer; text-decoration:underline">Ouvrir</span>
        <div id="lediv">
                <p>Contenu div contenu div<br />contenu div Contenu div contenu<br />div contenu divContenu<br />div contenu div contenu div</p>
        </div>
        <div id="testdem">Bloc dessous qui sera poussé</div>
</body>
</html>
Et il faut que tu comprennes tout avant d'aller plus loin (y'aura une interro écrite :P)
Au passage, notes bien la syntaxe particulière de setTimeout qui permet d'envoyer des paramètres dans la fonction.

Re: Agrandissement progressif d'un div

par Stef » 18 mars 2010, 16:34

1/Tu l'a sous les yeux la solution ! puisque tu l'a déjà utilisée dans ton code. Si offsetWidth retourne 0 avec un display:none en revanche il retourne la largeur sur un display:block et tu sais le faire en javascript :wink:
Oui mais si je le mets pas en display: none, comment je le cache avant de le faire apparaître?
Sinon il n'y a aucune raison d'utiliser setTimeout dans ta fonction progressif. Lance directement les fonctions !
Comment je déclenche les fonctions directement alors? Je ne connais pas la formule...
Tu as aussi des petits problèmes logiques dans tes fonctions cch et ccw : il ne faut incrémenter que si la condition n'est pas remplie, pas avant. Et pour arriver finalement à la hauteur exacte, il y a une petite astuce.
Oui, j'avais pas pensé à ça, faut l'incrémenter qu'après vérification de la condition... Par contre je ne trouve pas l'astuce dont tu parles... Je vais chercher comme tu dis (m'enfin, si tu peux me donner un ch'ti indice)...

Encore merci AB!!

Re: Agrandissement progressif d'un div

par AB » 18 mars 2010, 15:14

Ca fontionne comme je le voulais. Enfin presque parce que je voudrais pouvoir déclarer les dimensions du div dans le CSS externe au js, mais je ne le peux pas... Sur le div en display:none offsetWidth retourne 0.
Donc j'ai été obligé de faire comme ça.

Si quelqu'un a des idées pour améliorer ce code en général, et pour apporter en particulier une solution à ma question sur le CSS, je suis preneur! : )
1/Tu l'a sous les yeux la solution ! puisque tu l'a déjà utilisée dans ton code. Si offsetWidth retourne 0 avec un display:none en revanche il retourne la largeur sur un display:block et tu sais le faire en javascript :wink:

Sinon il n'y a aucune raison d'utiliser setTimeout dans ta fonction progressif. Lance directement les fonctions !

Tu as aussi des petits problèmes logiques dans tes fonctions cch et ccw : il ne faut incrémenter que si la condition n'est pas remplie, pas avant. Et pour arriver finalement à la hauteur exacte, il y a une petite astuce.

Bon je te laisse chercher un peu et appliquer mes premiers conseils.

Re: Agrandissement progressif d'un div

par Stef » 18 mars 2010, 08:01

Well, j'ai continué à bosser dessus, et ça donne ça:
<html>
<head>
	<title>Effet JS</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<style type="text/css">
	#lediv {
		margin: 0;
		padding: 5px;
		white-space: nowrap;
		border: 1px solid black;
		overflow: hidden;
	}
	</style>
	<script type="text/javascript">
	var x = 0;
	var y = 0;
	function ccw() {
		
		var mydiva = document.getElementById('lediv');
		var rep1 = setTimeout('ccw()', 10);
		x += 10;
		
		mydiva.style.width = x + 'px';
			
		if (mydiva.offsetWidth >= 300) {
				
			clearTimeout(rep1);

		}
		
	}
	function cch() {
		
		var mydivb = document.getElementById('lediv');
		var rep2 = setTimeout('cch()', 10);
		y += 10;
		
		mydivb.style.height = y + 'px';
			
		if (mydivb.offsetHeight >= 150) {
				
			clearTimeout(rep2);

		}
		
	}
	function progressif() {
		
		var mydiv = document.getElementById('lediv');
		
		mydiv.style.width = '0px';
		mydiv.style.height = '0px';
		mydiv.style.display = 'block';
		
		setTimeout('ccw()', 10);
		setTimeout('cch()', 10);

	}	
	</script>
</head>
<body>
	<a href="#gonoway" onclick="progressif()">Ouvrir</a>
	<div id="lediv" style="display: none;">
		<p>Contenu div contenu div<br />contenu div Contenu div contenu<br />div contenu divContenu<br />div contenu div contenu div</p>
	</div>
	<div id="testdem"></div>
</body>
</html>
Ca fontionne comme je le voulais. Enfin presque parce que je voudrais pouvoir déclarer les dimensions du div dans le CSS externe au js, mais je ne le peux pas... Sur le div en display:none offsetWidth retourne 0.
Donc j'ai été obligé de faire comme ça.

Si quelqu'un a des idées pour améliorer ce code en général, et pour apporter en particulier une solution à ma question sur le CSS, je suis preneur! : )

Re: Agrandissement progressif d'un div

par AB » 18 mars 2010, 02:31

Effectivement c'est plus pratique car en plus de récupérer la largeur définie en css, tu peux faire des comparaisons genre offsetHeight <= 305 ce qui te seras très utile si la largeur de ton tableau était par exemple de 305px car dans ce cas en testant une égalité (= 305) et des incréments de 10px, ta boucle serait infinie :wink:

Re: Agrandissement progressif d'un div

par Stef » 18 mars 2010, 01:52

Génial AB, c'est exactement ce dont j'avais besoin! Du coup je pense que c'est réalisable de cette manière... De plus offsetWidth retourne un integer, non? C'est plus pratique dans ce cas qu'une chaine du style "XXpx" comme renvoie .style.width ...

Re: Agrandissement progressif d'un div

par AB » 18 mars 2010, 01:02

L'accès "facile" aux données des fichiers CSS en javascript n'est pas encore implémentée dans tous les navigateurs.
Pour que la solution soit portable il faudrait donc parser la feuille de style. Je ne connais pas de solution "standard" (je veux dire "indiscutablement la meilleure") mais il y a beaucoup de scripts sur le web pour ça.

Sinon tu peux utiliser document.getElementById('lediv').offsetWidth pour trouver la largeur d'un div défini en CSS ou par un style incorporé ou par javascript, alors que document.getElementById('lediv').style.width ne peut retourner que la largeur d'un div défini par un style incorporé ou par javascript (et pas en css).

Re: Agrandissement progressif d'un div

par Stef » 18 mars 2010, 00:24

Oui effectivement c'est encore plus simple! : )

J'en profite pour te poser une question au passage:

comment je peux modifier ce code pour fair en sorte que le div s'agrandisse jusqu'aux dimensions déterminées par le fichier CSS? Est-ce que c'est possible?

Exemple, dans un style.css j'aurais:

#lediv {
width: 300px;
height: 150px;
}

Re: Agrandissement progressif d'un div

par AB » 17 mars 2010, 23:49

Pour préciser un peu plus les conséquences de l'explication donnée par Calimero :

Ton pb venait du fait que quand tu faisais clearInterval(rep) tu n'effaçais que la dernière var rep = setInterval('progressif()', 50) définie juste avant... mais pas les autres setInterval précédemment lancés dans la boucle :)

Pour utiliser correctement setInterval dans ce contexte il faudrait ne le lancer qu'une fois, par exemple :
var z = 0;
var rep;

function progressif() 
{
	if(typeof rep == 'undefined') rep = setInterval('progressif()', 10);
	
	var mydiv = document.getElementById('lediv');
	 
	 if(mydiv.style.width == '300px') 
		{
			clearInterval(rep);
		}
		else
		{	 
			mydiv.style.width = z + 'px';
			mydiv.style.height = z + 'px';		 
			z += 10;
		}	 	
}
Enfin bon, on utilise généralement setTimeout qui est plus pratique dans une boucle,
d'ailleurs tu aurais pu ne pas utiiser clearTimeout en faisant simplement :
var z = 0;

function progressif() 
{
	
	var mydiv = document.getElementById('lediv');	 
	
	 if(mydiv.style.width != '300px') 
		{
			mydiv.style.width = z + 'px';
			mydiv.style.height = z + 'px';		 
			z += 10;
			setTimeout('progressif()', 10);
		}	
}

Re: Agrandissement progressif d'un div

par Stef » 17 mars 2010, 08:15

Là je vois pas trop le rapport avec la choucroute... :oops:
Tu veux parler du rapport avec le sujet de ce fil?

au pire cette sortie est juste implicite et se résume à débrancher le cordon d'alimentation de l'ordinateur :lol: ).
Ou le transfo EDF qui alimente le serveur! :mrgreen:

Blague à part, ce genre de structure est intéressant, voire incontournable, dans certains contextes (prog. réseau, GUI évènementielle comme GTK...) et certains langages (C, asm...) mais en javascript je suis sceptique. Une boucle infinie c'est une structure à la fois lourde et bloquante, hors en javascript au contraire on va plutôt chercher la légèreté et l'effort minimum...
Oui, en parlant de légereté: c'est pas seulement parce que j'ai envie d'apprendre javascript (que j'aime bien) que je me suis lancer dans l'écriture de cette fonctiounette mais aussi pour m'éviter d'utiliser jquery ou mootools juste pour un ch'ti effeft de fenêtre.

Encore merci Calim! (tu permet que je t'appelle comme ça?)

Re: Agrandissement progressif d'un div

par Calimero » 17 mars 2010, 01:52

Par contre en faisant des recherches je me suis attardé un peu sur les structures de contrôles et je suis tombé sur une page qui parle d'une "boucle forever"! Je savais pas que ça existait... Ce qui est bizzare surtout c'est l'explication et les exemples donnés qui sont un peu confus:

http://www.wikituto.org/index.php/Contr ... Javascript

Je n'ai pas trouvé d'autres sites qui parlent de cette fameuse boucle forever.
Là je vois pas trop le rapport avec la choucroute... :oops:

Je ne savais pas que ça s'appelait "boucle forever" (jamais vu ce nom en tout cas), pour moi c'est une boucle infinie toute bête (il y a toujours une sortie à une boucle, même quand elle est infinie - au pire cette sortie est juste implicite et se résume à débrancher le cordon d'alimentation de l'ordinateur :lol: ).

Blague à part, ce genre de structure est intéressant, voire incontournable, dans certains contextes (prog. réseau, GUI évènementielle comme GTK...) et certains langages (C, asm...) mais en javascript je suis sceptique. Une boucle infinie c'est une structure à la fois lourde et bloquante, hors en javascript au contraire on va plutôt chercher la légèreté et l'effort minimum...

Re: Agrandissement progressif d'un div

par Stef » 17 mars 2010, 01:13

Oui j'ai compris en cherchant de l'info... :)

Par contre en faisant des recherches je me suis attardé un peu sur les structures de contrôles et je suis tombé sur une page qui parle d'une "boucle forever"! Je savais pas que ça existait... Ce qui est bizzare surtout c'est l'explication et les exemples donnés qui sont un peu confus:

http://www.wikituto.org/index.php/Contr ... Javascript

Je n'ai pas trouvé d'autres sites qui parlent de cette fameuse boucle forever.

Re: Agrandissement progressif d'un div

par Calimero » 17 mars 2010, 00:41

setInterval(fonction, N) lance ta fonction toutes les N millisecondes.
setTimeout(fonction, N) lance ta fonction dans N millisecondes et s'arrête après :)

Re: Agrandissement progressif d'un div

par Stef » 16 mars 2010, 23:40

Impec!

J'ai pas compris la différence entre setInterval et setTimeout, mais ça marche très bien! : D

Merci beaucoup Calimero!! : D

Mon code à ce stade:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
	<title>Test... :S</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
	<script type="text/javascript">
	var z = 0;

	function progressif() {
		
		var mydiv = document.getElementById('lediv');
		var rep = setTimeout('progressif()', 10);
		z += 10;
		
		if (mydiv.style.width == '300px') {
			
			clearTimeout(rep);

		}
		else {
			
			mydiv.style.width = z + 'px';
			mydiv.style.height = z + 'px';
			
		}

	}	
	</script>
</head>
<body>
	<a href="#gonoway" onclick="progressif()">Ouvrir</a>
	<div id="lediv" style="display: block; border: 1px solid black; overflow: hidden; width: 50px; height: 50px;">
		<p>Contenu div contenu div contenu divContenu div contenu div contenu divContenu div contenu div contenu div</p>
	</div>
</body>
</html>