Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CRÉER UN REFLET D'UNE IMAGE


Information sur la source

Catégorie :Graphique Classé sous : image, reflet, renverseur Niveau : Débutant Date de création : 08/06/2008 Date de mise à jour : 11/06/2008 17:47:49 Vu / téléchargé: 6 060 / 397

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Ce petit script permet de créer un reflet sous n'importe quelle image.
Le principe est assez simple, pour 'renverser' l'image il faut créer autant de div que nécessaire de 1px de haut et d'image de fond celle dont on veut faire le reflet. Ensuite l'astuce c'est de placer l'image de fond dans le div (avec background-position) de façon à renverser l'image.
Si vous voulez tester tout de suite allez ici : http://sd-1.archive-host.com/membres/up/70845355/ (l'image d'exemple est le logo de javascriptfr.com ;))
Par contre il peut avoir des petits problèmes d'affichage si vous passez d'une grande image à une petite (les dimensions ne sont pas mises à jour) dans ce cas il suffit de recliquer sur 'Afficher'.
Cet exemple a été testé sous Firefox 3, IE 7, Safari 3 et Opera 9. (sous IE 8 il y a un problème de transparence, mais en même temps cette version a encore pas mal de chemin en ce qui concerne le support du javascript d'après ce que j'ai pu voir...)
 

Source

  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
  • <head>
  • <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
  • <script type="text/javascript">
  • <!--
  • function reflect(div, max, intensity, margin, url) {
  • div.childNodes[0].src = url;
  • var width = div.childNodes[0].offsetWidth;
  • var height = div.childNodes[0].offsetHeight;
  • max = height * max / 100;
  • intensity /= 100;
  • div.childNodes[0].style.marginBottom = margin + 'px';
  • var lines = document.createElement('div');
  • lines.id = 'lines';
  • div.appendChild(lines);
  • for (var i = max; i > 0; i -= 1) {
  • var line = document.createElement('div');
  • line.style.width = width + 'px';
  • line.style.height = '1px';
  • line.style.backgroundImage = 'url(' + div.childNodes[0].src + ')';
  • line.style.backgroundPosition = '0px ' + (1 - i + max) + 'px';
  • if (line.style.opacity != undefined) {
  • line.style.opacity = i / max * intensity;
  • } else {
  • line.style.filter = 'alpha(opacity=' + i / max * 100 * intensity + ')';
  • }
  • lines.appendChild(line);
  • }
  • }
  • function clearLines(div) {
  • if (document.getElementById('lines')) {
  • div.removeChild(document.getElementById('lines'));
  • }
  • }
  • -->
  • </script>
  • <style type="text/css">
  • body {
  • background-color:#C0C0C0;
  • font-family:verdana, arial;
  • font-size:11px;
  • color:#333333;
  • cursor:default;
  • text-align:center;
  • }
  • img {
  • display:block;
  • }
  • p {
  • margin:3px;
  • }
  • form {
  • margin:0px;
  • }
  • input {
  • border:solid 1px #333333;
  • padding:3px;
  • background-color:#C8C8C8;
  • margin-top:2px;
  • text-align:center;
  • }
  • table {
  • margin:auto;
  • border:solid 1px #333333;
  • background-color:#909090;
  • }
  • th {
  • background-color:#DDDDDD;
  • padding:3px;
  • border:solid 1px #333333;
  • }
  • tr {
  • vertical-align:top;
  • }
  • td {
  • padding:3px;
  • border:solid 1px #333333;
  • background-color:#A3A3A3;
  • }
  • </style>
  • <title>Reflet</title>
  • </head>
  • <body>
  • <table>
  • <tr>
  • <th>Paramètres</th>
  • <th>Résultat</th>
  • </tr>
  • <tr>
  • <td>
  • <form method="post" action="javascript:;">
  • <p>
  • Hauteur du reflet (en %)<br/>
  • <input type="text" id="h" value="35"/><br/><br/>
  • Intensité du reflet (en %)<br/>
  • <input type="text" id="i" value="60"/><br/><br/>
  • Marge (en pixels)<br/>
  • <input type="text" id="m" value="2"/><br/><br/>
  • URL de l'image<br/>
  • <input type="text" id="url" value="http://www.javascriptfr.com/g/v9logo/logojs.gif"/><br/><br/>
  • <input type="submit" value="Afficher" onclick="clearLines(document.getElementById('div')); reflect(document.getElementById('div'), parseInt(document.getElementById('h').value), parseInt(document.getElementById('i').value), parseInt(document.getElementById('m').value), document.getElementById('url').value)"/>
  • <input type="reset" value="Reset" onclick="clearLines(document.getElementById('div')); document.getElementById('div').childNodes[0].src = 'http://www.javascriptfr.com/g/v9logo/logojs.gif';"/>
  • </p>
  • </form>
  • </td>
  • <td>
  • <div id="div"><img src="http://www.javascriptfr.com/g/v9logo/logojs.gif" alt=""/></div>
  • </td>
  • </tr>
  • <tr>
  • <th colspan="2">Script javascript libre d'utilisation crée par mcc</th>
  • </tr>
  • </table>
  • </body>
  • </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/>
		<script type="text/javascript">
		<!--
			function reflect(div, max, intensity, margin, url) {
				div.childNodes[0].src = url;
				var width = div.childNodes[0].offsetWidth;
				var height = div.childNodes[0].offsetHeight;
				max = height * max / 100;
				intensity /= 100;
				div.childNodes[0].style.marginBottom = margin + 'px';
				var lines = document.createElement('div');
				lines.id = 'lines';
				div.appendChild(lines);
				for (var i = max; i > 0; i -= 1) {
					var line = document.createElement('div');
					line.style.width = width + 'px';
					line.style.height = '1px';
					line.style.backgroundImage = 'url(' + div.childNodes[0].src + ')';
					line.style.backgroundPosition = '0px ' + (1 - i + max) + 'px';
					if (line.style.opacity != undefined) {
						line.style.opacity = i / max * intensity;
					} else {
						line.style.filter = 'alpha(opacity=' + i / max * 100 * intensity + ')';
					}
					lines.appendChild(line);
				}
			}

			function clearLines(div) {
				if (document.getElementById('lines')) {
					div.removeChild(document.getElementById('lines'));
				}
			}
		-->
		</script>
		<style type="text/css">
			body {
				background-color:#C0C0C0;
				font-family:verdana, arial;
				font-size:11px;
				color:#333333;
				cursor:default;
				text-align:center;
			}

				img {
					display:block;
				}

				p {
					margin:3px;
				}

				form {
					margin:0px;
				}

				input {
					border:solid 1px #333333;
					padding:3px;
					background-color:#C8C8C8;
					margin-top:2px;
					text-align:center;
				}

				table {
					margin:auto;
					border:solid 1px #333333;
					background-color:#909090;
				}

					th {
						background-color:#DDDDDD;
						padding:3px;
						border:solid 1px #333333;
					}

					tr {
						vertical-align:top;
					}

					td {
						padding:3px;
						border:solid 1px #333333;
						background-color:#A3A3A3;
					}
		</style>
		<title>Reflet</title>
	</head>
	<body>
		<table>
			<tr>
				<th>Paramètres</th>
				<th>Résultat</th>
			</tr>
			<tr>
				<td>
					<form method="post" action="javascript:;">
						<p>
							Hauteur du reflet (en %)<br/>
							<input type="text" id="h" value="35"/><br/><br/>
							Intensité du reflet (en %)<br/>
							<input type="text" id="i" value="60"/><br/><br/>
							Marge (en pixels)<br/>
							<input type="text" id="m" value="2"/><br/><br/>
							URL de l'image<br/>
							<input type="text" id="url" value="http://www.javascriptfr.com/g/v9logo/logojs.gif"/><br/><br/>
							<input type="submit" value="Afficher" onclick="clearLines(document.getElementById('div')); reflect(document.getElementById('div'), parseInt(document.getElementById('h').value), parseInt(document.getElementById('i').value), parseInt(document.getElementById('m').value), document.getElementById('url').value)"/>
							<input type="reset" value="Reset" onclick="clearLines(document.getElementById('div')); document.getElementById('div').childNodes[0].src = 'http://www.javascriptfr.com/g/v9logo/logojs.gif';"/>
						</p>
					</form>
				</td>
				<td>
					<div id="div"><img src="http://www.javascriptfr.com/g/v9logo/logojs.gif" alt=""/></div>
				</td>
			</tr>
			<tr>
				<th colspan="2">Script javascript libre d'utilisation crée par mcc</th>
			</tr>
		</table>
	</body>
</html>

Conclusion

Un petit script simple et assez rapide pour créer des reflets sous ses images !
PS : j'ai cherché sur le site une ou des sources(s) équivalente(s) mais je n'en n'ai pas trouvé, alors si elle(s) existe(nt) déjà, désolé.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

11 juin 2008 14:53:20 :
Problème des id multiples réglé. (modification du zip).
11 juin 2008 17:47:49 :
Petite modification de la source...

Commentaires et avis

signaler à un administrateur
Commentaire de Kimjoa le 08/06/2008 15:38:47 8/10

salut , sympa tas source bien codé et utile, seule b-mole, évite les insertion des évenement dans les balise HTML , utilise des gestionnaires d'évement c'est mieux et tu peux mettre plusieur fonction pour un meme evenement et pour un meme objet HTML. Les fonction d evenement sont addEventListener pour FF et attachEvent pour IE.
Te met 8/10 bye !

signaler à un administrateur
Commentaire de macsou01 le 08/06/2008 16:33:49

Ok, merci du conseil. Faudra que je creuse ton idée, je n'ai jamais utilisé de gestionnaires d'évènements.

signaler à un administrateur
Commentaire de ralecul le 08/06/2008 23:09:25

Salut,

L'idée est bonne, le reflet ça fait très web 2.0 (c'est même devenu un cliché...)
Je te conseille de jeter un coup d'oeil à cette version : http://www.netzgesta.de/reflex/.
Elle utilise canvas qui a mon avis est plus approprié pour faire ce genre de chose.
Une version Orientée-Object avec passage d'options à la prototype serait sympa aussi...

Quelques remarques :
for (i = max; i > 0; i -= 1) -> for (var i = max; i > 0; i--)

if (navigator.appName == 'Microsoft Internet Explorer') { -> beurk !

if (line.style.opacity != undefined)
    line.style.opacity = i / max * intensity;
else if (line.style.filter != undefined)
    line.style.filter = 'alpha(opacity=' + i / max * 100 * intensity + ')';
    
line.id = 'line'; -> alors comme ça elles ont toutes le même id ?
Un id doit être unique, il faut trouver une autre solution !

signaler à un administrateur
Commentaire de macsou01 le 09/06/2008 17:32:33

Salut, pour ce qui est du canvas je ne trouve pas ça une bonne idée, car ce n'est pas supporté par beaucoup de navigateurs... Sinon les id multiples, ça ne pose pas vraiment de problèmes quand ceux ci sont crées dynamiquement (donc pas dans le code source d'origine). En tous cas ça ne génère pas d'erreurs...
Pour ce qui est de la boucle, je n'ai pas mis i-- (mais i -= 1) car c'était interprété comme une début de commentaire par le validateur du w3c... Mais c'est vrai que je n'ai pas déclaré la variable i !.
Voilà voilà ! :)

signaler à un administrateur
Commentaire de ralecul le 09/06/2008 19:17:42

Pour le i--, voilà la solution :
<script type="text/javascript">
<![CDATA[
var i=2;
i--;
]]>
</script>

Sinon pour ce qui est des multiple Id, je ne suis pas d'accord du tout !
Le validateur W3C ne peut pas voir ton erreur car comme tu l'as dit elle est ajoutée dynamiquement...
Ce n'est pas parce qu'il ne peut pas la voir qu'elle n'y ait pas ;-)

L'autre version (http://www.netzgesta.de/reflex/) utilise VML sous IE et canvas pour les autres navigateurs.
De plus il est possible de simuler canvas sous IE à l'aide de excanvas (ExplorerCanvas).
Mais j'avoue que ça fait un peu usine à gaz quand même...

@+

signaler à un administrateur
Commentaire de ralecul le 09/06/2008 19:22:47

Arf, j'y étais presque :
<script type="text/javascript">
//<![CDATA[
var i=2;
i--;
//]]>
</script>

signaler à un administrateur
Commentaire de macsou01 le 09/06/2008 20:30:41

Ok merci pour ces explications !

signaler à un administrateur
Commentaire de nicomilville le 11/06/2008 07:04:25

salut,

pas mal, a la place de l'id pourquoi ne pas mettre une class ?
Car une class peut être la même pour des éléments de la même page ...

++

signaler à un administrateur
Commentaire de macsou01 le 11/06/2008 12:59:51

Ouais j'y ai pensé mais j'ai pas eu le temps de m'en occuper ( je passe le bac :p ).

signaler à un administrateur
Commentaire de macsou01 le 11/06/2008 14:57:48

Finalement j'ai utilisé un conteneur unique avec comme id 'lines' qui contient toutes les lignes, il suffit donc de le supprimer pour supprimer toutes les lignes.

signaler à un administrateur
Commentaire de LeFauve42 le 16/06/2008 11:00:05 8/10

C'est sympa, mais ca fait des trucs vraiment bizares sur IE6 (et differents chaque fois que je clique sur "Afficher", meme sans changer les parametres).

Il faudrait au moins que ton script detecte IE6 et ne fasse rien si tu ne veux pas te prendre la tete a le supporter.

Enfin, ca peut attendre apres ton Bac ;o)

Sinon, c'est pas mal, meme ca doit bien surcharger le dom si tu l'utilises sur pleins d'images de la meme page.

signaler à un administrateur
Commentaire de macsou01 le 16/06/2008 13:31:43

Je ne peux pas tester ie6, j'ai Vista, à moins que tu connaisses une solution (pas un simple site de capture d'écran ça ne permet pas de tester le javascript). Mais bon ie6... ça devient vraiment vraiment dépassé quand même. ;)
Mais c'est vrai que ça surcharge un peu le dom mais bon pas tant que ça, par exemple pour une image de hauteur 100px, avec un reflet de 30% de hauteur, ça ne crée 'que' 30 divs.

signaler à un administrateur
Commentaire de LeFauve42 le 16/06/2008 14:11:34

Il y a un truc qui permet d'avoir sur le meme PC tous les IE de la version 5.5 a la 8 beta.
Je n'ai pas le nom en tete, mais tu dois pouvoir googler ca.

IE6 est qund meme encore assez repandu. Si tu googles pour trouver les statistiques de differents sites, (ex au hasard: http://www.w3schools.com/browsers/browsers_stats.asp ou http://danzcontrib2.free.fr/statistiques.php), tu peux voir des chiffres entre 20 et 30%.

Peu de webmasters sont pres a se passer d'un visiteur sur 5, meme pour un chouette reflet ;o)

Pour une image, ce n'est pas tres important, mais pour une galerie, par exemple avec 24 thumbnails sur ta page, ca fait deja 750 divs, ca commence a faire beaucoup.
Enfin dans ce cas, il doit etre possible de generer le reflet dans le thumbnail directement sur le serveur.

signaler à un administrateur
Commentaire de macsou01 le 16/06/2008 17:22:07

Oui ma méthode en javascript n'est pas très optimisé par rapport à d'autres méthodes comme php, canvas, etc mais bon :p.
Mais elle a un petit avantage, c'est que si on utilise un gif animé, il l'est aussi dans le reflet.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

jouer un son en cliquant sur une image [ par fabiin ] SalutComment faut-il faire pour jouer un son lors d'un clique sur une image, un lienmerci de votre aide @+Fabs<img src=/imgs2/smile_cool.gif border=0 Retrouver la position d'une image [ par Jean Pierre ] BonjourVoilà, j'ai un script qui me permet de deplacer une image sur l'ecran (drag'n drop). Mon probleme est qu'il faudrait que je puisse avoir la pos Position des objets [ par Dauphyn ] Je tente en vain de trouver la position d'une image en JS.Si par exemple j'insère l'image dans un tableau Ex : &lt;html&gt;&lt;body&gt;&lt;table&gt;&l Chargement automatique d'une image [ par bumblebee ] Je cherche a afficher une image l'orsque le client selectionne celle-ci dans dans un champ &lt;input type="file" &gt;Je suppose que cela est faisable double rollover.... [ par clement ] Double Rolloverbonjour a tous.voila mon probleme : a l'origine, 2 images( 1 et 2) sur une page.j'aimerai que qd je passe sur l'image 1 il y ait un rol mesurer image.. a l'aide !!! [ par klaus ] Heya..pplJe veux avoir les mesures d'une image et j'ai reussi d'avoir quelques scripts, mais le probleme c'est qu'ils ne passent pas sur le Mac. C'est Envoye d'image par un formulaire [ par brodeur ] Bonjour, j'ai fait un site ou le visiteur peuvent m'envoyer leurs images.Seulement, je problement, c'est que je ne sais pas comment faire pour que das position de la souris sur une image [ par golgoth ] Bonjour,Comment faire pour recuperer dans un lien la position de la souris sur une image quand je clic sur celle-ci ? Est ce possible ?Merci pour votr positionné une image scroll aur netscape4.x [ par rochonpascal ] Bonjour, depuis une semaine j'essaie de rendre mon site compatible avec netscape 4.x, le problèeme que je rencontre c'est que lorsque j'ai des images image background et redimensionnement [ par evilfrog83 ] Comment puis-je faire pour qu'une image positionnée en temps que fond d'un tableau puisse s'agrandir et se rétrécir en fonction de la taille de celui-


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,374 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.