11489 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

j'essaye de faire un truc assez simple : faire apparaître une image de mon blog Wordpress en fadein via jQuery.

Je fais appel à jQuery dans mon header :
<?php wp_enqueue_script('jquery');
wp_enqueue_script('fade', '/wp-content/themes/simplev2/javascript/fade.js', array('jquery')); ?>
<?php wp_head(); ?> </head>


Puis mon fichier fade.js :
    function fade() { 
jQuery('#Picture').load(function() { 
jQuery("#Picture").fadeIn(8000); 
});
}

(dans Wordpress on remplace les '$' par des 'jQuery')

Dans mon html, sur l'image j'ai rajouté img="Picture"
<img src="http://www.…hop_03.jpg" id="Picture" width="648" height="486" border="0"  />


Mais aucun effet !
J'ai vérifié, les deux JS sont chargés donc je vois pas le problème.
Par contre je suis nul en code et j'ai des doutes sur la fonction 'fade'
ça vous semble correcte ?

Je craque la… Smiley bawling
Pour info j'ai essayé de faire la même chose mais sur une page 'vierge' en dehors de Wordpress et j'ai la même, le problème n'a donc pas de rapport avec Wordpres. C'est vraiment un probleme 'jQuery' …
Salut,
Tu l'appelles quand la fonction fade ? Avec seulement ce bout ça donne quoi ?
jQuery('#Picture').load(function() { 
    jQuery(this).fadeIn(8000); 
});
jo_link_noir a écrit :
Salut,
Tu l'appelles quand la fonction fade ? Avec seulement ce bout ça donne quoi ?
jQuery('#Picture').load(function() { 
    jQuery(this).fadeIn(8000); 
});



en fait je e demande aussi comment appeler la fonction…
j'ai essayé ton code mais je ne vois toujours pas d'effet…
Ah oui, forcement, si l'image n'est pas caché, fadeIn ne ferra rien.
//après chargement du document
$(document).ready(function (){
	jQuery("#Picture").load(function(){
		//on cache l'image immédiatement
		jQuery(this).fadeOut(0, function(){
			//on la ré-affiche avec un effet de transparence
			jQuery(this).fadeIn(8000);
		});
	});
});

Comme ça je pense que c'est bon,
bonne nuit.
Woa c'est tellement bien fait (avec commentaires en plus !) que je comprenais pas pourquoi ça ne pouvait pas marcher !!

En fait tu as simplement oublié un $ sur la première ligne, à remplacer par un jQuery. Un détail. Et la ça marche nickel.

Franchement MERCI, je m'incline, c'est trop bien !! Smiley smile

Maintenant je me demande si c'est possible d'utiliser ce script et de l'appliquer faire un slideshow avec InnerFade ou Cycle… Smiley lol
Modifié par nlex (17 Sep 2009 - 22:56)
Je m'auto-répond

J'avais déjà fait une petite page html pour un slide via InnerShade.
En ajoutant ton code, et une balise : id="Picture", j'arrive à avoir les deux !!

Wow trop fort ! Smiley biggrin

maintenant je me demande si c'est compliqué d'avoir un bouton : next/previous…
Je crois pas que ça soit prévu par InnerFade

http://medienfreunde.com/lab/innerfade/
Effectivement, ce n'est pas prévu par innerFade. Y toujours moyen de le modifier ou trouver un plugin avec ces options.
Ok pour pouvoir avoir la fonction Next/Before j'utilise finalement Cycle qui utilise en autre Innerfade…

J'arrive à avoir la fonction d'image suivante assez facilement.
J'arrive aussi à avoir la fonction qui permet d'avoir la fonction de fade 'on load' sur un slidehow automatique.

Par contre je n'arrive pas à avoir les deux en même temps… !
Mon JS :
<script type="text/javascript">
				
 $(function() { $('#slideshow img:first').fadeIn(1000,
 function() { $('#slideshow').cycle(); }); }); 
 
 $('#s2').cycle({ 
    fx:     'fade', 
    speed:  'fast', 
    timeout: 0, 
    next:   '#next2', 
    prev:   '#prev2' 
});
</script>


Pour le coup en faisant ça j'ai l'effet mais j'ai aussi un slide-show automatique dont je ne veux pas…

La page de Cycle avec les exemples sont la : http://malsup.com/jquery/cycle/

Une idée ?
Est-ce que je peux utiliser le même code mais pour une div (au lieu d'une image) ?

j'ai essayé mais ça ne marche pas…
nlex a écrit :
Est-ce que je peux utiliser le même code mais pour une div (au lieu d'une image) ?

Je ne pense pas que tu aies un évènement load pour le chargement de la DIV...
Si ta DIV contient une image, tu peux surveiller le chargement de l'image (load), puis cibler la DIV qui contient l'image (voir du côté des fonctions de parcours du DOM -- ou traversing -- de jQuery), et appliquer les effets à cette DIV.

Pour y arriver, des connaissances de base en JavaScript, gestion des évènements et jQuery seraient un plus. Smiley cligne
Ok mais je suis obligé de faire avec mes connaissances…

N'y aurait il pas un moyen plus simple ?

Du genre écrire/trouver un petit script qui load les images avant dans la page, puis afficher la div en fadin ? Je ne sais pas si ce que je dis à un sens…

C'est marrant que personne n'ai écrit un script qui ressemble à ça, je pensais que c'était assez commun comme demande, l'idée est d'avoir tous les éléments de la page qui s'affiche avec un effet de fondu, sauf la barre de menu… Smiley ohwell

Si vous avez des idées/conseils… je suis preneur.
en gros si je preload mes images alors le script marchera impec nan ?
Modifié par nlex (06 Nov 2009 - 15:38)
C'est quand même bizarre, par ce que effet marche très bien faut que la première fois que je vais sur le site (avant que ça soit en cache) la div apparaît 1/100 seconde puis disparaît avant de revenir en fondu. Une fois que c'est en cache, ça marche sur les autres pages… j'imagine c'est que le temps que le navigateur charge JQuery et le script…

Est-ce que je peux préloader toute la page avant de l'afficher ou quelque chose du genre ?

L'histoire du DOM ça me parait en effet assez difficile pour moi…

Un conseil ?
Voila ce que j'ai essayé mais… ça ne marche pas :

le code que je charge dans le page :

$.preloadImages = function()
{
  for(var i = 0; i<arguments.length; i++)
  {
    $("<img>").attr("src", arguments[i]);
  }
}


Et dans le HTML head :

	<script type="text/javascript">
	
	$.preloadImages("img/CLS_apropos.gif");
	$(
	function()
	{
    $("<img>").fadeOut(0, function(){ 
    $(this).fadeIn(800); 
			}
		)
	}
)
[/i]
nlex a écrit :
Est-ce que je peux préloader toute la page avant de l'afficher ou quelque chose du genre ?

Pas vraiment, ou alors pas facilement. Et, au niveau de la performance ressentie, mieux vaut afficher les éléments dès que possible plutôt que de retarder l'affichage.

nlex a écrit :
Un conseil ?

Laisser tomber cet effet douteux? Smiley lol
Smiley lol

Bah c'est zarbi quand même : tout le monde parle de jQuery, que c'est génial par ce que c'est facile de faire des effets, plus besoin de Flash pour des choses simples blabla… Et puis un simple effet de Fade-In n'est pas possible à coupler à un script de preload ?

De tout façon ma page est super légère donc le poids n'est pas vraiment un problème… sur la page d'accueil j'ai mis un autre script jQuery qui fait un fade-in sur une image avec un pre-load sur l'image, ça marche bien c'est cool mais c'est pas très adapté pour les éléments de pages de type logo, titre en Gif… C'est plutot pour faire un effet sur une grosse image (comme un slideshow avec une image quoi). C'est pas un effet sur toute la div…

Bon bref… En tout cas moi je trouve cet effet très bien Smiley smile

Enfin bref…
Modifié par nlex (12 Nov 2009 - 10:06)
nlex a écrit :
tout le monde parle de jQuery

Certes, car effectivement jQuery c'est bien.

nlex a écrit :
que c'est génial par ce que c'est facile de faire des effets

Mouais. Les effets réalisables avec jQuery sont sympa, mais d'une on ne peut pas faire tout et n'importe quoi, et de deux il faut surveiller les performances (notamment sous IE6 et IE7, et/ou sur des machines un peu lentes).

nlex a écrit :
Et puis un simple effet de Fade-In n'est pas possible à coupler à un script de preload ?

Si tu penses à l'effet «tout mon contenu est préchargé puis apparait en fade-in», on peut en dire deux choses:
1. c'est un classique des sites full-Flash, et je soupçonne que ça soit une grosse connerie ergonomique («don't make me wait»), même si je n'ai pas d'infos précises à ce sujet (par ex. des résultats d'études comparatives);
2. le faire au chargement d'une nouvelle page n'est pas évident, mais c'est sans doute jouable;
3. pour un contenu chargé en Ajax, il me semble que c'est un peu plus facile à réaliser, et c'est un effet relativement courant (et un peu plus défendable d'un point de vue ergo).

Pour le #2, je ne sais pas comment il faudrait procéder exactement. En y passant deux-trois heures, je pourrais sans doute mettre sur pied une démo et la tester dans les différents navigateurs. Donc si tu as les bases nécessaires en JavaScript et en jQuery, et deux-trois heures devant toi, tu devrais arriver à quelque chose. Smiley cligne

Quelques précisions qui vont bien:
- Faire un fade-in d'un DIV en jQuery, c'est simple ($("sélecteur CSS pour mon DIV").hide().fadeIn();).
- Tu peux même en faire un sur l'élément BODY ($(document.body).hide().fadeIn();), ceci dit je ne suis pas sûr que ça passe bien dans tous les navigateurs... avoir un DIV comme conteneur global et appliquer l'effet sur le DIV, c'est sans doute mieux.
- La grande question est de savoir QUAND appliquer l'effet, et en fonction de quelles contraintes. Un conseil: afficher le contenu le plus tôt possible, même s'il manque des illustrations. Bien sûr, si le contenu chargé est une galerie d'images avec des miniatures, ou une image avec une légende, c'est pas forcément une bonne idée. Mais quand même.
- Pour un effet de fade-in sans attendre le chargement des images, au chargement de la page, tu devrais pouvoir faire ça directement suite à l'évènement DomReady (très simple en jQuery, voir le tutoriel de base).
- Si tu veux surveiller le chargement des images, il faudra sans doute afficher le contenu en dehors du viewport (par exemple avec un position:relative;left:-5000px) pour que les images se chargent. Si le contenu est masqué (en visibility:hidden ou display:none), à priori les images ne se chargeront pas. Ou bien tu peux masquer le contenu en JS après en avoir fait une copie, récupérer les sources des images, précharger les images, puis afficher le contenu (pas forcément dans cet ordre pour que ça marche). Déjà, ça commence à être pas évident. Et avant d'afficher le contenu, il va falloir surveiller le chargement des images (jQuery propose la méthode load() qui peut aider.) Bref, c'est du boulot et ça demande une bonne maitrise des bases de JavaScript et/ou jQuery (notons qu'apprendre les bases de jQuery sans connaitre celles de JavaScript, ben c'est pas recommandé).
- Si tu veux n'afficher le contenu que si sa mise en forme est complète, images d'arrières-plans CSS compris, ça risque d'être difficile. Je ne connais pas de moyen en JavaScript de vérifier que le navigateur a bien chargé une image utilisée en background CSS. C'est peut-être possible.

nlex a écrit :
En tout cas moi je trouve cet effet très bien Smiley smile

<troll> Libre à toi d'avoir des gouts douteux. Smiley smile </troll>
Plus sérieusement, c'est à juger au cas par cas. Les critères pour juger de l'intérêt d'un effet d'animation doivent être esthétiques et ergonomiques. L'esthétique, c'est assez subjectif, et je pense que les critères ergonomiques devraient prendre le pas dans la plupart des cas. La question à se poser pour un effet d'animation est: quel est le message transmis? Un effet d'animation au survol d'un élément indique un élément cliquable ou actif (affordance). Un effet de fade-in peut indiquer le changement ou la mise à jour d'un contenu... mais s'il est doublé par une indication de changement de page (page blanche, barre de progression du navigateur...), il peut faire doublon et amener l'utilisateur à se demander ce qu'il s'est passé «en plus» et sur quoi on veut attirer son attention. À manier avec prudence, donc.
Modifié par Florent V. (12 Nov 2009 - 12:16)
Ok merci je vais réfléchir à tout ça

PS. En effet je n'ai pas de bases de Javascript Smiley lol

PS2. Ce n'est pas un effet que j'utiliserais sur tout genre de site, mais certains sites (souvent fait en Flash) n'ont pas beaucoup de contenu et jouent plus sur l'aspect 'beau' (pour ne pas dire 'design' ou 'graphique'). Ce sont souvent des sites un peu 'vitrine' (vieux terme !), pas beaucoup de contenu, de mise à jours et d'interactivité… Quelques effets peuvent aider un peu à enrichir le site s'ils sont bien dosés…

PS3. Le site en question est assez minimale et léger : du texte et des GIF (et un peu de PHP pour certaines pages), donc le chargement est rapide, c'est juste qu'un effet qui arrive ne même temps que l'image se charge même si c'est 1/100e se sec. ça fait pas clean.

PS3 Je doute qu'en 3 heures j'y arrive mais ça on est d'accord c'est pas ton problème !