Hristo: Bildbreite dynamisch ändern??

Hallo zusammen,

mein Ziel ist es, ein Bild in mehreren Schritten zu erweitern, sodass eine langsame Vergrösserung stattfindet.  Ich versuche es damit, aber leider erfolgslos, das Bild poppt onmouseover immer gleich zu seine maximale Breite auf, ohne Animationseffekt:

  
<img src="snow.bmp" width="100" height="100" onmouseover="mouseover(this)" onmouseout="mouseout(this)" />
  
<script type="text/javascript"><!--  
  function mouseover(frbild) {  
    for (var i = 0, i<200, i++) {frbild.width = frbild.width + 1;}  
  }  
  function mouseout(frbild) {  
    frbild.width = 100;  
  }  
--></script>  

Woran liegt es??  Vielleicht kann mir jemand einen Hinweis geben, wo ich mehr von der Prozessbearbeitung in JavaScript bzw. HTML lesen könnte??  Offensichtlich funktioniert es nicht wie im normalen C++ oder VBA.

Danke und Grüsse,
Hristo

  1. Om nah hoo pez nyeetz, Hristo!

    mein Ziel ist es, ein Bild in mehreren Schritten zu erweitern, sodass eine langsame Vergrösserung stattfindet.  Ich versuche es damit, aber leider erfolgslos, das Bild poppt onmouseover immer gleich zu seine maximale Breite auf, ohne Animationseffekt:

    Da kannst du mal sehen, wie schnell der Rechner so arbeitet ;-)

    Lass ihn bummeln!

    Matthias

    --
    http://www.billiger-im-urlaub.de/kreis_sw.gif
    1. Da kannst du mal sehen, wie schnell der Rechner so arbeitet ;-)

      Danke für die Bemerkung, aber OK, und wie kann ich das Effekt dann trotzdem erreichen, wenn nicht so??!

      Gruß, Hristo

      1. Hallo,

        Da kannst du mal sehen, wie schnell der Rechner so arbeitet ;-)

        Danke für die Bemerkung, aber OK, und wie kann ich das Effekt dann trotzdem erreichen, wenn nicht so??!

        https://forum.selfhtml.org/?t=198156&m=1330219

        setTimeout ist dein Freund.

        Gruß

        jobo

  2. Hallo,

    setTimeout benutzen und dann die Funktion wieder aufrufen:
    function mouseover(frbild) {

    while (frbild.width < maxWidth) {
           frbild.width += 1;
           setTimeout("mouseover("+frbild+")",1000);
         }
    }
    untested.

    Besser u.U. mit

    myBild = document.getElementById("myBildId");

    das myBild zu bestimmen, dann brauchst du es nicht als Parameter zu übergeben.

    ggfs. dann auch:

    myBild.onmouseover = mousover;

    Gruß

    jobo

    1. Danke für die schnelle Nachricht.  Ich habe es somit ausprobiert, funzt wieder nicht, d.h. das Bild wird nicht mit Pausen erweitert sondern direkt von 100 auf 150:

        
      <img name="erstesBild" src="snow.bmp" width="100" height="100" onmouseover="mouseover()" onmouseout="mouseout()" />
      
        
        
      <script type="text/javascript"><!--  
        function mouseover() {  
          frbild = document.getElementById("erstesBild")  
          while (frbild.width < 150) {  
            frbild.width += 1;  
            setTimeout("mouseover()",1000);  
          }  
        }  
        function mouseout() {  
          frbild = document.getElementById("erstesBild")  
          frbild.width = 100;  
        }
      
      1. Hallo,

          
        <img src="test.jpg" width="50px">  
        <script>  
        myImg = document.getElementsByTagName("img")[0];  
        growingWidth = 50;  
        enlarge = function () {  
        	 growingWidth += 1;  
        	if (growingWidth == 51) {  
        		alert("starting");  
        	}	  
        	if (growingWidth < 300) {  
        		myImg.style.width =  growingWidth + "px";  
        		setTimeout("enlarge()", 100);  
        	}	  
        }  
        </script>  
        <button onclick="enlarge()">enlarge</button>  
        
        

        funzt.

        Gruß

        jobo

        1. Hi, auf der Art und Weise hat es jetzt auch mit meiner Funktion geklappt.  Ich glaube, dass das Problem bei den Attributen vom Bild vorkommt:

          Bild.width und Bild.style.width

          Irgendwie klappt es mit dem direkten Attribut nicht und über den zweiten schon.  Eine Idee warum ist es so??

          Gruß, Hristo

          1. Hallo,

            Irgendwie klappt es mit dem direkten Attribut nicht und über den zweiten schon.  Eine Idee warum ist es so??

            Weil width eine style-Eigenschaft ist, die immer in "px" angegeben werden muss? Und style wiederum eine Elementeigenschaft.

            Gruß

            jobo

    2. Hi,

      setTimeout benutzen und dann die Funktion wieder aufrufen:
      function mouseover(frbild) {

      while (frbild.width < maxWidth) {
             frbild.width += 1;
             setTimeout("mouseover("+frbild+")",1000);
           }
      }

      Das Bild per Schleife grösser rechnen und sicherheitshalber bei jedem Durchlauf noch ein Timeut anstossen, der den Vorgang erneut aufruft? Sorry, das ist kompletter Quark.

      untested.

      glaub ich gerne. Es gibt hier keinen Grund, hier überhaupt eine Schleife zu einzusetzen.

      Gruesse, Joachim

      --
      Am Ende wird alles gut.
      1. glaub ich gerne. Es gibt hier keinen Grund, hier überhaupt eine Schleife zu einzusetzen.

        Gruesse, Joachim

        Hi Joachim, wie würdest du es machen??

        Gruß, Hristo

      2. Hallo,

        Das Bild per Schleife grösser rechnen und sicherheitshalber bei jedem Durchlauf noch ein Timeut anstossen, der den Vorgang erneut aufruft? Sorry, das ist kompletter Quark.

        untested.
        glaub ich gerne. Es gibt hier keinen Grund, hier überhaupt eine Schleife zu einzusetzen.

        https://forum.selfhtml.org/?t=198156&m=1330230

        Gruß

        jobo

        1. Hi,

          https://forum.selfhtml.org/?t=198156&m=1330230

          Warum postest Du dann erst so einen Murks. Davon abgesehen weist Dein Script erhebliche Schwächen auf, denn es berücksichtigt nicht die möglicherweise eintretende Überlagerung mehrerer Timeouts durch nervöses Klicken oder Hovern (was vorgesehen ist). Desweiteren erscheint mir eine Bildreferenzierung über den Index reichlich praxisfern.

          Gruesse, Joachim

          --
          Am Ende wird alles gut.
          1. Hi,

            https://forum.selfhtml.org/?t=198156&m=1330230
            Warum postest Du dann erst so einen Murks. Davon abgesehen weist Dein Script erhebliche Schwächen auf, denn es berücksichtigt nicht die möglicherweise eintretende Überlagerung mehrerer Timeouts durch nervöses Klicken oder Hovern (was vorgesehen ist). Desweiteren erscheint mir eine Bildreferenzierung über den Index reichlich praxisfern.

            Gruesse, Joachim

            Hei hei, ich bin gespannt, welche Lösungsidee Du hättest, damit Du so stark die Ideen der anderen kritisierst??  Gruß, Hristo

          2. Hallo,

            Hi,

            http://forum.de.selfhtml.org/my/?t=198156&m=1330230
            Warum postest Du dann erst so einen Murks.

            Warum nicht?

            Davon abgesehen weist Dein Script erhebliche Schwächen auf, denn es berücksichtigt nicht die möglicherweise eintretende Überlagerung mehrerer Timeouts durch nervöses Klicken

            Hat jemand gesagt, dass es nicht optimierungsfähig ist?

            oder Hovern (was vorgesehen ist).

            Wenn er es erstmal überhaupt schafft, das Bild zu verbreitern, kann er den Rest ja mit Hilfe anderer lösen.

            Desweiteren erscheint mir eine Bildreferenzierung über den Index reichlich praxisfern.

            Naja, wollte man das über alle Bilder machen, wäre das schon wieder praxisnäher. Und wenn nicht, kann man ja auch die id nehmen. Das bleibt ja jedem freigestellt.

            Ich gebe aber zu, dass Dein Codebeispiel viel runder ingesamt ist und auch stimmiger erscheint. Aber auch Halbprofis steht es ja zu, hier zu posten, mitzurätseln und an Lösungsvorschläge mit zu arbeiten, die u.U. dann erstmal halb ausgegegoren sind. Oder sind wir schon wieder soweit, dass hier nur ausgewiesene Vollprofis antworten dürfen?

            Gruß

            jobo

  3. Hi,

    for (var i = 0, i<200, i++) {frbild.width = frbild.width + 1;}

    eine Schleife ist zu schnell. Verwende setTimeout oder setInterval für Animationen.

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. eine Schleife ist zu schnell. Verwende setTimeout oder setInterval für Animationen.

      Hi Joachim, kannst bitte deine Vorstellung besser ausschreiben.  Mir fällt nichts anders ein, wie ich es ohne Schleife mache.  Im Beispiel von jobo war es mit if zu überrpüfen, wann das Bild nicht mehr zu vergrössern wäre.  Dies ist keine Schleife.

      Gruß, Hristo

      1. Hi,

        Hi Joachim, kannst bitte deine Vorstellung besser ausschreiben.  Mir fällt nichts anders ein, wie ich es ohne Schleife mache.

        Warum liest Du Dir nicht mal die Beispiele durch? Mit setTimeout kannst Du einen Vorgang periodisch aufrufen und dabei die Frequenz im Millisekunden angeben. Du ruft damit also ganz gemütlich wiederholt eine Funktion auf, welche die Bildgrösse anpasst, bis der gewünschte Effekt erreicht ist. Eine Schleife hat in dieser Zeit schon 1000 Loops hinter sich...

        Generell gilt im Forum: SELF ist der/die Man/Frau. Eine kleine Anregung magst Du aber vielleicht in diesem Test finden.

        Im Beispiel von jobo war es mit if zu überrpüfen, wann das Bild nicht mehr zu vergrössern wäre.  Dies ist keine Schleife.

        Doch, im ersten Beispiel benutzte er eine while-schlife und darin einen Timeout.

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Generell gilt im Forum: SELF ist der/die Man/Frau. Eine kleine Anregung magst Du aber vielleicht in diesem Test finden.

          :) Ja, danke, ich weiss was SELF bedeutet, aber damit ich irgendwie weiterkomme, hatte ich ein Beispiel gebraucht.  Vor allem scheitert es bei mir nicht mit der Logik, wie ich etwas aufbaue oder ein Problem löse, sondern mit der Syntax von HTML und JavaScript.  Z.B. mit der Sintax, wie ich meine Funktion von der Funktion setTimeout() aufrufe, habe ich eine Stunde herumprobiert, und es hat bis jetzt nichts gebracht.  Ich habe es endlich in Deinem Beispiel gesehen:

          setInterval(function(){enlarge(img)}, 50);

          Nochmal danke fürs gute Beispiel!!

          Gruß, Hristo