[Code] Horloge Analogique en HTML/Javascript

Horloge Analogique en HTML/Javascript [Code] - HTML/CSS - Programmation

Marsh Posté le 20-02-2007 à 17:04:00    

Je viens de finir une horloge en Javascript/HTML...
Il y a surement des erreurs... Le JS/HTML n'est pas mon domaine de prédilection.
Le code est écrit pour être le plus lisible et compréhensible (pas pour être le plus efficace).
 
Vous pouvez la voir en activité ici :
Lien supprimé
 
Et tout télécharger là :
Lien supprimé
 
Le design de l'horloge est dans l'esprit MacOS.
Lien supprimé
 
J'utilise en tout 365 images : GIF 8 bits avec transparence et PNG 32bits (24bits+alpha 8bits)
- 2 x 60 images pour les heures (format PNG et GIF) - clock-h00.gif à clock-h59.gif et clock-h00.png à clock-h59.png
- 2 x 60 images pour les minutes (format PNG et GIF) - clock-m00.gif à clock-m59.gif et clock-m00.png à clock-m59.png
- 2 x 60 images pour les secondes (format PNG et GIF) - clock-s00.gif à clock-s59.gif et clock-s00.png à clock-s59.png
- 2 x 2 images pour le fond (format PNG et GIF) - clock-am.gif, clock-pm.gif, clock-am.png, clock-pm.png
- 1 image de fond transparent (format GIF) - clock-blank.gif
Total : 49Ko pour les GIF et 209Ko pour les PNG
 
 
Elle a été testée sous Firefox 2.0, Internet Explorer 5.0, Internet Explorer 5.5, Internet Explorer 6 et Safari (version MacOS 10.4).
 
Spécificité :
- Sa taille est fixée à 96x96
- Par défaut, on utilise le format PNG sauf lorsqu'Internet Explorer est détecté en version 5.0 ou antérieure, dans ce cas, le GIF est utilisé.
- La transparence des PNG est forcée en mode Internet Explorer 5.5 et 6.0.
- Toutes les images sont préchargées simultanément.
 
Petits soucis :
- L'alignement du centre des aiguilles est assez moyen...
- Il faudrait alléger le code et incorporer le preload dans l'affichage
 
Le code

Code :
  1. <html><head>
  2. <script><!--
  3. var ClientPC    = navigator.userAgent.toLowerCase();
  4. var ClientVer   = parseInt(navigator.appVersion);
  5. var arVersion   = navigator.appVersion.split("MSIE" );
  6. var MsIeVer     = parseFloat(arVersion[1]);
  7. var Is_ie       = ( (ClientPC.indexOf('msie')       != -1) && (ClientPC.indexOf('opera')    == -1));
  8. var Is_nav      = ( (ClientPC.indexOf('mozilla')    != -1) && (ClientPC.indexOf('spoofer')  == -1)
  9.                  && (ClientPC.indexOf('compatible') == -1) && (ClientPC.indexOf('opera')    == -1)
  10.                  && (ClientPC.indexOf('webtv')      == -1) && (ClientPC.indexOf('hotjava')  == -1));
  11. var Is_moz      = 0;
  12. var Is_win = ((ClientPC.indexOf('win')!=-1) || (ClientPC.indexOf('16bit') != -1));
  13. var Is_mac =  (ClientPC.indexOf('mac')!=-1);
  14. var iClockProcessIEbugfixPNG;
  15. var iClockProcessInit = 0;
  16. var szClockProcessImageExtension;
  17. var iClockProcessCurrentH = -1;
  18. var iClockProcessCurrentM = -1;
  19. var iClockProcessCurrentS = -1;
  20. var iClockProcessCurrentD = -1;
  21. var iClockPreloadCount = 0;
  22. imgClockProcessH = new Array ( );
  23. initClockProcessH = new Array ( );
  24. imgClockProcessM = new Array ( );
  25. initClockProcessM = new Array ( );
  26. imgClockProcessS = new Array ( );
  27. initClockProcessS = new Array ( );
  28. szClockProcessH = new Array ( );
  29. szClockProcessM = new Array ( );
  30. szClockProcessS = new Array ( );
  31. if (Is_ie)
  32. {
  33. if ((MsIeVer>=5.5) && (MsIeVer<7.0))
  34. {
  35.  szClockProcessImageExtension = '.png';
  36.  iClockProcessIEbugfixPNG = 1;
  37. }
  38. else if (MsIeVer>=7)
  39. {
  40.  szClockProcessImageExtension = '.png';
  41.  iClockProcessIEbugfixPNG = 0;
  42. }
  43. else
  44. {
  45.  szClockProcessImageExtension = '.gif';
  46.  iClockProcessIEbugfixPNG = 0;
  47. }
  48. }
  49. else
  50. {
  51. szClockProcessImageExtension = '.png';
  52. iClockProcessIEbugfixPNG = 0;
  53. }
  54. function jsClockPreloadPrepare ( )
  55. {
  56. var i;
  57. for (i=0;i<60;i++)
  58. {
  59.  if (i<10) sIndex = '0'+i;
  60.  else      sIndex = i;
  61.  szClockProcessH[i] = 'clock-h'+sIndex+szClockProcessImageExtension;
  62.  szClockProcessM[i] = 'clock-m'+sIndex+szClockProcessImageExtension;
  63.  szClockProcessS[i] = 'clock-s'+sIndex+szClockProcessImageExtension;
  64. }
  65. window.setTimeout ( "jsClockPreloadProcess()", 100 );
  66. window.setInterval ( "jsClockProcess()", 1000 );
  67. }
  68. function jsClockPreloadApply ( iHMS, iIndex )
  69. {
  70. switch (iHMS)
  71. {
  72.  case 0:
  73.   if (initClockProcessH[iIndex]!=1)
  74.   {
  75.    initClockProcessH[iIndex] = 1;
  76.    imgClockProcessH[iIndex] = new Image ( );
  77.    imgClockProcessH[iIndex].src = szClockProcessH[iIndex];
  78.   }
  79.   break;
  80.  case 1:
  81.   if (initClockProcessM[iIndex]!=1)
  82.   {
  83.    initClockProcessM[iIndex] = 1;
  84.    imgClockProcessM[iIndex] = new Image ( );
  85.    imgClockProcessM[iIndex].src = szClockProcessM[iIndex];
  86.   }
  87.   break;
  88.  case 2:
  89.   if (initClockProcessS[iIndex]!=1)
  90.   {
  91.    initClockProcessS[iIndex] = 1;
  92.    imgClockProcessS[iIndex] = new Image ( );
  93.    imgClockProcessS[iIndex].src = szClockProcessS[iIndex];
  94.   }
  95.   break;
  96. }
  97. }
  98. function jsClockPreloadProcess ( )
  99. {
  100. if (iClockPreloadCount<180)
  101. {
  102.  jsClockPreloadApply ( iClockPreloadCount%3, parseInt(iClockPreloadCount/3) );
  103.  iClockPreloadCount++;
  104.  window.setTimeout ( "jsClockPreloadProcess()", 100 );
  105. }
  106. }
  107. function jsClockProcess ( )
  108. {
  109. tCurrentTime = new Date ( );
  110. iH = tCurrentTime.getHours();
  111. iM = tCurrentTime.getMinutes();
  112. iS = tCurrentTime.getSeconds();
  113. if (iH>=12) iD = 'pm';
  114. else        iD = 'am';
  115. iH = parseInt(((iH%12)*5)+(iM/12));
  116.     for(var i=0; i<document.images.length; i++)
  117.     {
  118.       var nodeImg = document.images[i];
  119.  var szSrc = '';
  120.  switch (nodeImg.id)
  121.  {
  122.   case 'clock-h-img':
  123.    if (iClockProcessCurrentH!=iH) szSrc = szClockProcessH[iH];
  124.    break;
  125.   case 'clock-m-img':
  126.    if (iClockProcessCurrentM!=iM) szSrc = szClockProcessM[iM];;
  127.    break;
  128.   case 'clock-s-img':
  129.    if (iClockProcessCurrentS!=iS) szSrc = szClockProcessS[iS];
  130.    break;
  131.   case 'clock-back-img':
  132.    if (iClockProcessCurrentD!=iD)
  133.     szSrc = 'clock-'+iD+szClockProcessImageExtension;
  134.    break;
  135.   default:
  136.    break;
  137.  }
  138.  if (szSrc!='')
  139.  {
  140.   if (iClockProcessIEbugfixPNG)
  141.   {
  142.    nodeImg.runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"' +
  143.                                        szSrc + '\",sizingMethod=\"scale\" )';
  144.   }
  145.   else nodeImg.src = szSrc;
  146.  }
  147. }
  148. iClockProcessCurrentH = iH;
  149. iClockProcessCurrentM = iM;
  150. iClockProcessCurrentS = iS;
  151. iClockProcessCurrentD = iD;
  152. }
  153. --></script>
  154. </head><body bgcolor=#ffffff>
  155. <div id='clock' style='position:relative;'>
  156. <img src='clock-blank.gif' id ='clock-back-img' width='96px' height='96px' style='position:absolute; left:0px; top:0px; z-index:2;'>
  157. <div id='clock-h'><img src='clock-blank.gif' id='clock-h-img' width='96px' height='96px' style='position:absolute; left:0px; top:-2px; z-index:3;'></div>
  158. <div id='clock-m'><img src='clock-blank.gif' id='clock-m-img' width='96px' height='96px' style='position:absolute; left:0px; top:-2px; z-index:4;'></div>
  159. <div id='clock-s'><img src='clock-blank.gif' id='clock-s-img' width='96px' height='96px' style='position:absolute; left:1px; top:-2px; z-index:5;'></div>
  160. </div>
  161. <script>
  162. jsClockPreloadPrepare ( );
  163. </script>
  164. </body></html>

Message cité 1 fois
Message édité par christophe_d13 le 05-06-2009 à 17:32:04

---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 20-02-2007 à 17:04:00   

Reply

Marsh Posté le 09-05-2007 à 21:34:26    

Merci pour ce script.<br />
Je l'utilise sur mon site.
Vous pouvez le voir ici www.fcbat.com

Reply

Marsh Posté le 03-08-2007 à 16:15:38    

J'ai mis à jour le texte et il est maintenant possible de tout télécharger dans un fichier zip.
Lien supprimé


Message édité par christophe_d13 le 08-06-2009 à 00:11:24

---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 03-08-2007 à 16:39:49    

Salut,
 
J'ai essayé hier d'afficher un png24 sous ie6, mais finalement j'ai laissé tomber et j'ai utilisé un gif.
Tu saurais me faire un exemple hyper simple d'affichage de png sous ie 6 qui marche que je puisse recopier? J'ai peur de pas savoir prendre que les parties utiles de ton code... Un énorme merci si tu pouvais m'aider.

Reply

Marsh Posté le 04-08-2007 à 23:00:35    

Durkheim> C'est assez simple en fait...
 
Si le navigateur est IE 5.5 ou IE 6, il faut récupérer l'élément image, ici nodeImg, coller le nom de l'image dans szSrc et appliquer la ligne suivante :


var nodeImg = document.images[...Le numéro de l'image dans le document...];
var szSrc = '...Le nom du fichier image au format PNG...';
 
nodeImg.runtimeStyle.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"' + szSrc + '\",sizingMethod=\"scale\" )';


Message édité par christophe_d13 le 04-08-2007 à 23:01:02

---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 05-08-2007 à 14:18:01    

Merci beaucoup!

Reply

Marsh Posté le 05-08-2007 à 22:44:35    

Je me demandais pkoi ça mettait autant de temps à charger au début :D
 
Forcément, avec 365 images :D
 
En tout cas, pas mal :jap:
 
Y'a juste que je sais pas si c'est IE 7 ou quoi, mais les aiguilles sont décallées par rapport au centre de l'horloge et même entre elles :D

Reply

Marsh Posté le 05-08-2007 à 22:53:03    

Apparement, c'est pas IE7, parceque j'ai pareil avec FF sous Debian et IE6SP1 sous 98
 
Quoique sous IE6SP1 ça semble un peu moins décallé.

Reply

Marsh Posté le 06-08-2007 à 21:41:36    

MagicBuzz> Faut pas lire une ligne sur deux, c'est pas bien, pas glop !

Citation :

Petits soucis :  
- L'alignement du centre des aiguilles est assez moyen...


C'est les images qui ne sont pas assez travaillées...
 
;)


Message édité par christophe_d13 le 06-08-2007 à 21:42:06

---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 07-08-2007 à 15:47:13    

ouais c'est vrai ça gache un peu le design.
 
mais sinon je trouve qu'elle est pas si mal cette horloge..


---------------
http://ranjoy.free.fr
Reply

Marsh Posté le 07-08-2007 à 15:47:13   

Reply

Marsh Posté le 11-08-2007 à 18:41:24    

christophe_d13 a écrit :


J'utilise en tout 365 images : GIF 8 bits avec transparence et PNG 32bits (24bits+alpha 8bits)


ou comment flinguer le serveur ...
 
 
et niveau code, il y a moyen de faire beaucoup mieux !!
allez, cadeau : http://kangol.prout.be/tests/jsclock/

Reply

Marsh Posté le 13-08-2007 à 10:22:33    

KangOl> C'est pas encore terminé (il manque la gestion de la transparence). Mais c'est surement mieux que charger progressivement les images.
En fait, je ne savais pas que l'on pouvait utiliser ce genre de technique en JS (le position X/Y dans l'image comme un bitblt). Mais est-ce que cela fonctionne sur tous les navigateurs ? IE5, IE5.5, IE6, IE7, FireFox, Opera, Mozilla...
 


---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 13-08-2007 à 10:25:49    

christophe_d13 a écrit :

KangOl> C'est pas encore terminé (il manque la gestion de la transparence). Mais c'est surement mieux que charger progressivement les images.
En fait, je ne savais pas que l'on pouvait utiliser ce genre de technique en JS (le position X/Y dans l'image comme un bitblt). Mais est-ce que cela fonctionne sur tous les navigateurs ? IE5, IE5.5, IE6, IE7, FireFox, Opera, Mozilla...
 


En tout cas ça ne passe pas sous IE6

Reply

Marsh Posté le 13-08-2007 à 18:29:35    

vu que ce sont des png, ca ne m'étonne pas...
 
et puis IE < 6, je pense qu'on peut les oublier :o

Reply

Marsh Posté le 13-08-2007 à 21:49:27    

KangOl> Le but de cet horloge, lorsque je l'avais développé était de fonctionner à partir d'IE5, de Safari (celle avec les G4), de Firefox, de mozilla et d'opéra.
Il fallait du code compatible.


---------------
http://www.ikalizer.fr
Reply

Marsh Posté le 13-08-2007 à 22:04:05    

d'un autre coté, vu le code, ca devrais marcher sous tous les navigateurs avec des .gif ...

Reply

Marsh Posté le 14-08-2007 à 10:11:21    

Je testerai ça à la rentrée.
Merci.


---------------
http://www.ikalizer.fr
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed