Autor | Zpráva | ||
---|---|---|---|
Joan Profil |
#1 · Zasláno: 3. 9. 2010, 16:40:07
Pracuji na pochopení plynulého zobrazení elementu. Což o to, funguje mi to, ale něčemu nerozumím:
<meta charset="windows-1250"> <script> function zobrazit(co) { var obr = document.getElementById(co); for(var i = 1; i <= 20; i++) { setTimeout(krokAnimace(obr, i / 20), i * 30); } } function krokAnimace(element, krok) { // je zapotřebí vrátit novou funkci — ta se teprve zavolá při načasovaném timeoutu, zatímco krokAnimace se volá dvacetkrát při načasování return function() { var o = krok; var of = Math.round((krok) * 100); // tento řádek nastavuje atribut style element.style.cssText = "\ opacity: " + o + ";\ filter: alpha(opacity=" + of + ");\ -moz-opacity: " + o + ";\ -khtml-opacity: " + o + ";\ "; }; } </script> <img id="obrazek" src="http://diskuse.jakpsatweb.cz/img/logo.png" style="visibility: hidden"><br> <input type="button" value="Plynule zobrazit" onclick="zobrazit('obrazek')"> Vím, že opacity platí pro Firefox a nabývá hodnot 0.0 - 1.0 a filter: alpha(opacity) pro IE od 1 do 100 a vlastnost -moz-opacity pro starou Mozillu a -khtml-opacity pro prohlížeč Konqueror, Safari apod. Ale nerozumím řádkům 21 - 26: - proč jsou tam ta zpětná lomítka? - bylo by stylování možné rozepsat normálním způsobem s opakovaným element.style... pro každou vlastnost pro mé pochopení? Na řádku 15 je return function() Koukám na tento kód už pár dní, zkouším různé změny ale dvakrát moudrá z něj stále nejsem :-( Byl by prosím někdo tak ochotný a dovysvětlil mi toto? Dík a pěkný víkend! |
||
_es Profil |
#2 · Zasláno: 3. 9. 2010, 17:10:08
Joan:
„- proč jsou tam ta zpětná lomítka?“ To bude asi zle, asi je to pokus zapísať do reťazca konce riadkov, no nemusí to tak fungovať. Konce riadkov sa zapisujú do reťazca ako \n , no v tomto prípade nie sú treba.
„proč ta funkce neobsahuje název (= jak poznám, jestli se jedná o function zobrazit anebo o function krokAnimace anebo o úplně jinou funkci?)“ Lebo je to vyrobenie novej funkcie, ktorá nemá názov, je len priamo vytvorená v príkaze return , niečo je o tom tu v dokumentácii Mozilly.
Tá animácia by sa nejako dala spraviť aj bez toho. |
||
Bubák Profil |
#3 · Zasláno: 3. 9. 2010, 19:16:32
Joan:
„- proč jsou tam ta zpětná lomítka?“ Částečně to vysvětluje řádek 20: // tento řádek nastavuje atribut style
Ale následující kód na řádcích 21-26 není v řádku, ale JS to nepozná, protože konce řádků jsou escapované. Šlo by to i kódem v jednom řádku: element.style.cssText = "opacity: " + o + "; filter: alpha(opacity=" + of + "); -moz-opacity: " + o + "; -khtml-opacity: " + o + "; "; |
||
_es Profil |
#4 · Zasláno: 3. 9. 2010, 20:41:24 · Upravil/a: _es
Bubák:
„Ale následující kód na řádcích 21-26 není v řádku, ale JS to nepozná, protože konce řádků jsou escapované.“ Tým by som si nebol istý, že to nepozná, niekde tvoria koniec riadku dva znaky a ak to interpret JS zle spracuje… |
||
Joan Profil |
#5 · Zasláno: 3. 9. 2010, 22:16:10 · Upravil/a: Joan
_es, Bubák:
Tak jsem schválně zkusila a) všechna zpětná lomítka odmazat a ponechat zbytek formátován stejně ---> pro řádek 21 jsem dostala chybovou hlášku "Unterminated string literal b) přidala jsem za všechna zpětná lomítka "n" jako odřádkování ---> stejná chyba c) Bubákův řádek ---> stejná chyba Takže ta lomítka nějaký význam mít musejí, s nimi to funguje, bez nich ne. Zkoušela jsem samostatně nastavit element.style.opacity = "opacity: " + o + ";" |
||
_es Profil |
#6 · Zasláno: 3. 9. 2010, 22:27:29 · Upravil/a: _es
Joan:
> Tak jsem schválně zkusila > a) všechna zpětná lomítka odmazat a ponechat zbytek formátován stejně Treba skúsiť zmazať lomítka aj so znakmi ukončenia riadka. Teda tak, aby z riadkov 21 až 26 bol len jeden riadok - tak, ako ho uvádza Bubák vo svojom poslednom príspevku. > Zkoušela jsem samostatně nastavit > element.style.opacity = "opacity: " + o + ";" To by malo byť skôr: element.style.opacity = o; o číslo od 0 do 1.
|
||
Joan Profil |
#7 · Zasláno: 3. 9. 2010, 22:55:44
...aby z riadkov 21 až 26 bol len jeden riadok - tak, ako ho uvádza Bubák vo svojom poslednom príspevku
I to jsem dřív zkoušela, ale si jsem někde udělala chybičku, protože zkopírovaný Bubákův kód už šlape jak má :) Řekla bych, že tam ty uvozovky všude být mají (když už jsou tam pluska na připojení řetězce), proto jsem napsala element.style.opacity = "opacity: " + o + ";" přičemž ale ani element.style.opacity = o; samostatně opravdu nedělá vůbec nic (ani chybu, ani zobrazení). |
||
_es Profil |
#8 · Zasláno: 3. 9. 2010, 23:09:18
Joan:
> přičemž ale ani element.style.opacity = o; > samostatně opravdu nedělá vůbec nic (ani chybu, ani zobrazení). Nie je náhodou o rovné 1? Alebo, nebolo to už nastavené na tú istú hodnotu?
Lebo mne JS odkaz: javascript:document.body.style.opacity=0.5;void 0; |
||
habendorf Profil |
#9 · Zasláno: 4. 9. 2010, 00:24:42
IMHO je úplně jedno, jestli se použije Chamurappiho nebo Bubákův (jednořádkový) zápis. Chápu to tak, že Chamurappi chtěl použít v tomto případě zápis obvyklý pro CSS.
selektor { vlastnost:hodnota; vlastnost:hodnota; } |
||
_es Profil |
#10 · Zasláno: 4. 9. 2010, 05:45:58 · Upravil/a: _es
habendorf:
„je úplně jedno, jestli se použije Chamurappiho nebo Bubákův (jednořádkový) zápis.“ No neviem, v jednej veľmi dobrej knihe je priamo písané, že ten Chamurappiho zápis možný nie je. To, že to funguje, ešte nemusí znamenať, že s tým nejaký prehliadač nemusí mať problémy. Keď aj nie priamo s tým kódom, tak pri kopírovaní kódu sa v niektorých editoroch môže znak konca riadka zmeniť - používajú sa rôzne znaky a kombinácie znakov ako konce riadkov. Ak bol ten príklad myslený ako príklad pre začiatočníkov, tak nespĺňa obvyklú vec pri takých príkladoch: Že sa dajú konce riadkov aj s medzerami za nimi zmazať bez straty funkčnosti - teda až na komentáre s // .
Ja by som to upravil skôr nejako takto: function zobrazit(co) { var obr = document.getElementById(co), krok = 0.05, o = krok; for(var i = krok; i <= 1; i += krok) { setTimeout(krokAnimace, i * 600); } function krokAnimace() { var of = Math.round((o) * 100); obr.style.cssText = "opacity: " + o + "; filter: alpha(opacity=" + of + "); -moz-opacity: " + o + "; -khtml-opacity: " + o + "; "; o += krok; } } setTimeout .
|
||
Joan Profil |
#11 · Zasláno: 4. 9. 2010, 20:56:19 · Upravil/a: Joan
_es:
Díky Ti moc! Toto Tvoje řešení mi přijde pro moje začátečnické mozkové závity mnohem názornější, protože má v setTimeoutu funkci bez argumentu, názorně definovaný krok a nemá anonymní funkci, která mi zatím moc neříká. Jenom prosím Tě proč, když tento řádek var obr = document.getElementById(co), krok = 0.05, o = krok; rozepíšu do tří řádků (vždy se středníky na konci samozřejmě a slovem var před o = krok tak mi konzola - ale až po kliknutí na tlačítko - napíše, že "krok is not defined"? Já mám za to, že jsem jej definovala. Nebo snad to, co je zapsáno na jednom řádku a oddělené čárkami má trochu jiný význam, než každá proměnná na samostatném řádku? A ještě dumám nad vztahem mezi "o = krok" a "var i = krok". Vím, že spolu velmi úzce souvisí, ale když jsem zkusila písmenka i a o zaměnit, tak to nefungovalo. Nebo to "o = krok" odpovídá jednotlivému kroku funkce krokAnimace a "var i = krok" setTimeoutu a aby se to nepletlo, tak musí být dvě proměnné, i když spolu související? Anebo proměnná i souvisí s vlastním krokem celého procesu a proměnná o s krokem "ztmavování" potažmo zobrazování obrázku? Když totiž proměnnou o nahradím íčkem, tak obrázek vyskočí okamžitě, ne postupně. EDIT: Zjistila jsem, že v 3.řádku lze vymazat o = krok a veškeré proměnné o nahradit proměnnou krok. Vono to funguje, ale je to jaksi trhanější a ne tak plynulé jako při Tvém řešení. Jak vidím není krok jako krok :) |
||
_es Profil |
#12 · Zasláno: 5. 9. 2010, 00:13:42 · Upravil/a: _es
Joan:
príkaz var obr = document.getElementById(co), krok = 0.05, o = krok; je ekvivalentný príkazu:
var obr = document.getElementById(co); var krok = 0.05; var o = krok; var , tak sa definuje trochu zvláštna globálna premenná, viď tu.
Len jedna premenná krok nestačí, lebo funkcia krokAnimace je vnorená do funkcie zobrazit a preto sú hodnoty premenných funkcie zobrazit pri jednotlivých volaniach funkcie krokAnimace zdieľané, trochu to je vysvetlené tu.
Teoreticky by stačili len premenné krok a i , kde by sa premenná i po tom cykle nastavila na hodnotu premennej krok , no nie je zvykom používať premennú z cyklu inde ako v cykle.
Ešte ma napadlo, že oproti pôvodnému kódu je rozdiel vo funkčnosti, ak sa nová animácia spustí vtedy, ak ešte beží stará. „ono to funguje, ale je to jaksi trhanější a ne tak plynulé“ Lebo vtedy premenná krok nebude rásť lineárne ale exponenciálne.
|
||
Witiko Profil |
#13 · Zasláno: 5. 9. 2010, 21:50:11 · Upravil/a: Witiko
Posílám sem mé řešení, které už nějaký ten pátek používám:
Funkce pro nastavení průhlednosti (navrací true / false při zadání chybné hodnoty): var setOpacity; if(isIE) { setOpacity = function(element, opacity) { if(typeof element != "object" || typeof opacity != "number" || opacity < 0 || opacity > 100) return false; if(typeof element.style != "object") return false; if(element.style.cssText == void(0)) return false; var cssText = element.style.cssText.split(";"); var found = false; var lowercase; for(var index=0;index<cssText.length;index++) { lowercase = cssText[index].toLowerCase(); if(lowercase.indexOf("filter:") > -1) { if(lowercase.indexOf("progid:dximagetransform.microsoft.alpha") > -1) found = true; break; } } if(found) { var index2 = cssText[index].toLowerCase().indexOf("progid:dximagetransform.microsoft.alpha"); var index3 = index2 + cssText[index].substr(index2).indexOf(")") + 1; if(opacity!=100) cssText[index] = cssText[index].substr(0,index2+39) + "(opacity = " + String(opacity) + ")" + cssText[index].substr(index3); else { if(regexp.test(cssText[index].substr(index3)) || regexp.test(lowercase.substr(index3).replace("filter:",""))) cssText[index] = cssText[index].substr(0,index2) + cssText[index].substr(index3); else cssText[index] = ""; } element.style.cssText = cssText.join(";"); } else if(opacity!=100) { element.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity = " + String(opacity) + ")"; } return true; } } else { setOpacity = function(element, opacity) { if(typeof element != "object" || typeof opacity != "number" || opacity < 0 || opacity > 100) return false; if(typeof element.style != "object") return false; element.style.opacity = opacity==100?"":opacity / 100; return true; } } Funkce pro samotnou animaci (navrací funkci, která při zavolání zruší veškeré zbývající setTimeouty a animaci tak přeruší): function retransparent(objectID,time,transparency_start,transparency_end,callback) { if(typeof objectID != "object") objectID = document.getElementById(objectID); if(!objectID) { if(typeof callback == "function") callback(); return function() {} } var calls = []; var ticks = Math.round(time / (1000 / FramesPerSecond)); var delta = transparency_end - transparency_start; var diff = delta / ticks; var previous; if(PerformanceSaver) previous = false; for(var index = 0; index <= ticks; index++) { if(!PerformanceSaver || Math.floor(transparency_start+(index*diff)) !== previous || index == ticks) { (function(index){ calls.push(window.setTimeout(function() { var opacity; if(index == ticks) opacity = transparency_end; else opacity = transparency_start+(index*diff); if(opacity > 0) { setOpacity(objectID, opacity); if(isHidden(objectID)) show(objectID); } else { setOpacity(objectID, opacity); if(isShown(objectID)) hide(objectID); } if(index == ticks && typeof callback == "function") {callback();} },index*(1000 / FramesPerSecond))); })(index); if(PerformanceSaver) previous = Math.floor(transparency_start+(index*diff)); } } return function() { for(var count = 0; count < calls.length; count++) { clearTimeout(calls[count]); } } } Ne, proměnné isIE (detekce Internet Exploreru, osobně používám momentálně výraz "\v" == "v", s MSIE 9 doufejme tyto šaškárny už nebudou třeba) a FramesPerSecond (60?) tu nejsou definované, ty nechávám na vás. Stejně tak proměnná PerformanceSaver (nevidím důvod proč nastavovat false, někdo může), jejíž funkce je popsaná zde: /* PerformanceSaver: When turned off, the opacity changes every 1000 / FramesPerSecond milliseconds which makes the animations as real as possible, but is pretty demanding regarding the browser resources. When turned on, opacity only changes when the opacity change exceeds 1% - the human eye won't notice. Also when turned on, the FPS settings affects mostly just the really fast animations, slow animations are affected by the Performance saver which makes the set FPS value insignificant, because the opacity doesn't get refreshed until the difference exceeds 1%. Retransparent document.body, transparency: 0 - 100, 30 seconds: PerformanceSaver off: 750 calls, 301.618ms total time PerformanceSaver on: 100 calls, 44.155ms total time Approximately 86.18% of the previously needed performance saved. The slower animation, the more significant. */ |
||
Joan Profil |
Nu, já jsem tušila, že ten řádkový zápis lze rozdělit na více řádků, ale někde jsem musela udělat chybu.
Jsi laskavý, že mi to tak podrobně vysvětluješ, už je mi to mnohem jasnější. Mým cílem je přetvořit si dosavadní fotogalerii, u které se po klikání na náhledy zobrazují velké obrázky a klikem na velký obrázek se tento zavře. Pokusila jsem se současný skript spojit s tím Tvým: // cast skriptu zobrazujici velky obrazek z nahledu po onclicku na nahled var kam = document.getElementById("umisteni"); //rodic pro snimek var snimek = document.createElement("img"); //do neho se otevira zvetsenina kam.appendChild(snimek); //kde se nachazeji nahledy: var nahled = document.getElementById("zatoka-galerie").getElementsByTagName("a"), krok = 0.05, o = krok; for (var i=0; i<nahled.length; i++) //nahled.length = pocet nahledu { nahled[i].onclick = function() { snimek.src = this.href; snimek.style.position = "absolute"; snimek.style.display = "block"; //bez nej se neotevre po zavreni dalsi nahled snimek.style.marginLeft = "-520px"; snimek.style.marginTop = "50px"; snimek.style.padding = "6px"; snimek.style.backgroundColor = "#ffffaa"; snimek.style.border = "2px solid green"; return false; //cast skriptu se snahou o postupne zjevovani obrazku for(var k = krok; k <= 1; k += krok) { setTimeout(krokAnimace, k * 600); } function krokAnimace() { var of = Math.round((o) * 100); snimek.style.cssText = "opacity: " + o + "; filter: alpha(opacity=" + of + "); -moz-opacity: " + o + "; -khtml-opacity: " + o + "; "; o += krok; } } } //cast skriptu na zavreni velkeho obrazku onclickem snimek.onclick = function() { snimek.style.display = "none"; snimek.style.padding = 0; snimek.style.border = 0; } snimek.src = this.href; Výše uvedený "kombi-skript" mám zatím pouze na localhostu, chybu to žádnou nehází, leč nefunguje postupné zjevování obrázku. Zradu tuším v těchto místech: 1) potřebuji vlastně na jedno kliknutí spustit současně dvě různé funkce: jednu na zobrazení velkého obrázku, druhou na jeho postupné zobrazování - je to dovoleno? 2) mám dva různé FOR cykly - je možné použít je současně anebo je musím spojit do jednoho, přestože každý vyžaduje jiné kroky? 3) myslela jsem, že proměnná i v prvním FOR cyklu se tluče s proměnnou i v druhém FOR cyklu, tak jsem tu druhou přejmenovala na k - ale nepomohlo to. Vidí vůbec nějak na sebe tyto dvě různé, ale související proměnné? 4) záleží na pořadí funkcí na samotné zobrazení a na postupné zobrazení nebo ne? 5) mám mlhavé tušení, že bude potřeba ten lexikální uzávěr, pletu se? Budu vděčná za popostrčení blíže k cíli, děkuji! |
||
Witiko Profil |
#15 · Zasláno: 5. 9. 2010, 22:03:41 · Upravil/a: Witiko
Zdá se mi to (v tom kódu se špatně orientuje), nebo na konci nadřazeného cyklu soustavně redefinuješ lokální funkci krokAnimace?
1) Máš nějaký důvod domnívat se, že by to nemělo být dovoleno? :) 2) Jistěže je možné cyklit cykly. ;) 3) Jistě, že na sebe vidí. Lokální proměnná je viditelná z kontextu funkce ve které byla definována a všech podřazených strukturách. Leč do globálního scope se nedostane. 4) A proč to jednoduše neudělat v tomto sledu: display:hidden, opacity:0, display:ok, plynulá animace. Pokud se to udělá takto, k žádnému probliknutí nedojde. 5) Nebude, jelikož je to celé splácané na úrovni globálního scope a proto skutečně není potřeba zachovávat žádné lokální přoměnné už jenom proto, že lokální proměnné jsou tu jen dvě, jedna by tu vůbec nemusela být (k), druhá funguje jen na výběr z pole (i). setTimeout(krokAnimace, k * 600); - krokAnimace by měla být neměnná a statická funkce. A vzhledem k tomu, že se argumenty nepředávají z lokálních proměnných, ale funkce pracuje s proměnnými globálními, je možný tento zápis, který eliminuje potřebu lexálního uzávěru. |
||
Joan Profil |
#16 · Zasláno: 5. 9. 2010, 22:11:21
Witiko:
Hm, obávám se, že Ti nedokážu odpovědět... Zatím jsem jen "slepila" dva skripty, které samostatně fungují, dohromady a bez toho, aby konzola házela chybu. 1) fungující skript na okamžité zobrazení velkého obrázku z náhledu: var kam = document.getElementById("umisteni"); //rodic pro snimek var snimek = document.createElement("img"); //do neho se otevira zvetsenina kam.appendChild(snimek); var nahled = document.getElementById("zatoka-galerie").getElementsByTagName("a"); /*kde se nachazeji nahledy*/ for (var i=0; i<nahled.length; i++) //nahled.length = pocet nahledu { nahled[i].onclick = function() { snimek.src = this.href; snimek.style.position = "absolute"; snimek.style.display = "block"; //bez nej se neotevre po zavreni dalsi nahled snimek.style.marginLeft = "-520px"; snimek.style.marginTop = "50px"; snimek.style.padding = "6px"; snimek.style.backgroundColor = "#ffffaa"; snimek.style.border = "2px solid green"; return false; } } snimek.onclick = function() //zavreni velkeho obrazku onclickem { snimek.style.display = "none"; snimek.style.padding = 0; snimek.style.border = 0; } snimek.src = this.href; 2) fungující skript na postupné zobrazování (i když po kliknutí na tlačítko, nikoli přímo na obrázek): <script language="JavaScript" type="text/javascript"><!-- function zobrazit(co) { var obr = document.getElementById(co), krok = 0.05, o = krok; for(var i = krok; i <= 1; i += krok) { setTimeout(krokAnimace, i * 600); } function krokAnimace() { var of = Math.round((o) * 100); obr.style.cssText = "opacity: " + o + "; filter: alpha(opacity=" + of + "); -moz-opacity: " + o + "; -khtml-opacity: " + o + "; "; o += krok; } } //--> </script> </body> <img id="obrazek" src="1.jpg" style="visibility: hidden"><br><br> <input type="button" value="Plynule zobrazit" onclick="zobrazit('obrazek')"> </body> No a potřebuji je propojit tak, aby se obrázek z náhledu zobrazoval nikoli naráz jako dosud, ale postupně. |
||
Witiko Profil |
#17 · Zasláno: 5. 9. 2010, 22:15:53 · Upravil/a: Witiko
Nejsem moudrý z deklarace funkce zobrazit. Proč definuješ funkci krokAnimace UVNITŘ dané funkce (funkce se bude definovat znovu a znovu při každém volání)? Navíc až ZA cyklem, takže ve chvíli kdy v cyklu voláš setTimeout(krokAnimace, i * 600); žádná funkce krokAnimace neexistuje? +Celkově daná animace působí zvláštně, čas a krok je vycucaný z prstu, nebo je poměr vypočítaný tak, aby se dosáhnulo užŕčitého počtu snímků za sekundu tak, aby byl spokojený jak prohlížeč, tak oči návštěvníka?
|
||
Chamurappi Profil |
#18 · Zasláno: 5. 9. 2010, 22:19:46
Reaguji na Witika:
„funkce se bude definovat znovu a znovu při každém volání“ Nebude. Každý výkonný blok skriptu se vyhodnocuje dvoukrokově, nejprve se najdou všechny deklarace proměnných a funkcí, pak teprve se vyhodnocují příkazy. Proto je možné i volat funkci, která je definovaná až za tím voláním. |
||
Witiko Profil |
#19 · Zasláno: 5. 9. 2010, 22:23:02 · Upravil/a: Witiko
Stejně však nevidím důvod proč uvnitř funkce definovat lokální funkci, která zaniká po ukončení činnosti funkce nadřazené. :)
|
||
_es Profil |
#20 · Zasláno: 5. 9. 2010, 22:31:46
Witiko:
„Stejně však nevidím důvod proč uvnitř funkce definovat lokální funkci, která zaniká po ukončení činnosti funkce nadřazené. :)“ Ale ona nezaniká, lebo je v tom cykle niekoľko krát priradená do časovača setTimeout .
Zanikne až po dokončení všetkých tých časovačov. A vo vnútri inej funkcie je definovaná preto, aby mala prístup k premenným tej funkcie a tie premenné teda do skončenia časovačov tiež nezanikajú. |
||
Witiko Profil |
#21 · Zasláno: 5. 9. 2010, 22:50:08
_es
To samozřejmě vím, jen jsem si nevšimnul, že var obr = document.getElementById(co), krok = 0.05, o = krok; je deklarováno uvnitř funkce, četl jsem špatně a myslel jsem, že jde o globální proměnné - viz. [#14] Joan, kde to tak vypadá. |
||
Joan Profil |
#22 · Zasláno: 5. 9. 2010, 23:01:49
Já vím, že to mám zatím jen "sešpendlené" pomocí svých skrovných znalostí a aspoň tak, aby to neházelo chybu. Na plnohodnotné "sešití" zatím nemám, zasekla jsem se na své dosavadní neschopnosti poprat se s oběma FOR cykly a s hafem funkcí...
|
||
_es Profil |
#23 · Zasláno: 5. 9. 2010, 23:20:18
Joan:
„No a potřebuji je propojit tak, aby se obrázek z náhledu zobrazoval nikoli naráz jako dosud, ale postupně.“ Mne zase takéto samoúčelné postupné animácie dosť vadia. Ak chcem vidieť fotografiu, tak nech je to čo najrýchlejšie. Podľa mňa by bolo lepšie, ak by sa fotografia objavila ihneď a nejaká animácia bola až dodatočne k tomu - napríklad nejaká animácia orámovania okolo obrázka. |
||
Witiko Profil |
#24 · Zasláno: 5. 9. 2010, 23:33:17 · Upravil/a: Witiko
Joan
Pokud ti nejde o to vytvořit to sama, můžeš klidně použít funkce, které jsem posílal. [#13] /* Prvně se deklarují konstanty (isIE se může vyhodit a deklarovat přímo před funkcí, jelikož se použije jen jednorázově při načítání) */ var FramesPerSecond = 60, /* Počet snímků za sekundu, počítá se z něj čas jednotlivých timeoutů */ isIE = "\v" == "v", /* Proměnná, která indikuje, jde-li o Internet Explorer, aby se nemusel složitě parsovat cssText v ostatních prohlížečích */ PerformanceSaver = true; /* Vysvětleno v postu #13, při true se mění opacity jen pokud změna přesahuje jedno procento. Šetří výkon. */ /* Sem přijdou deklarace z postu #13 */ retransparent(/* obrázek (buďto ID daného obrázku nebo rovnou pointer na objekt), čas animace (v milisekundách), počáteční opacity (0), konečná opacity (100), funkce která se zavolá po dokončení animace (function() {alert("Milí návštěvníci, právě jste byli svědky mé úžasné animace. Jistě jste tak nadšeni jako já!");}) */); /* Funkce navrátí funkci, která po zavolání animaci přeruší */ |
||
Joan Profil |
#25 · Zasláno: 5. 9. 2010, 23:53:36
Samozřejmě bych to chtěla vytvořit a hlavně pochopit sama :-) . Jen jsem sotva "strávila" jeden postup a Ty mi nabízíš diametrálně odlišný :)
Dobře, já teda nechám vyskakovat obrázky naráz (díky vám oběma za názor), i když by to bylo mnohem rychlejší než Lightbox a jiný -box, ale stejně by mě z principu zajímalo, jak tyhle dvě funkce slepit dohromady, i kdybych to použila někde úplně jinde. Tak já si ještě budu lámat hlavu dál, zatím dobrou noc. |
||
Witiko Profil |
#26 · Zasláno: 5. 9. 2010, 23:59:31
Pokud si rozpitváš funkci, kterou jsem posílal (retransparent), zjistíš, že nejde o nic diametrálně odlišného. Jde o to samé, co děláš ty, jen se na nastavení samotné průhlednosti používá externí funkce a místo nahození kroku a intervalu mezi změnami animace od oka se intervaly vypočítají ze zadaného počtu snímků za sekundu.
Momentálně nemám dostatek síly zjišťovat, kde je v tvém scriptu chyba. Snad zítra. :) |
||
Joan Profil |
#27 · Zasláno: 6. 9. 2010, 09:54:04 · Upravil/a: Joan
Witiko:
Momentálně nemám dostatek síly zjišťovat, kde je v tvém scriptu chyba. Snad zítra. :) Jsi hodný, díky, ale já to ještě zkusím sama :). V noci mě něco napadlo (já totiž nepočítám ovečky, ale přemýšlím nad pokračujícím řešením od chvíle, kdy odpadnu od počítače). P.S.: Tvoje řešení je na mě zatím příliš "profesionální", promiň, skript, který mi poradil _es je mi srozumitelný a je jednoduchý a stejně rychlost zobrazování navolím od oka, zatím budu zkoušet. EDIT! Jsem z toho ještě trochu tak říkajíc na větvi, ale mně se doopravdy podařilo přijít na požadované řešení. Pravdou ovšem je, že to prapůvodní je vážně příjemnější, _es má pravdu :) A navíc při kliknutí na jakýkoliv náhled hned PO natažení stránky má plynule se zobrazující zvětšenina tendenci napřed problesknout do levého dolního rohu (kde se mi zobrazovala, než jsem přidala stylovací položky k snimek.style..., takže asi jsou na nevhodném umístění ve skriptu, že? Po klikání na další náhledy je už vše v pořádku. V obou příkladech fotogalerií se velké obrázky zavřou klikem na ně. Závěr: nechám fotogalerii radši bez použití opacity, ale jsem zas o kus dál v Javascriptu :) Hezký den. |
||
Chamurappi Profil |
#28 · Zasláno: 6. 9. 2010, 17:32:32
Reaguji na _es:
„v jednej veľmi dobrej knihe je priamo písané, že ten Chamurappiho zápis možný nie je“ Ve které a proč? Poslední dobou takto escapuji konce řádků docela často a ještě jsem nenarazil na problém. Skripty píšu nejčastěji v notepadu, který odřádkovává dvojznakem CRLF — pokud mi tohle všude funguje, v čem může být háček? „Ak bol ten príklad myslený ako príklad pre začiatočníkov, tak nespĺňa obvyklú vec pri takých príkladoch“ Byl tak myšlený a opravdu jsem ho moc nedomyslel. I když tedy to, že kód v začátečníkovi vyvolá úžas a probudí další zvědavost, nemusí být na škodu :-) Při psaní svého skriptu jsem předpokládal (už ani nevím přesně proč), že ten, kdo ho bude používat, zatouží i po opačné animaci, proto jsem udělal krokAnimace nezávislý na směru animace.
Reaguji na Joan: „bylo by stylování možné rozepsat normálním způsobem s opakovaným element.style… pro každou vlastnost pro mé pochopení?“ Bylo, ale musela bys dávat pozor na rozdíly mezi prohlížeči. Obecně bývá lepší na element.style nesahat a měnit jen třídu (tedy element.className ), kterou máš už připravenou ve stylopisu. V případě změny průhlednosti bys těch tříd potřebovala docela hodně, u té se to nevyplácí, ale ty ostatní vlastnosti, které měníš, bych na tvém místě nenastavoval individuálně.
Reaguji na Witika: „Funkce pro nastavení průhlednosti“ Ta je nějaká zbytečně divoká, ne? V Exploreru přeci není nutné pitvat cssText .
|
||
_es Profil |
#29 · Zasláno: 6. 9. 2010, 18:18:13 · Upravil/a: _es
Chamurappi:
„Ve které a proč?“ Je to v knihe David Flanagan JavaScript kompletní průvodce, 2. vydání, na konci časti 3.2.2. Je však možné, že som to zle, alebo len český preklad, zle pochopil. Cez internet prístupnú verziu s anglickým textom som našiel tu. „Skripty píšu nejčastěji v notepadu, který odřádkovává dvojznakem CRLF — pokud mi tohle všude funguje, v čem může být háček?“ Možno v tom, že v niektorom prehliadači sa LF do reťazca vloží a v niektorom nevloží, alebo sa vloží vo všetkých.
Alebo v tom, že niektorý prehliadač bude považovať znak LF za znak konca riadka a teda syntaktickú chybu.
|
||
Davex Profil |
#30 · Zasláno: 6. 9. 2010, 18:50:12
Chamurappi:
„Skripty píšu nejčastěji v notepadu, který odřádkovává dvojznakem CRLF — pokud mi tohle všude funguje, v čem může být háček?“ Cvičně jsem si ukázkový kód nechal zkomprimovat tady: http://compressorrater.thruhere.net/ a nic rozumného z toho nevylezlo. Některé kompresory si s tím poradí, ale pro univerzální použití se to asi moc nehodí. |
||
Téma pokračuje na další straně.
|
0