IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Utiliser les effets easing


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut Utiliser les effets easing
    Bonjour,
    Je suis débutant en javascript et j'essaye de faire une fonction scroll qui permet de scroller jusqu’à un élément.
    Mon problème vient des effets que je souhaite utiliser lors du scroll.
    Pour l'effet (voir code ci-dessous) easeInOut, je n'ai pas de problème.
    J'arrive à scroller du haut vers le bas et du bas vers le haut.
    Par contre, pour les autres (easeInOutQuad,easeInOutElastic,easeInElastic...), je n'arrive à faire l'effet dans les deux sens. Du haut vers le bas ça marche mais pas l'inverse. J'ai essayer plusieurs modifications, lu des articles :
    http://robertpenner.com/easing/
    http://jemm.free.fr/webcoding/beziercurves.html
    ....
    Mais je ne comprends toujours pas pourquoi ça ne marche pas.
    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
     
    (function(){
            // Toutes mes fonctions
    	var myFonctions = {
                    // Ajout d'écouteur
    		add_event : function(evenement, element, fonction){
    			if(element.addEventListener){
    				element.addEventListener(evenement, fonction, false);
    			}
    			else{
    				element.attachEvent('on'+evenement, fonction);
    			}
    		},
                    // Selection d'un élément par l'id
    		id : function(elem){
    			return document.getElementById(elem);
    		},
                    // Transfert obj source, obj des
    		transfer : function(source, dest){
    			var prop, transfered={};
    			for ( prop in dest ) { transfered[prop] = dest[prop]; }
    			for ( prop in source ) { transfered[prop] = source[prop]; }
    			return transfered; 
    		},
                    // Taille de la page
    		pageDim : function(elem){
    			if(elem){
    			var d = dE = dB = elem,
    				w, h;
    			}
    			else{
    				var d = document,
    				dE = d.documentElement,
    				dB = d.body,
    				w, h;
    			}
    			h = dE.scrollHeight;
    			w = dE.scrollWidth;
    			if ( dE.clientHeight > h ) { h  = dE.clientHeight; }
    			if ( dE.clientWidth > w ) { w  = dE.clientWidth; }
    			if ( dB.scrollHeight > h ) { h = dB.scrollHeight; }
    			if ( dB.scrollWidth > w ) { w = dB.scrollWidth; }
    			return {'w':w, 'h':h} ;
    		},
                    // Taille de la fenetre
    		winDim : function(){
    			var W,H,
    				i = window,
    				d = document,
    				de = d.documentElement,
    				db = d.body;
    			if ( i.innerWidth ) {
    				W = i.innerWidth;
    				H = i.innerHeight;
    			} else if ( de.clientWidth ) {
    				W = de.clientWidth;
    				H = de.clientHeight;
    			}
    			else {
    				W = db.clientWidth;
    				H = db.clientHeight;
    			}
    			return {w:W, h:H} ;
    		},
                    // Position h et v du defilement
    		scrolled : function(){
    			var x,y,
    				w = window,
    				d = document,
    				de = d.documentElement,
    				db = d.body;
    			if ( w.pageXOffset!==undefined) {
    				x = w.pageXOffset;
    				y = w.pageYOffset;
    			}
    			else {
    				x = de.scrollLeft ? de.scrollLeft : (db.scrollLeft?db.scrollLeft:0) ;
    				y = de.scrollTop ? de.scrollTop : (db.scrollTop?db.scrollTop:0) ;
    			}
    			return {'x':x, 'y':y};
    		},
                    // position de elem
    		getPos : function(elem,choix){
    			var pos={'r':0,'l':0,'t':0,'b':0},
    				tmp=elem, choix = choix || null;
    			do {
    				pos.l += tmp.offsetLeft;
    				tmp = tmp.offsetParent;
    			} while( tmp !== choix );
    			pos.r = pos.l + elem.offsetWidth;
    			tmp=elem;
    			do {
    				pos.t += tmp.offsetTop;
    				tmp = tmp.offsetParent;
    			} while( tmp !== choix );
    			pos.b = pos.t + elem.offsetHeight;
    			return pos;
    		},
                    //Calcul de la durre
    		duree : function(y,x,tp){
    			y = Math.sqrt( Math.pow( y, 2 ) + Math.pow( x, 2 ) );
    			var tmp = 0, i = 0 ;
    			while ( tmp < y ) {
    				i++ ;
    				tmp = tmp + i*i ;
    			}
    			return i * tp ;
    		},
                    // Annule l'action par default
    		preventDefault : function(e){
    			e = e||event;
    			if (e.preventDefault) { e.preventDefault(); }
    			else { e.returnValue = false;  }
    		},
                    //Effets easing => Le premier marche, les autres que du haut vers le vas
                    // actualStep: current time, startValue: beginning value, endValue: change in value, totalSteps: duration
    		easeInOut : function( startValue, endValue, totalSteps, actualStep, powr, round ){ 
    			var stepp, delta = endValue - startValue; 
    			stepp = startValue+(Math.pow(((1 / totalSteps) * actualStep), powr) * delta); 
    			return round ? Math.round(stepp) : stepp;
    		},
    		easeInOutQuad : function(startValue, endValue, totalSteps, actualStep, powr){
    			if ((actualStep/=totalSteps/2) < 1) return endValue/2*actualStep*actualStep + startValue;
    			return -endValue/2 * ((--actualStep)*(actualStep-2) - 1) + startValue;
    		},
    		easeInOutElastic: function (startValue, endValue, totalSteps, actualStep) {
    			var s = 1.70158, p = 0, a = endValue;
    			//alert(startValue+' '+endValue+' '+totalSteps+' '+actualStep);
    			if (actualStep === 0) {
    				return startValue;
    			}
    			if ((actualStep /= totalSteps / 2) === 2) {
    				return startValue + endValue;
    			}
    			if (!p) {
    				p = totalSteps * (0.3 * 1.5);
    			}
    			if (a < Math.abs(endValue)) {
    				a = endValue;
    				s = p / 4;
    			} else {
    				s = p / (2 * Math.PI) * Math.asin(endValue / a);
    			}
    			if (actualStep < 1) {
    				return -0.5 * (a * Math.pow(2, 10 * (actualStep -= 1)) * Math.sin((actualStep * totalSteps - s) * (2 * Math.PI) / p)) + startValue;
    			}
    			return a * Math.pow(2, -10 * (actualStep -= 1)) * Math.sin((actualStep * totalSteps - s) * (2 * Math.PI) / p) * 0.5 + endValue + startValue;
    		},
    		easeInElastic: function (startValue, endValue, totalSteps, actualStep) {
    			var s = 1.70158, p = 0, a = endValue;
    			if (actualStep === 0) {
    				return startValue;
    			}
    			if ((actualStep /= totalSteps) === 1) {
    				return startValue + endValue;
    			}
    			if (!p) {
    				p = totalSteps * 0.3;
    			}
    			if (a < Math.abs(endValue)) {
    				a = endValue;
    				s = p / 4;
    			} else {
    				s = p / (2 * Math.PI) * Math.asin(endValue / a);
    			}
    			return -(a * Math.pow(2, 10 * (actualStep -= 1)) * Math.sin((actualStep * totalSteps - s) * (2 * Math.PI) / p)) + startValue;
    		}
    	}
    	var scroll = function(options){
    		this.options = {
    			ease : 0.3,
    			effet: 'easeInOut',
    			duree : 50,
    			move : 'window', //Par default
    			finish : false
    		};
    		this.options = myFonctions.transfer(options,this.options);
    		this.init = function(elem){
    			this.startTime = new Date().getTime();
    			var t_page = myFonctions.pageDim(),
    			t_win = myFonctions.winDim(),
    			element = myFonctions.getPos(elem),
    			init_pos = myFonctions.scrolled(),
    			self = this;
    			// En cas de destination trop proche du bord
    			if(element.l + t_win.w > t_page.w){
    				element.l = t_page.w - t_win.w;
    			}
    			if(element.t + t_win.h > t_page.h){
    				element.t = t_page.h - t_win.h;
    			}
    			//Calcul de la duree
    			var duree = myFonctions.duree(init_pos.y - element.t, init_pos.x - element.l,this.options.duree);
    			this.next(t_page,t_win,element,init_pos,self,duree);
    		};
    		this.next = function(t_page,t_win,element,init_pos,self,duree){
    			var timer = setTimeout(function(){
    				self.frame(t_page,t_win,element,init_pos,self,duree);
    			},25);
    		}
    		this.frame = function(t_page,t_win,element,init_pos,self,duree){
    			var time = new Date().getTime(),
    			actuel_t = time - this.startTime,
    			calculTime = Math.min(actuel_t,duree),
    			options = this.options,
    			newX = myFonctions[options.effet](init_pos.x, element.l,duree,calculTime,options.ease);
    			newY = myFonctions[options.effet](init_pos.y, element.t,duree,calculTime,options.ease);
    			window.scrollTo(newX,newY);
    			if(actuel_t >= duree){
    				window.scrollTo(element.l,element.t);
    				if(options.finish){options.finish();}
    			}
    			else{
    				this.next(t_page,t_win,element,init_pos,self,duree);
    			}
    		}
    	};
    Merci à tous de m'avoir lu et dans l'attente de conseil et d'aide parce que pour l'instant de mon coté aucune de mes tentatives fonctionnent.

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut Solution
    Re,
    J'ai trouvé la solution.Je suis aller voir comment il faisait dans le framework jquery.
    Du coup, je calculais n'importe comment.
    La solution est la suivante (en exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    easeInOutQuad : function(startValue, endValue, totalSteps, actualStep, powr){
    			if ((actualStep/=totalSteps/2) < 1) return endValue/2*actualStep*actualStep + startValue;
    			return -endValue/2 * ((--actualStep)*(actualStep-2) - 1) + startValue;
    }
    var rY  = easeInOutQuad(0, 1,dureeTotal,tempsActuel);
    // Le calcul est le suivant 
    z =positionDedepart + rY * (positionFin - positionDedepart );
    Je sais pas si c'est très clair.

    ++++++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Flex3] Utiliser les effets de "Tour de Flex"
    Par DBA_OCP dans le forum Flex
    Réponses: 0
    Dernier message: 16/12/2010, 16h15
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47
  4. Merci d'utiliser les TAG
    Par Cian dans le forum Etudes
    Réponses: 0
    Dernier message: 07/08/2003, 17h46
  5. Utiliser les frames
    Par laury dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/05/2003, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo