webForumDet fria alternativet

Animera bredden på en bild med setTimeout?

14 svar · 324 visningar · startad av haider

haiderMedlem sedan jan. 2003988 inlägg
#1

Hej

Jag har en bild som är inställd med en bredd på 3px. Jag vill låta animera bredden till 30 pixlar.

Använder man setTimeout() då eller?

Kan nån hjälpa mig med kodsnutten?

Tack :OO

JojoxxMedlem sedan juni 20004 306 inlägg
#2
<img src="http://www.webforum.nu/images/wfstandard/logo_webforum.gif" width="3" height="58" name="mypic" alt="..."/>
<script type="text/javascript">
var bredd=281;
function bredare(){
	document.images['mypic'].width+=5;
	if(document.images['mypic'].width<bredd){ setTimeout("bredare()",50); } else { document.images['mypic'].width=bredd; }
}
bredare();
</script>

...kanske.

nitro2k01Medlem sedan aug. 20037 630 inlägg
#3

För att det ska vara helt korrekt skall bredare() läggas i window.onload:

 
window.onload=function(){
  bredare();
}

... eller ...

<body onload="annat(); bredare();" >
haiderMedlem sedan jan. 2003988 inlägg
#4

Menar du, att man inte ska skriva bredare(); i slutet av skriptet, och istället anropa det från ex. body?

JojoxxMedlem sedan juni 20004 306 inlägg
#5

Det Nitro menar är att för att vara säker på att bilden finns vid det tillfälle då scriptet exekveras bör man lägga det i ett event (vilken av varianterna spelar ingen roll). Detta gäller oavsett vad det är för script. Men både ny och gammal objektmodell i såväl Mozilla (Netscape), IE och Opera ger dig access till objektet så fort det är skapat. Exemplet funkar alltså som det är, om du däremot byter plats på script och bild kommer det inte att fungera eftersom bilden inte finns när scriptet körs.

Se sidan som en bok du läser. Du kan bara refferera till saker som du redan läst. Vad som kommer att hända på nästa sida vet du inte än - på samma sätt kan webbläsaren inte veta vad som kommer att komma senare i koden utan bara komma åt sådant som den redan "läst".

nitro2k01Medlem sedan aug. 20037 630 inlägg
#6

Min punkt är att man alltid ska göra det till en vana att lägga skript som kallar på ett DHTML-objekt i onload så att man är säker på att de är laddade. (Vissa nybörjare, inklusive jag en gång i tiden, förstår inte skillnaden mellan att placera koden föra eller efter en bild.)

PepeJeriaMedlem sedan feb. 2003779 inlägg
#7

En annan variant på Jojoxx:s script är att köra onload på <img> taggen, då kan man skicka med bildens namn o slutbredd till funktionen + att man kan använda funtionen på andra bilder.

<img src="http://www.webforum.nu/images/wfstandard/logo_webforum.gif" width="3" height="58" name="mypic" onload="bredare(this.name, 281)" alt="..."/>
<script type="text/javascript">
function bredare(name, bredd)
{
	document.images[name].width+=5;
	if(document.images[name].width<bredd) window.setTimeout("bredare(\"" + name + "\", " + bredd + ")",50);
	else document.images[name].width=bredd;
}
</script>
Erik JuhlinMedlem sedan maj 20007 625 inlägg
#8

Att använda onload i img-taggen är inte standard och funkar då antaligen inte så bra i andra webbläsare än Internet Explorer.

http://www.devguru.com/Technologies/html/quickref/html_img.html

PepeJeriaMedlem sedan feb. 2003779 inlägg
#9

Så vitt jag vet funkar det i Opera, Netscape (även version 3 & 4), IE, Mozilla och andra.

Att något inte är del av standarden betyder inte att man kan använda det eller att browsers inte implementerat det. Tex så har nya browsers stöd för innerHTML, scrollTop/Height, clientWidth etc...

Jesper TMedlem sedan nov. 20017 058 inlägg
#10

Skall det inte var +'px' för att det skall vara crossbrowser?

PepeJeriaMedlem sedan feb. 2003779 inlägg
#11

Nej, scriptet sätter inte en css width (sträng), utan bildens width property som är en number.

haiderMedlem sedan jan. 2003988 inlägg
#12

Tack alla.

Nitro: Jo, detta nybörjarproblem som du nämner stöter jag på hela tiden. Troligen kommer jag att vara nybörjare resten av livet :-/
Hur som helst, så resulterar fel oftast felmeddelanden, då brukar jag ta till alert() för att få visuell feedback, för att se hur skript reagerar på olika ställen. Jag vet, det är mycket

nybörjaraktigt, men så är jag ju en extrem nybörjare.

Pepe: Tack för ditt inlägg. Även om jag använder jojoxx enkla bredare(), så sparar jag på din, eftersom den känns "renare" med möjligheten till att styra namn o bredd bredare(name,bredd)

För alla andra som är nyfikna på resultatet, så kan ni se det här: https://www.3d.stenebyskolan.se/haider/test/imgloader.htm
Själva slutresultatet är inte färdigt än, jag kommer att skapa en tråd senare om hur man kan köra slideit(), så att man har nr + bild i parantesen; slideit(nr,namn), så att jag via olika länkar kan

ersätta den befintliga slideshow med någon annan.

Dessutom kommer denna kod att bakas samman med ett annat ärende som finns att läsa på tråden:

http://www.webforum.nu/showthread.php?s=&threadid=90120&forumid=24

En sista sak: Om ni besöker sidan med image-loader-slideshowen, så kommer ni att notera att "bredaren", dvs funktionen för den lilla gråa slidern, inte är rätt timad. Kan man göra nåt åt det, eller

är timer-grejer ostabila?

Och har ni nån anmärkning, tillägg eller tips, så säg gärna till. :e

nitro2k01Medlem sedan aug. 20037 630 inlägg
#13

En anmärkning är att onload för img-taggar fortfarande inte är standard, och troligen inte funkar så bra crossbrowser.
En annan sak är att om du är nöjd med de svar du fått bör du välja ett svar och klicka "Acceptera som slutgiltigt svar"!

haiderMedlem sedan jan. 2003988 inlägg
#14

Jepp, glömde bort att acceptera svaret

Tack för påminnelsen §jr

PepeJeriaMedlem sedan feb. 2003779 inlägg
#15

Eh, nitro2k01, angående din anmärkning om onload på img-taggen. Se ovan.

Genererad på 387 ms · cache AV · v20260730165559-full.f96bc7eb