Hoi tweakers,
Hoewel ik mij altijd verre van javascript animaties heb gehouden heb ik onlangs
fade scriptje geschreven dat een HTML element geheel of gedeeltelijk kan laten
infaden of outfaden (zie hieronder).
Het eerste probleem waar ik tegen aanliep was het gebruik van setInterval en het gebruik van this. Mede dankzij jullie heb ik hiervoor een oplossing gevonden (zie function startFade op regel 31-34).
Nu wil het volgende. Wanneer ik een instance van deze class maak en de method startFade aanroep dan gaat alles goed. Zie hieronder:
Fijn dat dat werkt maar ik wil de animatie aanroepen bij een event. Zoals hieronder werkt het dus niet!!!
Ik snap niet waaorm, maar vermoed dat het te maken heeft met de setInterval aanroep in startFade.
Het werkt wel als ik function(){fade.startFade()} gebruik bij de addEvent. Dat begrijp ik niet.
Het lijkt er op alsof de fade.startFade met de haakjes () aangeroepen MOET worden, maar waarom?
Hoewel de laatste genoemde methode dus werkt, vind ik het niet erg wenseljik omdat
deze het allemaal minder bruikbaar maakt voor iemand dit dit script niet zelf heeft geschreven.
Heeft er iemand een idee waarom de ene aanroep wel werkt en de andere niet?
Hoewel ik mij altijd verre van javascript animaties heb gehouden heb ik onlangs
fade scriptje geschreven dat een HTML element geheel of gedeeltelijk kan laten
infaden of outfaden (zie hieronder).
code:
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
| /*
* Usage: var myFade = new Fade(“MyElementId”,{from:0,to:1},5)
* @param {String} el Reference to the element that will be faded
* @param {Object} opacity (Optional, defaults to {from:0,to:1})The opacity start and end opacity levels
* @param {Number} duration (Optional, defaults to 1)The number of seconds that the animation should last
*/
function Fade(el,opacity,duration){
if(!el){return;};
this.init(el,opacity,duration);
}
Fade.prototype={
init:function(el,opacity,duration){
this.element = document.getElementById(el);
if(!this.element){return;}
if(opacity){
this.opacityFrom = (opacity.from || opacity.from == 0)?opacity.from:0;
this.opacityTo = (opacity.to || opacity.to == 0)?opacity.to:1;
} else {
this.opacityFrom = 0;
this.opacityTo = 1;
}
this.opacityCurrent = this.opacityFrom;
this.duration = (duration)?duration:1;
this.interval = Math.abs((this.duration*1000)/((this.opacityTo - this.opacityFrom)/0.01));
this.fadeMode = (this.opacityFrom<this.opacityTo)?"in":"out";
},
fire:function(){
this.startFade();
},
startFade:function(){
var _self = this;
this.timer = setInterval(function(){_self.run()},this.interval);
},
run:function(){
if(this.fadeMode == "in"){
if(this.opacityCurrent <= this.opacityTo){
this.setElementOpacity(this.element,this.opacityCurrent);
this.opacityCurrent = this.opacityCurrent + 0.01;
} else {
this.timer = clearInterval(this.timer);
}
}else{
if(this.opacityCurrent >= this.opacityTo){
this.setElementOpacity(this.element,this.opacityCurrent);
this.opacityCurrent = this.opacityCurrent - 0.01;
} else {
this.timer = clearInterval(this.timer);
}
}
},
setElementOpacity:function(element,value){
if(!this.element){
throw Error.argumentNull('element');
}
if(element.filters){
var filters = element.filters;
var createFilter = true;
if(filters.length !== 0){
var alphaFilter = filters['DXImageTransform.Microsoft.Alpha'];
if(alphaFilter){
createFilter = false;
alphaFilter.opacity = value * 100;
}
}
if (createFilter){
element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + (value * 100) + ')';
}
}
else {
element.style.opacity = value;
}
}
}; |
Het eerste probleem waar ik tegen aanliep was het gebruik van setInterval en het gebruik van this. Mede dankzij jullie heb ik hiervoor een oplossing gevonden (zie function startFade op regel 31-34).
Nu wil het volgende. Wanneer ik een instance van deze class maak en de method startFade aanroep dan gaat alles goed. Zie hieronder:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <style>
#overLay{
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
background-color:black;
}
</style>
<body>
<div id="overLay"> </div>
<script type="text/javascript">
var fade = new Fade("overLay",{from:1,to:0},2);
fade.startFade();
</script>
</body>
</html> |
Fijn dat dat werkt maar ik wil de animatie aanroepen bij een event. Zoals hieronder werkt het dus niet!!!
code:
1
2
3
4
5
6
7
| <div id="overLay"></div>
<button id="knop">klik hier!</button
<script type="text/javascript">
var fade = new Fade("overLay",{from:1,to:0},2);
var el = document.getElementById("knop");
DOMhelp.addEvent(el,'click',fade.startFade, false);
</script> |
Ik snap niet waaorm, maar vermoed dat het te maken heeft met de setInterval aanroep in startFade.
Het werkt wel als ik function(){fade.startFade()} gebruik bij de addEvent. Dat begrijp ik niet.
Het lijkt er op alsof de fade.startFade met de haakjes () aangeroepen MOET worden, maar waarom?
code:
1
2
3
4
5
6
7
| <div id="overLay"></div>
<button id="knop">klik hier!</button
<script type="text/javascript">
var fade = new Fade("overLay",{from:1,to:0},2);
var el = document.getElementById("knop");
DOMhelp.addEvent(el,'click',function(){fade.startFade()}, false);
</script> |
Hoewel de laatste genoemde methode dus werkt, vind ik het niet erg wenseljik omdat
deze het allemaal minder bruikbaar maakt voor iemand dit dit script niet zelf heeft geschreven.
Heeft er iemand een idee waarom de ene aanroep wel werkt en de andere niet?