11499 sujets

JavaScript, DOM et API Web HTML5

Bonjour à la communauté... cela faisait bien longtemps que je n'avais pas réussi à me débrouiller pour m'en sortir avec la mise d'infos qu'on peut trouver sur la toile...

Mais cette fois... suis coincé... je suis même prêt à payer quelqu'un pour trouver une solution...

Le problème :

J'ai un genre de petite galerie photos qui fonctionne dans un élément "canva".

Le problème c'est qu'entre les vignettes et les photos grand format, même compressés au max, j'ai 81 éléments qui totalisent un poids de de 2,3 Mo...

Et ce vilain canva, il précharge tout, ce qui fait que j'ai un temps d'attente trèèèès long avant l'affichage de ma page.

Ma question : quelqu'un sait-il comment faire pour ne pas avoir à précharger ces images ?

(fichier html et js dispos sur demande)


Merci par avance à l'ame charitable qui voudra bien se pencher sur mon problème...


Sébastien.
Pour ne pas précharger les 81 images, c’est très simple il te suffit de mettre en commentaire la ligne qui les charge.
Après le canevas travaille en bitmap donc une fois chargée l’image te prendra toujours 4 octets × le nombre de pixels de l’image quelque soit le taux de compression que tu as obtenu.
Mmmmm... Smiley ohwell merci mais je pense que cela ne colle pas avec mon script que voici :

(j'ai retiré la longue liste des 81 images Smiley smile )



function init() {

canvas = document.getElementById("canvas");
images = images||{};

var manifest = [
{src:"images/_1_MG_6709_pt.jpg", id:"_1_MG_6709_pt"},
{src:"images/_10__MG_6751_gd.jpg", id:"_10__MG_6751_gd"},
{src:"images/_10__MG_6751_pt.jpg", id:"_10__MG_6751_pt"},
{src:"images/_11__MG_6702_gd.jpg", id:"_11__MG_6702_gd"},
{src:"images/_11__MG_6702_pt.jpg", id:"_11__MG_6702_pt"},
{src:"images/_11b__MG_6702sanscadre_pt.jpg", id:"_11b__MG_6702sanscadre_pt"},
{src:"images/_11b__MG_6702sanscadre.jpg", id:"_11b__MG_6702sanscadre"},
{src:"images/_12_MG_6765_pt.jpg", id:"_12_MG_6765_pt"},

];

var loader = new createjs.LoadQueue(false);
loader.addEventListener("fileload", handleFileLoad);
loader.addEventListener("complete", handleComplete);
loader.loadManifest(manifest);

}
Salut !

Ta galerie photo, elle ressemble à quoi ? On peut visualiser toutes les images en miniatures et une image sélectionnée en taille originale ? Ou bien il faut faire défiler les images une par une (en taille originale) pour les découvrir ? (ou autre ?)

En fonction de ta réponse, il pourrait y avoir quelques astuces.
Sinon, pourquoi utiliser canvas pour une galerie photo ? Ça se fait très bien avec le DOM, non ?
Je vais être très honnête, j'ai été longtemps développeur Flash et je dois (non sans douleur) passer au trio infernal html+css+javascript... Pour des choses basiques cela commence à aller plutôt bien, mais je suis loin d'avoir tout digéré pour les projets plus complexes...
Du coup pour cette galerie j'ai utilisé un plug-in dispo pour la dernière version de Flash qui permet (sous condition et pour des projets flash simples) d'exporter le projet en deux fichiers html+css (avec qques librairies) plutôt corrects. J'arrive à les comprendre, mais de là à les modifier c'est autre chose...

Le principe de la galerie est une bande composée de vignettes qui défilent (boucle) au clic et quand on clique sous la vignette centrale, l'image grand format correspondante s'affiche.

Voici l'adresse:
http://www.yeman.fr/CLIENTS/GALERIE/

Je peux envoyer les fichiers .html et .css si besoin...

Merci pour votre aide !! Smiley confused
OK, j'ai vu.

Soit tu abandonnes le canvas et travaille avec le DOM, soit tu continues avec canvas mais là il faut modifier quelque chose.
Si tu continues avec canvas, tu peux soit :
- mettre une sorte de barre de chargement, ou quelque chose comme ça, pour montrer à l'utilisateur qu'il n'attend pas pour rien et que quelque chose va s'afficher (et avec une barre de chargement, 3 ou 4 secondes d'attente, ce n'est plus si long, quoique cela dépend de la vitesse de connexion...).
- Ne charger qu'une partie des images. Au début, tu as environ 5 images affichées, dont une, celle au milieu, qui n'est pas à moitié masquée. Tu peux alors découper ta liste d'images, pour n'en charger que 10 à 20 en premier, et dès que celles-ci sont chargées, alors tu charges le reste. Comme ça, pendant que le visiteur regarde les premières photos, toi tu charges le reste.

Pour l'instant, je n'ai pas d'autres idées ^^"
Apparemment il charge tout avant de lancer la page... du coup si je ne charge que certaones photos (les premières ou toutes les vignettes par exemple), comment et à quel endroit je dois lancer les reste ??? je suis un peu perdu...



Barudar a écrit :
OK, j'ai vu.

Soit tu abandonnes le canvas et travaille avec le DOM, soit tu continues avec canvas mais là il faut modifier quelque chose.
Si tu continues avec canvas, tu peux soit :
- mettre une sorte de barre de chargement, ou quelque chose comme ça, pour montrer à l'utilisateur qu'il n'attend pas pour rien et que quelque chose va s'afficher (et avec une barre de chargement, 3 ou 4 secondes d'attente, ce n'est plus si long, quoique cela dépend de la vitesse de connexion...).
- Ne charger qu'une partie des images. Au début, tu as environ 5 images affichées, dont une, celle au milieu, qui n'est pas à moitié masquée. Tu peux alors découper ta liste d'images, pour n'en charger que 10 à 20 en premier, et dès que celles-ci sont chargées, alors tu charges le reste. Comme ça, pendant que le visiteur regarde les premières photos, toi tu charges le reste.

Pour l'instant, je n'ai pas d'autres idées ^^"
mon client avait vu ailleurs ce système et veut exactement le même, c'est pour ça que la seule solution que j'ai trouvé, ne maitrisant pas bien le JS, etait de passer par Toolkit JS pour Flash CS6




GroquikMLV a écrit :
Oui, en fouillant un peu il doit y avoir moyen de trouver un truc qui ressemble à ce que tu cherches.
Par exemple:
http://codecanyon.net/item/photostore-minimal-carousel/full_screen_preview/241849?ref=themespotters
ou encore:
http://www.jcoverflip.com/demo
Voici une ébauche qui tourne sous firefox22 et qui n’utilise pas canvas. En espérant te mettre le pied à l’étrier.

fichier galerie.html
<!DOCTYPE html>
<html>
<head></head>
	<meta charset="utf-8"/>
	<title>Galerie</title>
	<link href="galerie.css" rel="stylesheet" type="text/css"/>
</head>
<body>
	<div id="galerie">
		<ul id="galerie-liste">
			<li data-titre="titre1" data-sous-titre="sousTitre1" data-src="http://lorempixel.com/647/400/people/1" data-largeur="647" data-hauteur="400"><img alt="image1" id="galerie-miniature1" src="http://lorempixel.com/323/200/people/1"/>
			<li data-titre="titre2" data-sous-titre="sousTitre2" data-src="http://lorempixel.com/647/400/people/2" data-largeur="647" data-hauteur="400"><img alt="image2" id="galerie-miniature2" src="http://lorempixel.com/323/200/people/2"/>
			<li data-titre="titre3" data-sous-titre="sousTitre3" data-src="http://lorempixel.com/647/400/people/3" data-largeur="647" data-hauteur="400"><img alt="image3" id="galerie-miniature3" src="http://lorempixel.com/323/200/people/3"/>
			<li data-titre="titre4" data-sous-titre="sousTitre4" data-src="http://lorempixel.com/647/400/people/4" data-largeur="647" data-hauteur="400"><img alt="image4" id="galerie-miniature4" src="http://lorempixel.com/323/200/people/4"/>
			<li data-titre="titre5" data-sous-titre="sousTitre5" data-src="http://lorempixel.com/647/400/people/5" data-largeur="647" data-hauteur="400"><img alt="image5" id="galerie-miniature5" src="http://lorempixel.com/323/200/people/5"/>
			<li data-titre="titre6" data-sous-titre="sousTitre6" data-src="http://lorempixel.com/248/400/people/6" data-largeur="248" data-hauteur="400"><img alt="image6" id="galerie-miniature6" src="http://lorempixel.com/124/200/people/6"/>
			<li data-titre="titre7" data-sous-titre="sousTitre7" data-src="http://lorempixel.com/647/400/people/7" data-largeur="647" data-hauteur="400"><img alt="image7" id="galerie-miniature7" src="http://lorempixel.com/323/200/people/7"/>
		</ul>
	</div>
	<script type="text/javascript" src="galerie.js"></script>
	<noscript>
		<div class="cache_ecran">
		</div>
		<div id="message">
			<p>Pour profiter de toutes les fonctionnalités du site, veuillez activer le javascript.
			<a href="http://www.maboite.qc.ca/activation_js.php">Com­ment ac­ti­ver le ja­vas­cript<span class="quart_de_cadratin">&nbsp;</span>?</a></p>
			<br/>
		</div>
	</noscript>
</body>
</html>


fichier galerie.js
/*jslint browser: true */
var imageActive = 1, tabImages = [], TITRE = 0, SOUS_TITRE = 1, SRC = 2, LARGEUR = 3, HAUTEUR = 4;

/**
 * À partir d’un obj récupère les valeurs de ses attributs commençant par data- et les mets dans un tableau
 * 
 * @param obj objet HTML
 * @param tabEtiquettes tableau de chaînes de caractères. Si on veut récupérer les attributs data-prenom et data-nom on passera le tableau ["prenom", "nom"]
 * @return tableau de chaînes de caractères. Retourne la valeur des différents attributs data-*
 */
function recupererData(obj, tabEtiquettes) {
    "use strict";
    var ii, j, booRecherche, res = [];
    for (ii = 0; ii < obj.attributes.length; ii += 1) {
        // L’attribut courant d’obj est-il un attribut recherché ?
        booRecherche = false;
        for (j = 0; j < tabEtiquettes.length; j += 1) {
            if (obj.attributes[ ii ].nodeName === "data-" + tabEtiquettes[j]) {
                booRecherche = true;
                break;
            }
        }
        if (booRecherche) {
            res[j] = obj.attributes[ ii ].nodeValue;
        }
    }
    return res;
}

/**
 * Retourne la largeur de l’icône de l’image n
 * 
 * @param n entier positif
 * @param flottant positif
 */
function largeurIcone(n) {
    "use strict";
    return tabImages[n - 1][LARGEUR] * 200 / tabImages[n - 1][HAUTEUR];
}

/**
 * Retourne une image par rapport à l’image courante
 * 
 * @param imageCourante entier
 * @param liste objet HTML
 * @param n entier 0 retourne l’image active 1=image suivante -1=image précédente
 * @return objet HTML
 */
function retourneImage(imageCourante, liste, n) {
    "use strict";
    return ((imageCourante - 1) + n + liste.childNodes.length - 1) % (liste.childNodes.length - 1) + 1;
}

/**
 * Positionne et affiche la nième miniature
 * 
 * @param n entier
 * @param pos entier
 * @param droiteGauche vaut "left" ou "right"
 */
function afficherEtPlacer(n, pos, droiteGauche) {
    "use strict";
    if (droiteGauche === "left") {
        document.getElementById("galerie-miniature" + n).style.left = Math.round(pos, 0) + "px";
        document.getElementById("galerie-miniature" + n).style.right = "auto";
        document.getElementById("galerie-miniature" + n).style.display = "block";
    } else {
        afficherEtPlacer(n, 1100 - pos - largeurIcone(n), "left");
    }
}

/**
 * Initialisation de la galerie
 * 
 * @param booPremiere booléen vrai si premier passage
 */
function initialisation(booPremiere) {
    "use strict";
    var liste, galerie = document.getElementById("galerie"), ii, position, n;
    liste = document.getElementById("galerie-liste");

    if (booPremiere) {
        // On rajoute le titre le cache blanc avant et arrière et le sous-titre
        galerie.innerHTML = "<div id='miniatures'><div id='galerie-titre'></div><div id='galerie-cache-avant'></div>" + galerie.innerHTML + "<div id='galerie-cache-apres'></div><div id='galerie-precedent' onclick='imagePrecedente()'>&#8592;</div><div id='galerie-plus' onclick='agrandirImage()'>+</div><div id='galerie-suivant' onclick='imageSuivante()'>&#8594;</div><div id='galerie-sous-titre'></div></div><div id='grandFormat'><img id='imageGrandFormat'/><div id='fermer' onclick='fermer()'>×</div></div>";
    }

    // On cache les miniatures
    for (ii = 1; ii < liste.childNodes.length; ii += 1) {
        document.getElementById("galerie-miniature" + ii).style.display = "none";
    }

    // On récupère les données dans tabImages. Chaque ligne de tabImages représente une image sous forme de tableau dont l’élément 0 est la valeur de l’attribut data-titre l’élément 1 l’attribut data-sous-titre etc…
    for (ii = 1; ii < liste.childNodes.length; ii += 1) {
        tabImages[ii - 1] = recupererData(liste.childNodes[ ii ], ["titre", "sous-titre", "src", "largeur", "hauteur"]);
    }

    // On définit la position des caches avant et après
    document.getElementById("galerie-cache-avant").style.right = Math.round((1100 + largeurIcone(imageActive)) / 2, 0) + "px";
    document.getElementById("galerie-cache-apres").style.left  = document.getElementById("galerie-cache-avant").style.right;

    // Position de l’image active
    afficherEtPlacer(retourneImage(imageActive, liste, 0), (1100 - largeurIcone(imageActive)) / 2, "left");

    // Titre et sous-titre
    document.getElementById("galerie-titre").innerHTML = tabImages[imageActive - 1][TITRE];
    document.getElementById("galerie-sous-titre").innerHTML = tabImages[imageActive - 1][SOUS_TITRE];

    // Position images précédentes
    position = (1100 + largeurIcone(imageActive)) / 2;
    n = 1;
    while (position < 1100) {
        afficherEtPlacer(retourneImage(imageActive, liste, -n), position, "right");
        position += largeurIcone(retourneImage(imageActive, liste, -n));
        n += 1;
    }
    // Position images précédentes
    position = (1100 + largeurIcone(imageActive)) / 2;
    n = 1;
    while (position < 1100) {
        afficherEtPlacer(retourneImage(imageActive, liste, n), position, "left");
        position += largeurIcone(retourneImage(imageActive, liste, n));
        n += 1;
    }
}

function imageSuivante() {
    "use strict";
    imageActive = imageActive % tabImages.length + 1;
    initialisation(false);
}

function imagePrecedente() {
    "use strict";
    imageActive = (imageActive + tabImages.length - 2) % tabImages.length + 1;
    initialisation(false);
}

function agrandirImage() {
    "use strict";
    document.getElementById("miniatures").style.display = "none";
    document.getElementById("imageGrandFormat").src = tabImages[imageActive - 1][SRC];
    document.getElementById("imageGrandFormat").style.width = tabImages[imageActive - 1][LARGEUR];
    document.getElementById("grandFormat").style.display = "block";
}

function fermer() {
    "use strict";
    document.getElementById("grandFormat").style.display = "none";
    document.getElementById("miniatures").style.display = "block";
}

window.onload = function () {
    "use strict";
    initialisation(true);
};


fichier galerie.css
body {
	background:#d4d4d4
}

#galerie {
	background:white;
	height:600px;
	overflow:hidden;
	position:absolute;
	width:1100px
}

#galerie ul, #galerie-cache-avant, #galerie-cache-apres {
	position:absolute;
	top:200px;
	height:200px;
	margin:0;
	-moz-padding-start:0
}

#galerie ul li {
	float:left;
	list-style-type:none;
	width:1100px
}

#galerie ul img {
	height:200px;
	position:absolute
}

#galerie-cache-avant {
	left:0
}

#galerie-cache-apres {
	right:0
}

#galerie img {
	height:400px
}

#galerie-cache-avant, #galerie-cache-apres {
	background:rgba(255, 255, 255, 0.75);
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#c0ffffff,endColorstr=#c0ffffff); /* hack pour ie */
	z-index:1
}

#galerie-precedent, #galerie-suivant, #galerie-plus, #fermer {
	cursor:pointer;
	position:absolute;
	top:420px;
	height:20px;
	width:20px;
}

#galerie-precedent {
	left:0
}

#galerie-suivant {
	right:0
}

#galerie-plus, #fermer {
	left:525px
}

#galerie-titre, #galerie-sous-titre {
	position:absolute;
	text-align:center;
	width:1100px
}

#galerie-titre {
	top:50px
}

#galerie-sous-titre {
	top:500px
}

#galerie img, #galerie-cache-avant, #galerie-cache-apres {
	transition-property:left, right;
	transition-duration:0.5s
}

#grandFormat, #galerie ul img {
	display:none
}

#imageGrandFormat {
	margin:auto
}

#grandFormat {
	text-align:center
}


Je n’aurai pas dû utiliser la colorisation syntaxique. Tous les [ i ] ont été pris pour de l’italique, j’ai alors remplacé les i par des ii et là il me met des smyleys partout. Faites quelque chose chez alsa, s’il vous plaît c’est à peine pénible.
Modifié par adrien881 (05 Jul 2013 - 18:16)