Autor Zpráva
Joan
Profil
Snažím se vytvořit script na postupné zvětšování a nazpátek zmenšování (miniatur) obrázků ve fotogaleriích klepnutím na ně. Vycházela jsem z tohoto návodu, jenže mně to nejelo. Navíc chci klikat na obrázek a ne na tlačítko vedle. Tak jsem se pokusila script poupravit.
Jenomže moje dosavadní snažení nefunguje a navíc chybová konzola nehlásí žádnou chybu, takže se nemám od čeho "odrazit".
Co mám prosím změnit, vyhodit nebo upravit? Mám těch fotogalerií na stránkách vícero, tak budu potřebovat spíše univerzálnější script. Obdélníkové miniatury i obrázky budou vždy stejné velikosti, jen některé vyjímečně na stojato.
Díky předem a hezký den!
Kajman_
Profil *
Zkuste tomu obrázku měnit vlastnost width. Bez toho se zvětšovat ani zmenšovat nebude. Také by bylo lepší, kdyby se jen spouštělo zvětšování nebo zmenšován a ne oboje najednou.
Joan
Profil
Kajman:
Zkuste tomu obrázku měnit vlastnost width
Však je ve scriptu nastaveno zvětšování a zmenšování po 3 pixelech.

Také by bylo lepší, kdyby se jen spouštělo zvětšování nebo zmenšování a ne oboje najednou.
Jak to ale udělat, když na JEDEN obrázek potřebuji aplikovat celkem DVĚ různé akce?
Chamurappi
Profil
Reaguji na Joan:
Z tvého kódu:
timer = setTimeout("zvetsi('min', 'id', 'max')", 10);
V drtivé většině programovacích jazyků (včetně JavaScriptu) se názvy proměnných v zápisu řetězce nenahrazují automaticky za hodnotu. Takže za deset milisekund zavoláš funkci zvetsi, které předáš jako argumenty tři řetězce. V JavaScriptu se řetězce spojují plusem. Kdyby sis chtěla načasovat poskládané volání podobné tomu, které máš v onclicku, vypadalo by to takhle:
timer = setTimeout("zvetsi('" + min + "', '" + id + "', '" + max + "')", 10);
Ale to není doporučeno. Čistší postup je předat jako argument funkci, která se po uplynutí času zavolá. Platí totiž, že pokud je jedna funkce zapsaná uvnitř druhé funkce, platí v ní i proměnné z té druhé (pro začátečníka to asi nebude úplně snadné na pochopení). Takže asi takto:
timer = setTimeout(function()
{
  zvetsi(min, id, max);
}, 10);

Další problém vidím v datových typech. Pokud máš '300' v proměnné min, je to řetězec. Přičteš trojku a co dostaneš? Také řetězec, konkrétně '3003'. S čísly pracuj jako s čísly, nedávej je do uvozovek.

Dále nevím, co chceš vyjádřit tímto kouskem kódu:
var id = document.getElementById(id);
Jestli je to pokus o nějakou zkratku pro funkci document.getElementById, tak by musel vypadat takhle:
var id = document.getElementById;
… a pak by v id byla funkce, tzn. id("obr_1") by ti vrátilo totéž, co document.getElementById("obr_1"). Ale o to ti asi nešlo, protože tuhle globální proměnnou id ani nikde nepoužíváš (argument id uvnitř funkcí zvetsi a zmensi je už jiná proměnná). Pro začátek raději rozepisuj document.getElementById, kdykoliv chceš najít element podle id.

clearTimeout('timer');
Funkce clearTimeout přijímá jako argument číslo timeoutu, nikoliv řetězec. A i tak je to zbytečné, protože timeout se vykonává jen jednou, není třeba ho při posledním běhu rušit (stačí nenastavit ten nový).

Nevšiml jsem si, že bys někde nastavovala šířku na tu proměnnou min. Měla bys někde mít cosi jako:
document.getElementById(id).width = min;
Joan
Profil
Ó, děkuji Chamurappi za Tvůj čas na tak obsáhlé vysvětlení!

...které předáš jako argumenty tři řetězce. V JavaScriptu se řetězce spojují plusem...
Spojovat proto, aby se předaly všechny tři argumenty a ne třeba jen jeden? A proč jsou tam současně uvozovky i apostrofy u každého argumentu?

...Čistší postup je předat jako argument funkci, která se po uplynutí času zavolá...
Tak toto chápu o hodně víc než ten přehršel uvozovek a apostrofů u těch argumentů.

Pro začátek raději rozepisuj document.getElementById, kdykoliv chceš najít element podle id.
Však o toto se taky celou dobu snažím, ale jak vidím, tak špatně.

var id = document.getElementById;

… a pak by v id byla funkce
Myslela jsem, že var pouze uvozuje proměnnou - jak poznám, že je tam ještě funkce? A proč nemá argument (id) a tento kód
document.getElementById(id).width = min;
ho má?

argument id uvnitř funkcí zvetsi a zmensi je už jiná proměnná
No tak teď už teda vůbec nevím, jak proměnné deklarovat, aby funkce "věděly", kde je hledat...

Ale přesto se mi podařilo obrázek aspoň částečně rozhýbat! A přišla jsem při tom na toto:

1) při použití:
document.getElementById(id).style.width = min;
  document.getElementById(id).style.width = max;

anebo obráceném pořadí bez STYLE:
min = document.getElementById(id).width;
  max = document.getElementById(id).width;


se malý obrázek rychle zvětšil, pomalu zmenšoval a zase rychle nakynul do max velikosti. A konzola nehlásila žádnou chybu! Což by šlo třeba použít na rychle vyběhnuvší nadpis, jeho pomalé zmenšení a zase rychlé zvětšení :-).

2) pod definování funkce zmensi(max, id, min) jsem už slovo style přidat nesměla, protože došlo k chybě parsování vlastnosti "width" (této frázi moc nerozumím...) a obrázek se ani nepohnul.
Kdy se tedy píše element.style.width a kdy pouze element.width?

3) pokoušela jsem se oddělit akci zvětšování obrázku od jeho (kliknutím) zmenšování např. takto:
<a href="#"><img src="endy.jpg" border="2px" style="color: green;" width="150px" id="obr_1" onClick="zvetsi(150, 'obr_1', 300);  if(max >= min) {zmensi(300, 'obr_1', 150);}"></a>


a taky takto:
<a href="javascript: zvetsi(150, 'obr_1', 300);"><img src="endy.jpg" border="2px" style="color: green;" width="150px" id="obr_1" onClick="zmensi(300, 'obr_1', 150);"></a>


ale ani jedno nefunguje. Zvláštní je, že obrázek se zvětšoval po kliknutí sám od sebe, přestože jsem funkci "zvetsi" z HTML dokonce vymazala.
No bude to ještě běh na dlouhou trať - ale ať :-)
Joan
Profil
Juchuchuuu!!
Tak se mi podařilo kápnout na způsob zvětšování a zase zmenšování obrázků ve fotogalerii. Ještě to potřebuje dost dobrousit, ale víceméně to hlavní už mám. Zatím mám fotogalerie řešené tak, že miniatura 120x90 px je v SRC a velký obrázek 640x480 px je v A HREF a otevírá se do nového okna:
<div class="pic"><a href="obrazky/z1.jpg" title="Kliknutím zvětšíte"><img src="obrazky/z1-nahled.jpg" width=120 height=90 alt="Po příjezdu na Sluneční zátoku" /></a><p>Těsně po příjezdu</p></div>

Potřebovala bych prosím popostrčit v těchto směrech:

1) můj dosavadní způsob funguje i bez Javascriptu, protože kód obsahuje oba obrázky: malý i velký. Při mém javascriptovém měnění velikosti obrázku mám v kódu pouze jeden obrázek, ten velký, jehož velikost jsem do SRC natvrdo zmenšila zadáním rozměrů náhledů, protože zvětšená miniatura vypadala velmi nepěkně. Ale mám jen jeden zdrojový kód pro obě řešení (bez i JS) a netuším, jak toto obejít.

2) zvětšené obrázky mi zajíždějí pod ostatní a prootže je mám plovoucí, tak na ně z-index nefunguje!

3) obrázek se zvětšuje docela trhaně, nejen na mém ultrapomalém netboku Acer One A110. Je to normální?

4) Při kliknutí se odhadem o 3px zmenší a pak teprve rozběhne do VGA velikosti. Stejně tak po návratu obrázku na výchozí velikost 120x90 px tyto rozměry "přejede" a zůstane o fous menší. Zkoušela jsem to opravit ale nepodařilo se.

5) ráda bych, aby se zvětšený obrázek zobrazoval uprostřed galerie, ale když napíšu
idImg.style.position = "absolute";
tak už se mi nepodařilo nikam funkčně umístit top a left.

Byl by prosím někdo tak trpělivý a vysvětlil mi, jak tyto chyby odstranit? Moc děkuji předem!
_es
Profil
Joan:
Do atribútu width značky img patrí len číslo - šírka v pixeloch, teda bez toho px.
Atribút onclick sa dá zadať aj pre img a potom môžeš do funkcie predať priamo objekt obrázka: onclick="funkcia(this, ďalšíParameter)".
Rozmery obrázka sa dajú nastavovať aj bez vlastnosti style: objektObrázka.width = číslo;
Môžeš sa inšpirovať napríklad v tomto krátkom kóde.
Joan
Profil
Díky za odpověď! Pokoušela jsem se tím prokousat, opravila jsem snadno jen "width" bez pixelů.
Já mám jeden onClick v odkazu a s atributem href na zvětšení obrázku, druhý onClick je u img zase na zmenšení obrázku. Když jsem tam zadala do závorky slovo this, tak obrázek přestal reagovat tím směrem, ve kterém onClicku jsem tu změnu udělala.
Na Tvůj odkaz jsem se dívala, ale nejsou mi jasné ty dvě pomlčky za vykřičníkem, to vidím poprvé
function f(){ if(!--img.height) clearInterval(i);}

Bohužel ale nemůžu přijít ani na to, kam do zdroje zadat správně veliké obrázky: chci, aby bez JavaScriptu fotogalerie po kliknutí na náhled zobrazovala velký obrázek, takže musím mít ve zdroji v SRC náhled a v A HREF velký obrázek, jenomže v tomto případě se zase zvětšuje miniatura, která je po zvětšení škaredá.
Hmm, asi jsem si ukousla pro začátek příliš veliké sousto a fotogalerie si budu muset udělat zatím jednodušeji...
_es
Profil
Joan:
nejsou mi jasné ty dvě pomlčky za vykřičníkem
Výkričník je logická negácia a dve pomlčky je operátor dekrementácie - zmenšenia o 1.
Testuje sa, či výška nulová a zároveň sa výška zmenšuje.

Když jsem tam zadala do závorky slovo this
this je objekt, kde došlo k udalosti, teda na čo sa kliklo.

Ak si v tom kóde upravíš podmienku a vhodne zmeníš parametre, tak by nemalo byť obtiažne to použiť.
V kódoch v tejto diskusii sa automaticky vytvárajú odkazy na dokumentáciu, to by ti mohlo tiež pomôcť.
Joan
Profil
_es:
uáá, dekrementaci znám, jen mi to nedocvaklo.
Mohu ještě poprosit o vysvětlení, proč v tomto kódu
timer = setTimeout("zvetsi('" + min + "', '" + id + "', '" + max + "')", 10);
jsou uvozovky ještě navíc uvnitř apostrofů? Viděla jsem i obrácenou verzi, kdy apostrofy byly uvnitř uvozovek. Vím, že s uvozovkami se vypíše název proměnné, bez uvozovek hodnota proměnné, ale proč jsou dvojí, to namouduši netuším. Plusko je na připojení, že.
Děkuju moc za vysvětlení
panther
Profil
Joan:
Mohu ještě poprosit o vysvětlení, proč v tomto kódu [...] jsou uvozovky ještě navíc uvnitř apostrofů?
řetězec v setTmeout je obalen uvozovkami, jednotlivé parametry uvozovkami. Řetězec je několikrát ukončen (uvozovka za apostrofem), protože min, id a max jsou proměnné. Za proměnnou se uvozovkou znovuotevře řetězec, aby v něm mohl být apostrof a čárka. Plus je spojení řetězců.

Ve výsledku, když doplním za proměnné hodnoty, to může vypadat např. takto:
timer = setTimeout("zvetsi('10', '2', '100')", 10);


Když si všimneš obarvení zde na diskusi, červeně jsou řetězce (textové), zeleně proměnné a modré jsou funkce s odkazem na dokumentaci funkce.

Viděla jsem i obrácenou verzi, kdy apostrofy byly uvnitř uvozovek.
stejná situace, řetězce lze uzavírat do apostrofů i uvozovek. Článek na toto téma napsal tiso.
_es
Profil
panther:
řetězec v setTmeout je obalen uvozovkami, …
Nie je dobré dávať do setTimeout textový reťazec.
panther
Profil
_es:
Nie je dobré dávať do setTimeout textový reťazec.
to netvrdím, navíc to psal už [#4] Chamurappi. Na konrkétní ukázce, kde se Joan ptala, proč je tam těch uvozovek a apostrofů tolik, to řetězec byl - vyskakování z řetězce kvůli proměnné a hodnoty proměnných obalené apostrofy (to, že to jsou čísla a v této funkci to není nejvhodnější, je věc jiná). Princip je zřejmý.
Joan
Profil
Děkuji vám oběma! Teda mě ale vůbec nenapadlo, že řetězec je uvnitř funkce nutné ukončovat. Vytiskla jsem si to (barevně) a budu nad tím přemýšlet.
panther
Profil
Joan:
Teda mě ale vůbec nenapadlo, že řetězec je uvnitř funkce nutné ukončovat.
nejde o řetězec ve funkci, ale o to, že v něm je proměnná.

<script>
var promenna = 'hodnota';
document.write("promenna"); // vypise "promenna"
document.write(promenna); // vypise "hodnota"
document.write("hodnota promenne je " + promenna); // vypise "hodnota promenne je hodnota"
document.write("hodnota promenne je '" + promenna + "'"); // vypise "hodnota promenne je 'hodnota'"
document.write("hodnota promenne je \"" + promenna + "\""); // vypise "hodnota promenne je "hodnota""

//pripadne s odradkovanim na vystupu
var promenna = 'hodnota';
document.write("promenna<br>"); // vypise "promenna"
document.write(promenna + "<br>"); // vypise "hodnota"
document.write("hodnota promenne je " + promenna + "<br>"); // vypise "hodnota promenne je hodnota"
document.write("hodnota promenne je '" + promenna + "'"); // vypise "hodnota promenne je 'hodnota'"
</script>
Joan
Profil
panther:
Děkuji mnohokrát - přesně tohle jsem potřebovala (na zředění toho javascriptového guláše v hlavě)
Hezký den :-)

EDIT: no paráda, už je mi to "ouplně" jasné! Celá pro mě záhada spočívala v mém nepochopení, které že dvojice uvozovek patří k sobě.,u jednoduchého řetězce mi to bylo jasné hned. Ale tady je vlastně 1.řetezec (v uvozovkách), proměnná (bez uvozovek), 2.řetězec (zase v uvozovkách), proměnná (bez uvozovek) atd.
Díky za vše, už můžu zase šlápnout na plyn :-)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0