11540 sujets

JavaScript, DOM et API Web HTML5

Bonjour à toutes et tous

Je lis le forum depuis que j'ai été formée sur x-html et CSS2 l'année dernière, en 3 jours. Cela m'a été très utile, et je remercie tous les contributeurs. (Jusqu'à présent je n'avais pas l'impression de pouvoir être utile à qui que ce soit, étant débutante)

Cependant, cette fois la recherche dans les posts précédents ne m'aide pas. Je fais un site pour un ami artiste. Je l'ai codé en utilisant seulement HTML et CSS. Je travaille avec Notepad++

Mon ami souhaite avoir une galerie photo dans l'une des pages, de façon à pouvoir visualiser des images, triées par séries. Il a une idée précise de ce qu'il souhaite, et les galeries type flash ou simpleviewer ne lui conviennent pas. J'ai trouvé le tutoriel "Galerie Photo avec Javascript" d'Olivier, qui est vraiment super.
(http://www.alsacreations.com/tuto/lire/557-galerie-photo-javascript.html) J'ai pu l'adapter aux besoins de mon ami, et à la charte graphique que j'ai mis en place. Par exemple, j'ai enlevé les titres.

J'ai 3 problèmes, qui n'en feront sans doute qu'un pour les professionnels. J'intègre les bouts de code concernés à la fin de mon post, j'espère qu'ils ne seront pas trop longs, car je n'ai pas le début d'une idée d'où je me suis trompée.

1- le clic sur une miniature ouvre une nouvelle fenêtre au lieu d'ouvrir la photo dans l'espace réservé à cet effet. Je suppose que j'ai du changer un truc en trop dans le code javascript, là où est l'instruction "inhiber l'action réelle du lien".

2- les miniatures s'étalent sur 2 rangs alors qu'il n'en faudrait qu'un, d'autant qu'il y aura sans doute une quinzaine d'images dans chaque série. J'ai essayé de forcer les choses avec CSS, avec max-height dans le div de la mini galerie, mais ça ne marche pas.

3- J'aimerais beaucoup ajouter deux flèches de chaque côté de la mini galerie de miniatures pour pouvoir naviguer dans les miniatures. J'imagine qu'il faut créer une nouvelle fonction Javascript en intégrant deux images fixes pour les flèches, mais j'en suis rigoureusement incapable. j'ai essayé avec overflow:scroll; mais ça ne marche pas. (j'imagine votre sourire) Auriez-vous une idée?

Ci dessous les bouts de code, si quelqu'un a le temps de le lire et de regarder où je me suis trompée pour les problèmes 1 et 2...

Le script appelé: je mets tout car je n'y comprends vraiment pas grand chose.
function displayPics()

{
  var photos = document.getElementById('galerie_mini') ;
  // On récupère l'élément ayant pour id galerie_mini
  var liens = photos.getElementsByTagName('a') ;
  // On récupère dans une variable tous les liens contenu dans galerie_mini
  var big_photo = document.getElementById('gde-img') ;
  // Ici c'est l'élément ayant pour id big_pict qui est récupéré, c'est notre photo en taille normale

  var titre_photo = document.getElementById('photo').getElementsByTagName('dt')[0] ;
  // Et enfin le titre de la photo de taille normale
  // Une boucle parcourant l'ensemble des liens contenu dans galerie_mini
  for (var i = 0 ; i < liens.length ; ++i) {
    // Au clique sur ces liens 
    liens[i].onclick = function() {
      big_photo.src = this.href; // On change l'attribut src de l'image en le remplaçant par la valeur du lien
      big_photo.alt = this.title; // On change son titre
      titre_photo.firstChild.nodeValue = this.title; // On change le texte de titre de la photo
      return false; // Et pour finir on inhibe l'action réelle du lien
    };
  }
}



le header HTML de la galerie:
<head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso8859-1"/>
		<title>Xavier Daniel - Esprit(s Sentinelle</title>
		<link rel="stylesheet" media="screen" type="text/css" href="css/styles.css"/>
		<script type="text/javascript" src="script.js"></script>
	</head>
	
	<body window.onload=displayPics;>
		<div id="page">
etc.

puis dans le corps de la page:

<div id="galerie">	
		
	<dl id="photo">
	<dd><img id="gde-img" src="image/galerie/insitu/7.png" alt="Photo 7 en taille normale" /></dd>
	</dl>
					
	<ul id="galerie_mini">
	<li>
	<a href="image/galerie/insitu/1.png" title="Titre de la photo 1"><img src="image/galerie/insitu/minis/m1.png" alt="Le titre de la photo 1" /></a>
	</li>					
	<li>
	<a href="image/galerie/insitu/2.png" title="Titre de la photo 2"><img src="image/galerie/insitu/minis/m2.png" alt="Le titre de la photo 2" /></a>
	</li>


Etc., je vous épargne la liste des images dans la mini galerie!

puis le code CSS gérant la galerie:

div#galerie{
	float:right;
	width:673px ;
	background:#BAB4A3;
	margin-left:3px;
	margin:0px;
	text-align:center ;
	font:60% arial "sans-serif" ;
	min-height:480px;
	max-height:480px;
}

dl#photo{
	text-align: left ;
	margin: 0 auto ;
	min-height:483px;
}

dl#photo dd{
	margin:0;
}

dl#photo img{
	max-height:480px;
	max-width:673px;
}

ul#galerie_mini{
	margin:0;
	padding:0;
	list-style-type:none;
	border:1px solid #BAB4A3;
	min-height:50px;
}

ul#galerie_mini li{
	float:left ;
}

ul#galerie_mini li a img{
	margin:0px ;
	max-height:50px;
	/* les deux lignes suivantes ramènent les miniatures à une ligne si il y a peu d'images mais pas efficace si plus de 10 images
	min-height:50px;
	max-width:50px;*/
}
/*fin page in situ*/


Voilà, je vous remercie d'avance, et j'espère avoir respecté les règles du forum.
Bonne journée!
Valérie Smiley smile [/i]
Salut,

Pour le 1 (Je ne crois pas que c'est la meilleur chose qu'on puisse adopté comme concept, une popin est meilleure dans ce cas, au lieu d'ouvrir une nouvelle fenêtre), tu n'as qu'à mettre un target="_blank" comme attribut pour les liens contenant tes imagettes, et annuler ton code js en le commentant ou le supprimant.

Pour 2 et trois, tu as besoin d'un carrousel il y en a assez sur le net, sincèrement je ne travailles plus avce javascript depuis quelques années et ça en faveur de Jquery, alors je ne suis pas sûr mais tu trouveras surement un plugin qui te va sur internet.

Alors à ta place moi j'aurais fait recours à ça:
C est avec ce carousel que je travaille souvent
en combinaison avec:
la popin, regardes image gallery

Bonne courage
Modifié par unami (13 Dec 2012 - 17:30)
Merci beaucoup!
je me plonge dedans!

L'artiste ne veut pas de popin parce qu'il a peur de se faire voler ses images si elles sont affichées en trop grand.
Mais il suffit sans doute pour cela que j'apprenne comment faire pour inhiber le clic enregistrer sous...

Je vais explorer tout ça, merci encore l'ami! Smiley biggrin

Bonne journée!
Valérie
bon j'aurais mieux fait de regarder avant de parler.
ça parait peu logique en effet de vouloir diffuser et restreindre en même temps sur internet...

Je vais essayer de convaincre l'artiste...
Re-bonjour
Je ne suis pas loin de me décourager, je cherche et cherche depuis à peu près 5h non stop, et je n'arrive à pas grand chose; comme me l'a conseillé Unami, j'ai inséré le carrousel "bxslider"

http://bxslider.com/examples/thumbnail-pager-1

J'ai tout télécharger, dézippé, copier les .js et .css et changé les chemins, ajouté ce qu'il faut dans la balise head

et en effet la galerie est accessible. Au clic sur une miniature l'image s'affiche là où elle le doit (merveilleux, merci Unami!)

Mais:

1- dès qu'une photo est verticale, la hauteur du div se transforme pour qu'il puisse l'accueillir en entier, c'est à dire 1113 px, alors qu'il ne faudrait que 480px.
2- les flèches de contrôle n'apparaissent pas, je ne comprends vraiment plus rien.
3-une fois de plus je me retrouve avec deux rangs de miniatures
voilà ce que ça donne:
upload/47419-imprim-ecr.jpg
upload/47419-capture-ec.jpg

J'ai beau chercher dans la feuille de style CSS de bxslider, ça ne change rien. Je ne vois pas où je dois mettre un max-height:480px;
J'ai essayé de changer plein de choses avec firebug, mais rien ne marche. Une idée quelqu'un?
Croyez-vous que je m'attaque à trop gros pour moi, avec mon petit niveau de débutante?

Je crois que je vais passer à d'autres pages du site, le temps de me calmer Smiley confus

Bonne journée tout le monde!
Valérie
Modifié par valabella (14 Dec 2012 - 13:10)
Salut,

D'abord
a écrit :
ça parait peu logique en effet de vouloir diffuser et restreindre en même temps sur internet...
tu as bien répondu à toi même Smiley smile alors vaut mieux réfléchir à la popin, c'est toujours meilleure.

Toute fois je crois que soit tu es instable envers ton choix de conception, soit tu ne nous a pas mentionné ce que finalement tu voudrais faire, car le lien que je t'ai fourni pour le bxslider est différent du concept que tu as choisi, le bxslider contient beaucoup de choses, comme le carousel le slideShow, et aussi une galeri d'image ordinaire et c'est ce que tu as choisi différemment à ce que tu as déclaré vouloir faire. Pour les carousel, il gère deux principaux aspects:
Static ici et dynamic ici et les deux te convient. Celui que tu as choisi est comme simpleViewer et je crois que tu as déjà mentionné que tu ne le voulais pas.

Et bien sur l'affichage est complètement Personnalisable, et le plugin contient assez d'option qui te permets de modeler le résultat comme tu le souhaites. Et si tu respects cette approche, tu auras une seule ligne de miniatures avec des petits buttons pour naviguer entre les rangés de tes miniatures selon la config.

Je t'ai aussi si tu voudrais faire usage à la popin la fancybox, qui est jolie et donne un bon résultat.

Mets nous au courant de ce que tu as faits et ce que tu voudrais faire, et nous verrons comment nous pouvons t'aider.
Bonsoir (et oui à La Réunion c'est le soir)

En effet j'ai dévié du lien que tu m'as envoyé, parce que carousel "static number of slides" ne convient pas. Il me faut une solution où une seule image apparaît en grand mais reste confinée dans un rectangle de 480px X 673px tandis qu'en dessous apparaît un rang de thumbnails organisées comme suit : <123456789>

le "thumbnail pager method 1" me semblait répondre à ce besoin. Mais j'ai beaucoup de mal à l'adapter.
J'ai ajouté le mode fade dans le script intégré dans le html, comme ceci :
	
	<div id="galerie">
			<script type="text/javascript">
			$(document).ready(function(){
			$('.bxslider').bxSlider({
			mode:'fade',
			  pagerCustom: '#bx-pager'
			});
			});
			</script>
			
		<ul class="bxslider">
			<li><img src="image/galerie/insitu/1.png" title="1" /></li>
			<li><img src="image/galerie/insitu/2.png" title="2" /></li>
			<li><img src="image/galerie/insitu/3.png" title="3" /></li>
			<li><img src="image/galerie/insitu/4.png" title="4" /></li>
			<li><img src="image/galerie/insitu/5.png" title="5" /></li>
			<li><img src="image/galerie/insitu/6.png" title="6" /></li>
		</ul>
			

		<div id="bx-pager">
	<a data-slide-index="0" href=""><img src="image/galerie/insitu/minis/m1.png" /></a>
	<a data-slide-index="1" href=""><img src="image/galerie/insitu/minis/m2.png" /></a>
	<a data-slide-index="2" href=""><img src="image/galerie/insitu/minis/m3.png" /></a>
	<a data-slide-index="3" href=""><img src="image/galerie/insitu/minis/m4.png" /></a>
	<a data-slide-index="4" href=""><img src="image/galerie/insitu/minis/m5.png" /></a>
	<a data-slide-index="5" href=""><img src="image/galerie/insitu/minis/m6.png" /></a>
		</div>							
				
	</div>			



Pour la popin je pensais qu'il fallait que la galerie fonctionne d'abord, et j'aurais ajouté fancybox après, par dessus si l'on peut dire (et après avoir eu l'accord de mon ami artiste, c'est son site, quand même Smiley smile )

tout ça me dépasse un peu (beaucoup), j'en ai peur.
Je crains d'avoir mal placé les scripts et plugins : je les ai mis à la racine, et j'ai adapté les balises link et script dans la balise head en fonction.

Pourrais-tu m'indiquer dans quel code je dois adapter quelque chose pour limiter la taille de la grande image? (lequel parmi tous les .js? ou celui en CSS? voire au niveau du html?)
Et de même pour limiter le nombre de thumbnails affichés et faire apparaitre les controles pour pouvoir naviguer parmi eux, dans quelle partie de code dois-je chercher?

A moins que mon choix de méthode te paraisse absurde?

Merci pour ton aide!
Salut,

Qu'est ce que tu voudrais dire par thumbnails, car ce dernier veut dire miniature et ton comme suit: <123... s'appelle une pagination, logiquement un sliderShow avec une carousel en desous et en plus dans un prochain temps une popin !!. Tu veux dire une pagination ? si non il n'y a pas de logique dans ce que tu voudrais faire. Et si je ne t'ai pas compris, fournis nous un petit dessin
En effet, un dessin vaut mieux que toutes les explications Smiley lol

voici un dessin, sous photoshop, à partir d'une capture d'écran du site tel qu'il était avant bxslider et en imaginant que les problèmes cités dans mon premier message soient résolus.

avec une image horizontale et panoramique
upload/47419-galeriehor.jpg

avec une image verticale
upload/47419-galeriever.jpg

Comme tu le vois, mes "123" figuraient les miniatures N°1, 2, 3 etc. J'ai très mal expliqué, désolée.

Il faudrait que je puisse mettre le site sur un serveur, ça serait quand même plus simple. Je vais demander à l'artiste les codes de son serveur, qu'il a déjà.

Bonne journée! J'envoie un peu de soleil à tout le monde!
Valérie
Salut,

Alors comme je l'ai déjà dit tu dois faire recours à la carousel soit dynamic ou static et à tu dois après faire une petite personnalisation du genre que tu as dans le tuto sur lequel tu as travaillé:

Alors premièrement je vais supposer que tu as bien mis ton header en place, le fichier des styles du Bxslider et après le script jquery suivi du script bxslider.
Et je supposerai aussi que la structure html qui affiche l'image en grand, est comme suit:
<div id="galleryImg">
			<img src="img/hello.jpg" alt=""/>
		</div>

Et à toi de lui mettre la mise en forme souhaitée à l'aide du css.

Alors premièrement tu dois suivre les indications qu'ils t'ont défini, afin d'aboutir à une carousel dynamic ou static selon ton désire. N'oublies pas de mettre tes <img> dans des <a> comme dans le tuto que tu as vu,Tu personnalises l'affichage de ton carousel à l'aide du fichier css fourni avec le pack bxslider, tes buttons de navigation portent les classes .bx-prev et .bx-next, utilises firebug pour savoir la structure dont bxslider les poses par défaut, et à toi de les modeler comme tu le souhaites.
<ul class="bxslider">
	<li><a href="path_to_big_img"><img src="image/galerie/insitu/1.png" alt="titre de l'image 1" /></a></li>
	<li><a href="path_to_big_img"><img src="image/galerie/insitu/2.png" alt="titre de l'image 2" /></li>
...

Cela pour faire fonctionner la carousel et avoir l'affichage désiré.

Rq: J'ai remarqué que pour tes miniatures tu as mis des widths différents et ce n'est pas possible dans ce genre de concept de le gérer, il va falloir définir la même taille, il y a une exception possible dans ce cas mais je ne te conseille pas de te casser la tête avec maintenant. Mets tes miniatures de la même taille et au clic sur une d'eux tu affiches l'imagette comme tu le souhaites et avec les vraies proportions dans ton conteneur en haut.

Après nous devons au clic sur une des imagettes (Normalement la balise <a> qui la contient) faire afficher son image dans notre grand bloc nommé ici: #galleryImg, mais n'oublie pas de faire afficher ta première image par défaut au chargement de ta page.
$(function(){ //Ready
	$('.bxslider').on('click','li a',function(){
		var simg=$('img',this); //this ici fait référence à 'a'
		var bimg=$('#galleryImg img');
		//Nous récupérons le path de la grande image du href de notre <a>
		//Aussi nous récupérons le alt de l'imagette pour le mettre à la grande.
		bimg.attr({src: this.attr('href'), alt: simg.attr('alt')});
		return false;
	});
});


Cela va te permettre de créer ton carousel et au clic sur une imagette, cette dernière s'affiche dans ton conteneur.

Il y a d'autre façon pour faire afficher ta grande image, dans cette exemple expliqué en dessus nous appelons la grande image au clic sur une imagette, alors nous économisons un peu le temps de chargement de la page ... , il y a aussi celle que bxsliderGallery utilise, qui est de charger toutes tes images au démarrage et nous faisons recours aux indexs des images pour savoir laquelle nous devons affichée, son défaut est que si tu as assez d'images le chargement pourras être très lourd, par suite énerver tes visiteurs qui puissent quitter ton site comme réaction Smiley bawling . Mais celle là est très avantageuse si tu n'as pas beaucoup d'images.

Alors selon ton cas tu te décides et on verra si tu voudrais la 2 ème approche, nous te mettrons des pistes pour la mettre en place.

Toute fois pour ta question, pour limiter la taille de l'image à la taille de son conteneur (480X763), tu les mets comme max-width et max-height pour ton image (les deux), mais si tu es intéressée par IE6 tu dois l'aider avec une petit hack JS pour mettre ce fonctionnement en place car, il ne reconnait pas le max-height et max-width.

Bonne courage
Ouah, super, merci beaucoup pour cette réponse très détaillée. Je dois reprendre mon boulot de bureau du lundi au mercredi, je ne pourrai essayer tout ce que tu me décris que jeudi. Ou peut être ce soir. Merci, en tout cas, et je vous tiendrai au courant!

Bonne journée, bonne semaine, et joyeuses fêtes!
Valérie Smiley biggrin
Bonjour,
Pour clore le sujet:
Après des heures de tentatives infructueuses, et pressée par la nécessité d'avancer, j'ai finalement fait appel à un ami que j'ai rémunéré pour adapter une galerie javascript. On n'a encore rien trouvé de mieux que de laisser faire ceux qui savent... Je réessaierai sans doute avec tes conseils, Unami, quand je créerai mon site internet de photographe...

Merci pour ton aide!

Le site sera en ligne cette semaine ou la semaine d'après, nous sommes en train de le remplir... je reviendrai mettre l'adresse pour que tu puisses voir le résultat final.

Merci encore, et bonne continuation!
Valérie