Cours Web

Réalisation de sites Internet Lausanne


Javascript QuickTime Like Viewer

Ceci est un essai expérimental d'affichage d'un panorama avec effet de déformation genre quicktime.

Testé uniquement avec FireFox sous linux pour le moment :-)

Y a un bug d'affichage à gérer au moment du bouclage. Et
il est surement possible d'optimiser tout ça :-)

Code

<script language='javascript' type='text/javascript'>

Function.prototype.bind = function(object) {
	var __method = this;
	return function() {
		return __method.apply(object, arguments);
	}
}

function Qt(zonew, zoneh, picw, pich, src) {
	this.src = src;
	this.bw = 10;
	this.zonew = zonew;
	this.zoneh = zoneh;
	this.picw = picw;
	this.pich = pich;
	this.posx = picw-100;
}

Qt.prototype.affiche = function() {
	var qt = document.getElementById('qt');
	qt.style.height = this.zoneh + 'px';
	qt.style.width = this.zonew + 'px';
	qt.style.overflow = 'hidden';
	qt.style.position = 'relative';
	qt.innerHTML = '';
	var w = this.bw;
	var ox = 0;
	for(var px=0;px<this.zonew;px+=w) {
		var e = document.createElement('div');
		e.style.width = w + 'px';
		e.style.height = this.zoneh + 'px';
		e.style.left = px + 'px';
		e.style.top = '0';
		e.style.position = 'absolute';
		e.style.overflow = 'hidden';
		var img = document.createElement('img');
		img.src = this.src;
		img.style.left = - ((this.picw + px + this.posx)%this.picw) + 'px';
		img.style.width = this.picw + 'px';
		img.style.position = 'absolute';
		var rx = px - (this.zonew/2);
		var amp = 200;
		d = amp - amp*Math.cos(rx/180);
		var sh = (this.pich + Math.round(d));
		img.style.top = (-Math.round((sh-this.pich)/2)) + 'px';
		img.style.height = sh + 'px';
		img.qt = this;
		img.dx = rx/(this.zonew/2);
		img.onmouseover = this.over.bind(img);
		e.appendChild(img);
		qt.appendChild(e);
	}
}

Qt.prototype.over = function() {
	this.qt.bw = Math.max(2, Math.abs(Math.round(this.dx*40)));
	this.qt.posx += Math.round(this.dx*30);
	this.qt.posx %= this.qt.picw;
	this.qt.affiche();
}

function addEvent(obj, evType, fn) {
	if (obj.addEventListener){
    	obj.addEventListener(evType, fn, true);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	}
}

var	qt = new Qt(480, 300, 2836, 300, 'images/pano.jpg');

addEvent(window, 'load', 
  function() {
    qt.affiche();    
  } 
);

</script>
<div style='margin: 30px' id='qt'></div>