begin process at 2012 05 28 11:04:16
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > LIGHTBOX SANS ONCLICK ET AVEC REDIMENSIONNEMENT

LIGHTBOX SANS ONCLICK ET AVEC REDIMENSIONNEMENT


 Information sur la source

Note :
7,67 / 10 - par 3 personnes
7,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :lightbox, image, gallerie Niveau :Débutant Date de création :07/04/2009 Date de mise à jour :07/04/2009 23:21:47 Vu / téléchargé :6 864 / 888

Auteur : zoby44

Ecrire un message privé
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Bonjour, je sais qu'il en existe quelques une sur ce site mais celle ci a une petite particularité. Pour l'activer, il suffit de mettre l'image dans une balise <a> qui pointe vers cette même image.
J'ai décidé d'utiliser cette technique car j'utilise FCKeditor pour éditer les page de mon site, comme ça, en quelques clics,elle est en place.
Je vous laisse tester.

Source

  • // Taille de l'écran
  • var scrX = document.documentElement.clientWidth;
  • var scrY = document.documentElement.clientHeight;
  • //Couleur de fond
  • var sLayerColor = 'black';
  • //Opacité du fond
  • var sLayerOpacity = 80;
  • //Opacité de l'image
  • var sLayerImage = 100;
  • // Pourcentage de l'image en fonction de l'écran maximum
  • var sMax = 90;
  • function addEvent(obj,event,fct){
  • if(obj.attachEvent)
  • obj.attachEvent('on' + event,fct);
  • else
  • obj.addEventListener(event,fct,true);
  • }
  • // Au chargement
  • window.onload = function () {
  • var sImg = document.getElementsByTagName('img');
  • var n = sImg.length;
  • var sUrl = new Array();
  • // On scan toutes les <img...
  • for (i=0; i<n; i++) {
  • if (sImg[i].src == sImg[i].parentNode) {
  • var obj = sImg[i];
  • obj.id = 'sImg'+i;
  • // On définit l'action pour chaque
  • addEvent(obj,'click',(function (objet){
  • return function() {
  • sLight(objet)
  • };
  • })(obj));
  • // On remplace l'url du liens
  • sImg[i].parentNode.href = '#sImg'+i;
  • }
  • }
  • }
  • function sLight(sUrl) {
  • var sLayer = document.createElement('div');
  • var scY = document.body.offsetHeight;
  • var ofTop = sUrl.offsetTop;
  • //Définition du style du lightbox
  • sLayer.style.backgroundColor = sLayerColor;
  • sLayer.style.width = scrX+'px';
  • sLayer.style.position = 'absolute';
  • sLayer.style.top = '0';
  • sLayer.style.left = '0';
  • sLayer.style.opacity = sLayerOpacity/100;
  • sLayer.style.filter = 'alpha(opacity='+sLayerOpacity+')';
  • if(scrY > scY) {
  • sLayer.style.height = scrY+'px';
  • }
  • else {
  • sLayer.style.height = scY+50+'px';
  • }
  • // Création de l'objet image
  • var sImg = document.createElement('img');
  • sImg.src=sUrl.src;
  • // Taille max de l'image
  • var imgXmax = sMax/100*scrX;
  • var imgYmax = sMax/100*scrY;
  • var sImgX = sImg.width;
  • var sImgY = sImg.height;
  • // Redimmension avec respect des proportions
  • if (imgXmax/imgYmax < sImgX/sImgY) {
  • if (sImgX > imgXmax) {
  • var sCo = sImgX/imgXmax;
  • var sXimg = imgXmax;
  • var sYimg = sImgY/sCo;
  • }
  • else {
  • var sXimg = sImgX;
  • var sYimg = sImgY;
  • }
  • }
  • else {
  • if (sImgY > imgYmax) {
  • var sCo = sImgY/imgYmax;
  • var sXimg = sImgX/sCo;
  • var sYimg = imgYmax;
  • }
  • else {
  • var sXimg = sImgX;
  • var sYimg = sImgY;
  • }
  • }
  • // Mise en position
  • var sLeftImg = (scrX - sXimg)/2;
  • var sTopImg = ((scrY - sYimg)/2) + ofTop;
  • if (sTopImg+sYimg > scY) {
  • sTopImg = scY - (((scrY - sYimg)/2)+sYimg);
  • }
  • sImg.style.position = 'absolute';
  • sImg.style.left = sLeftImg+'px';
  • sImg.style.top = sTopImg+'px';
  • sImg.style.width = sXimg+'px';
  • sImg.style.height = sYimg+'px';
  • sImg.style.opacity = sLayerImage/100;
  • sImg.style.filter = 'alpha(opacity='+sLayerImage+')';
  • // Fonction de fermeture et mise dans le document
  • addEvent(sLayer,'click',function () {sClose(sLayer,sImg)});
  • addEvent(sImg,'click',function () {sClose(sLayer,sImg)});
  • document.body.appendChild(sLayer);
  • document.body.appendChild(sImg);
  • window.scrollbars.visible = false;
  • }
  • // Suppression du lightbox
  • function sClose(sLayer,sImg) {
  • var paImg = sImg.parentNode;
  • paImg.removeChild(sImg);
  • var paSlayer = sLayer.parentNode;
  • paSlayer.removeChild(sLayer);
  • }
// Taille de l'écran
var scrX = document.documentElement.clientWidth;
var scrY = document.documentElement.clientHeight;

//Couleur de fond
var sLayerColor = 'black';
//Opacité du fond
var sLayerOpacity = 80;
//Opacité de l'image 
var sLayerImage = 100;
// Pourcentage de l'image en fonction de l'écran maximum
var sMax = 90;




function addEvent(obj,event,fct){
     if(obj.attachEvent)
        obj.attachEvent('on' + event,fct);
     else
        obj.addEventListener(event,fct,true);
}

// Au chargement
window.onload = function () {

	var sImg = document.getElementsByTagName('img');
	var n = sImg.length;
	var sUrl = new Array();
	// On scan toutes les <img...
	for (i=0; i<n; i++) {
		if (sImg[i].src == sImg[i].parentNode) {
			var obj = sImg[i];
			obj.id = 'sImg'+i;
			// On définit l'action pour chaque
			addEvent(obj,'click',(function (objet){
				return function() {
					sLight(objet)
				};
			})(obj));
		
			// On remplace l'url du liens
			sImg[i].parentNode.href = '#sImg'+i;
		}
	}
}

function sLight(sUrl) {
	var sLayer = document.createElement('div');
	var scY = document.body.offsetHeight;
	
	var ofTop = sUrl.offsetTop;
	
	//Définition du style du lightbox
	sLayer.style.backgroundColor = sLayerColor;
	sLayer.style.width = scrX+'px';
	sLayer.style.position = 'absolute';
	sLayer.style.top = '0';
	sLayer.style.left = '0';
	sLayer.style.opacity = sLayerOpacity/100;
	sLayer.style.filter = 'alpha(opacity='+sLayerOpacity+')';
	
	if(scrY > scY) {
		sLayer.style.height = scrY+'px';
	}
	else {
		sLayer.style.height = scY+50+'px';
	}	
	
	// Création de l'objet image
	var sImg = document.createElement('img');
	sImg.src=sUrl.src;
	
	// Taille max de l'image
	var imgXmax = sMax/100*scrX;
	var imgYmax = sMax/100*scrY;
	
	var sImgX = sImg.width;
	var sImgY = sImg.height;
	
	// Redimmension avec respect des proportions
	if (imgXmax/imgYmax < sImgX/sImgY) {
		if (sImgX > imgXmax) {
			var sCo = sImgX/imgXmax;
			
			var sXimg = imgXmax;
			var sYimg = sImgY/sCo;
		}
		else {
			var sXimg = sImgX;
			var sYimg = sImgY;
		}
	}
	else {
		if (sImgY > imgYmax) {
			var sCo = sImgY/imgYmax;
			
			var sXimg = sImgX/sCo;
			var sYimg = imgYmax;
		}
		else {
			var sXimg = sImgX;
			var sYimg = sImgY;
		}
	}
	
	
	
	// Mise en position
	var sLeftImg = (scrX - sXimg)/2;
	var sTopImg = ((scrY - sYimg)/2) + ofTop;
	
	if (sTopImg+sYimg > scY) {
		sTopImg = scY - (((scrY - sYimg)/2)+sYimg);
	}
	
	sImg.style.position = 'absolute';
	
	sImg.style.left = sLeftImg+'px';
	sImg.style.top = sTopImg+'px';
	sImg.style.width = sXimg+'px';
	sImg.style.height = sYimg+'px';
	
	sImg.style.opacity = sLayerImage/100;
	sImg.style.filter = 'alpha(opacity='+sLayerImage+')';
	

	// Fonction de fermeture et mise dans le document
	addEvent(sLayer,'click',function () {sClose(sLayer,sImg)});
	addEvent(sImg,'click',function () {sClose(sLayer,sImg)});
	document.body.appendChild(sLayer);
	document.body.appendChild(sImg);
	window.scrollbars.visible = false;
}

// Suppression du lightbox
function sClose(sLayer,sImg) {
	var paImg = sImg.parentNode;
	paImg.removeChild(sImg);
	
	var paSlayer = sLayer.parentNode;
	paSlayer.removeChild(sLayer);
}

 Conclusion

Je l'ai testé sous Firefox 3, Ie 6, Ie 8, Chrome et Safari le tout sous XP.

J'espère qu'elle va vous être utile.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

07 avril 2009 23:21:48 :
- Garde le gris sur tout la page - Garde la position de la page

 Sources du même auteur

TRADUCTION DE TEXTE

 Sources de la même categorie

Source avec Zip JDMATH-MINI.JS : GÉNÉRATION D'EXPRESSION MATHÉMATIQUE par jdmcreator
Source avec une capture SPHERE 3D DÉFORMABLE par phm
Source avec Zip Source avec une capture EFFET DE ROTATION A 360° D'IMAGE AVEC ACCELERATION DECELERAT... par kazma
Source avec Zip Source avec une capture PETIT LOGICIEL DE DESSIN, RETOUCHE AVEC CANVAS par kazma
Source avec Zip Source avec une capture CALCULATRICE HEURE par m22001111

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture DIAPORAMA SIMPLE PAR IFRAME par sartoz
Source avec Zip ROTATION D'UNE IMAGE, ANIMATION par william voirol
Source avec Zip IMAGES DÉFILANT SUR UN CYLINDRE (SCROLLING IMAGES) par william voirol
Source avec Zip Source avec une capture CENTRAGE D'IMAGE AVEC PETIT EFFET par kazma
Source avec Zip Source avec une capture LIGHTBOX DIAPORAMA par kazma

Commentaires et avis

Commentaire de jdmcreator le 07/04/2009 14:12:55

Bonjour,

Bravo pour votre source, c'est simple et rapide.

Par contre, au niveau des erreurs de rendus, le fond gris ne prend pas toute la place dans la page. Aussi, peut-être rajouter comme style de position fixed, au cas où la page serait longue et son équivalent javascript pour IE7>

Cordialement,

JDMCreator

Commentaire de zoby44 le 07/04/2009 19:55:00

En effet, il y a quelques bugs. Il a encore d'autre améliorations a faire, par exemple, quand on clic sur  une image qui est en milieu de page, vu que je remplace les liens par des ancres, la page remonte a chaque fois. Pas pratique. En tout cas, merci pour tes remarques. Je vais essayer de corriger ça pour ce soir.

Commentaire de jdmcreator le 07/04/2009 23:03:57

Pour éviter de faire remonter la page, il faut utiliser return false dans le onclick comme onclick="return false;"

Cordialement,

JDMCreator

Commentaire de zoby44 le 07/04/2009 23:25:53

Mais vu que je ne met pas de onclick, je ne sais pas comment faire pour l'ajouter dynamiquement (avec addEvent). Ce que j'ai fait, a la place, c'est mettre un id sur chaque images, et une ancre. Comme ça on garde la page à la position de l'image. C'est toujours mieux que de remonter en haut de la page à chaque fois.

Commentaire de lakichemole le 08/04/2009 14:14:57

Ayant mon debugger javascript activé sous IE6 j'ai un message d'erreur quand je click sur une image "windows.scroball a la valeur null" ligne 133 .
Sinon ça marche bien :)

Commentaire de lakichemole le 08/04/2009 14:15:14 7/10

Et la note :)

Commentaire de XtremDuke le 08/04/2009 16:13:22

Salut,

Je n'ai pas regardé en profondeur ton source mais j'ai cependant relevé quelques ambiguités :


- Comme celà a déjà été remonté, ton layer d'arrière-plan ne peut pas être au bonnes dimensions du viewport.


- Je vois dans le titre "LIGHTBOX SANS ONCLICK" : ok tu vas utiliser le gestionnaire d'évènement JS mais parcontre je vois un "window.onload" ?! Pourquoi ne pas utiliser en profondeur ta fonction "addEvent()" ?


- "sImg.style.filter = 'alpha(opacity='+sLayerImage+')';" rique de provoquer un saut d'humeur dans les débuggers CSS.


- addEvent(obj,'click',(function (objet){
return function() {
sLight(objet)
};
})(obj));

>> tu te compliques la vie, pourquoi ne pas faire tout simplement "addEvent(obj,'click', sLight);" ?


- addEvent(sLayer,'click',function () {sClose(sLayer,sImg)});

>> Attention aux fonctions anonymes qui provoquent des fuites mémoire.

A+

Commentaire de cyrphp le 13/04/2009 16:13:20

Bonjour,

J'ai , a l'occassion adapté un FckEditor pour pour pouvoir faire usage du script lightbox.

Ma demarche fut differente . En effet , j'ai simplement modifié la boite de dialogue qui gere les lien (ainsi qu'une modification/ajout dans le script) et ajouté l'attribut "rel" .

Cela permet d'avoir accés a cet attribut "rel" pour les usages habituels ou pour differents scripts (sans forcement avoir a récrire ceci :) ) .

CyrPhp

Commentaire de Heirem le 13/04/2009 17:59:12 7/10

Bonjour,
Tu as bien fait de mettre cette source dans le niveau débutant.
Ce n'est pas parfait et cela reste à travailler mais je la garde car ce code est vraiment enrichissant et formateur, en particulier en ce qui concerne la gestion des événements js.
Donc merci !

Commentaire de zoby44 le 13/04/2009 18:33:04

Salut. Je voulais d'abord répondre à XtremDuke.

- Pour le window.onload, c'est la seule manière que j'ai trouvé pour lancer le script au chargement sans utiliser de <body onload="...">

- Pour le "sImg.style.filter = 'alpha(opacity='+sLayerImage+')';", j'ai bien penser utiliser un png, mais dans ce cas, il n'y a plus de transparence pour ie6, et ce n'est plus possible de modifier la transparence en changeant la valeur des LayerOpacity, et personnellement, je n'ai eu aucun problème avec les debuggeurs (Firebux et debbugbar pour ie8)

- addEvent(obj,'click',(function (objet){
return function() {
sLight(objet)
};
})(obj));

Il fallait que je remonte l'objet (ou un event). J'ai essayer pleins de méthodes, dont celle que tu donne, mais uniquement celle ci fonctionne (elle ma été donnée sur le forum du siteduzero d'ailleurs, merci à eux).

Mais je suis bien conscient qu'il me reste encore pleins de progrès a faire en JS.

@cyrphp -> J'ai bien pensé à modifier FckEditor, mais dans ce cas, toutes les images s'ouvrent dans un lightbox, je veux pouvoir choisir lesquelles ouvrir. Et à chaque changement de version de fck, il faut remodifier le fichier (enfin je pense).

@Heirem -> Je suis content qu'elle t'ai appris quelque chose.

Commentaire de cyrphp le 13/04/2009 19:01:29

@zoby44

heu non ,  peut-etre n'as tu pas compris ce que j'ai fait :)

dans la boite des propriétés de liens de fckeditor , tu as l'onglet avancé . C'est dans celui-ci que j'ai ajouté au formulaire un champ rel , pour gerer l'attribut rel des liens .
De la , dans l'attribut REL tu y met ce que tu veut (no-follow , external , [lighbox] , etc ... ) Tu applique alors ton lightbox ou tu veut :) .

Ceci dit , ton script est intéressant , ma remarque ne se portait que sur ton approche du problème .

GC

Commentaire de XtremDuke le 15/04/2009 09:18:10

- Pour le window.onload, c'est la seule manière que j'ai trouvé pour lancer le script au chargement sans utiliser de <body onload="...">

>> Tout simplement :
addEvent(window, "load", maFonction);

- Pour le "sImg.style.filter = 'alpha(opacity='+sLayerImage+')';", j'ai bien penser utiliser un png, mais dans ce cas, il n'y a plus de transparence pour ie6...

>> Fait un test juste avant de regler ton opacité :
De manière "barbare" if(document.all) ... else ....

-Il fallait que je remonte l'objet (ou un event)...

>> Ta fonction addEvent te permet de récuperer l'event donc l'objet :
addEvent(obj, "click", clickObjet);

function clickObjet(event){
     if(!event) var event = window.event;
     var monObject = event.target || event.srcElement;
}

Commentaire de gillardg le 20/05/2010 11:10:04 9/10

cool cool cool :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Gallerie perso [ par worstangel ] Salut j'ai un porbl&#232;me avec ce code et vu que je suis pas dou&#233; en javascript j'aimerais bien votre aide ...&lt;head&gt;&lt;script type="java Lightbox positionnement problématique... [ par Hevlaska ] Bonjour tout le monde,Je suis une débutante, qui poursuit un stage avant de commencer l'université. Je ne sais pas trop si je suis au bon endroit mais carousel UI + lightbox... [ par davidcian ] Bonjour,Voila j'ai intégré ces script ajax dans une page, sous firefox ca marche nikel comme d'habitudeMais sous IE ça marche pas... comme d'habitude Retailler div apres chargement image [ par jashugan ] Bonjour, Voilà mon problème, j'ai une lightbox que j'affiche, dans cette lightbox j'ai une image qui se charge. J'ai une fonction javascript qui me Script chargement image aleatoire ET en fondu [ par Giuliano00027 ] Bonjour, Après avoir trouver sur le site un script qui permet d'afficher au chargement de la page l'arrière plan en fondu, j'aimerai maintenant l'adap Chargement d'une image en fondu ET chargement aleatoire [ par Giuliano00027 ] Bonjour, Après avoir trouver sur le site un script qui permet d'afficher au chargement de la page l'arrière plan en fondu, j'aimerai maintenant l'ada Validation d'un formulaire dans une lightbox php / javascipt [ par ben2208 ] bonjour a tous, je bloque sur un code php /javascript. le but est de remplir un formulaire , et de le valider dans une apparition lightbox (ici bu jQuery + onsubmit d'un formulaire [ par harmonyk ] Bonjour à tous, Je me met doucement à jQuery, j'avoue avoir du mal. Actuellement je tente d'afficher un petit formulaire (dans une lightbox) du type p Changement automatique d'image [ par dpechou ] Bonjour, je cherche un script permettant de changer d'image background en fonction: - du navigateur - et ensuite du mois, en effet je veux changer Faire défiler des images avec un délai de 1 seconde [ par mailliam ] Bonjour à tous! Je débute, j'ai récupéré un script pour faire défiler des images toute les secondes. Seulement il faut cliquer sur le bouton suivant,


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 11,294 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales