• ベストアンサー

複雑過ぎて頭がこんがらがっています

これは画像を衛星のように動かすプログラムです。 まずソースコードを貼り付けます。 <html> <head> <title>Satellite pictures</title> <script language="JavaScript"><!-- iList = ["img0","img1","img2","img3","img4","img5"]; cx = 100; // 回転の中心X座標 cy = 100; // 回転の中心Y座標 cnt = 0; rx = 100; // 回転半径(横) ry = 50; // 回転半径(縦) function rotZIMG(){ for (i=0; i<iList.length; i++){ n = (i * (360 / iList.length) + cnt++) * Math.PI / 180; y = cy - Math.cos(n) * ry; z = 100 - Math.cos(n) * 50; // 画像表示サイズと兼用 document.images[iList[i]].style.pixelLeft = cx + Math.sin(n) * rx; document.images[iList[i]].style.pixelTop = y; document.images[iList[i]].style.zIndex = z; document.images[iList[i]].style.width = z / 1.5; document.images[iList[i]].style.height = z / 2; } } // --></script> </head> <body onload="setInterval('rotZIMG()',100)"> <div style="color:#ff00ff;font-size:18pt">Satellite pictures</div> <br> <br> <img src="image/circle.gif" style="position:absolute;top:60px;left:80px;z-index:100;"> <img src="image/0.jpg" name="img0" style="position:absolute;"> <img src="image/1.jpg" name="img1" style="position:absolute;"> <img src="image/2.jpg" name="img2" style="position:absolute;"> <img src="image/3.jpg" name="img3" style="position:absolute;"> <img src="image/4.jpg" name="img4" style="position:absolute;"> <img src="image/5.jpg" name="img5" style="position:absolute;"> </body> </html> まず画像が奥に行くに従って小さくなるので画像が3Dに見えるように錯覚を起こしてしまいいる。まずは画像の動きですよね。 3Dの回転というのを見るのが初めてなので凄く難しい。 横と縦に回転して、実際に画像がどう動いているのかがよく分かりません。 ただ、画像が小さくなるのはどこでやっているか分かりました。 document.images[iList[i]].style.width = z / 1.5; document.images[iList[i]].style.height = z / 2; ここですよね。でも奥に行くに従って徐々に小さくなるのには別のソースコードが必要ですよね。 それはどこに書いてあるのでしょうか。 問題は次の式です。 z = 100 - Math.cos(n) * 50; 100は横の回転半径で50は縦の回転半径の数値なんですかね。 因みに、知識不足なんですけどz-indexって何を意味してるんですかね。 辞書調べても載ってなかったので分かる方教えて下さい。 初歩的な知識も含めて、このソースコードを分かりやすく解説してくれる方、お待ちしております。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#84373
noname#84373
回答No.4

さて~俺か~^^; rx = 100; // 回転半径(横) ry = 50; // 回転半径(縦) y = cy - Math.cos(n) * ry; document.images[iList[i]].style.pixelLeft = cx + Math.sin(n) * rx; document.images[iList[i]].style.pixelTop = y; y軸に対してはry、x軸に対してはrxが乗算されています この場合、 ry=100 /2; と考えると、x軸の長さも、y軸の長さも同じ正円になります そしてy軸のながさを半分にします つまり、横につぶれた円を創造できるでしょう? z = 100 - Math.cos(n) * 50 このコサインは、最小で-1。最高で1の値を示します なので 100 - (-1*50) = 100-(-50) = 150 100 - (1*50) = 50 ということで範囲が算定できます >円の中心を100ずらしているという部分ですが、これは楕円軌道で回転する円でいいのでしょうか。 zとxの変化を見れば、正円の軌道を描きますが、このプログラムでは z値は、文字の大きさに使われていて、座標をあらわす計算には使われていません なので、距離が変化していますが、図の表示順とその大きさに使われています 何故上手く奥に画像が行った際に縮小されるのでしょうか。 座標系には、左手座標系と右手座標系があります t_netbugさんが示した参考URLに目を通しましょう! >何故上手く奥に画像が行った際に縮小されるのでしょうか。 プログラムのz値の変化を alert('z='+z);//この行をプログラムに追加する のようにして、z値の変化を観察してみましょう~!時間がかかるけどね >自分のレベルの差が天と地もある事に・・・ 貴方が気づいていないだけで、ここの板にも、向こうの板にも、私から見て天と地の差もある人達が ゴロゴロいます。とくに私にとって「神様」的存在の人も、困った時にこちらの板にも降臨してきてくれます^^; ちょっと天につばを吐いているように見えましたよ。だから自分の尊敬する人に、あぁ~なんてことを! と思ったり・・・。^^; 回答者の方は、ただ質問に答えるのではなく、質問者に上達してほしいと思うからこそ、遠まわしに教えてたり コードだけ示したり、丁寧に教えていたりと努力してくれるのです。(まじ人それぞれ表現の仕方は違いまが。) なので、回答者の方に指摘されたら、それに応えるのが質問者のマナーだと思います。 応えるというのは、お礼の返事を書くのではなく、コードで示す!です。成長した成果が見たいのです! 私も、ここで大変お世話になりました。なので上級者の方にはお礼ができないので、質問者の方に 答えられるときは、自分なりに考えて調べて答えています。これが結構自分の勉強になります。 ちなみに私はプロではありません。分類でいうと(そんなのあるか?)サンデープログラマです。 趣味の範囲ですね~。ちなみに自分の中で基準があります。そのプログラムを作ったら面白いのか? とそれを作るとしたら30分で作れるか?です。 ちなみに3Dの字がくるくる下から上に回転するプログラムで40分でした。 ちょっとプログラム的には、汚いし、みんなで笑っていることでしょう~!

persona
質問者

お礼

まず、1つお詫びをしなければなりません。 これを読む前に新しい方を先に読んでしまいお礼を書いてしまいました。 ちゃんと質問に答えてくれたのに、大変申し訳ありません。 それと、_pipi_さんが指摘してくれたアドバイスを読んで、また1つ勉強させてもらいました。 どうしても他力本願になってしまうのが、私の悪い癖です。 t_netbugさんが貼り付けてくれた参考URLをもう1度じっくり見てみます。 最後に1つだけ質問させて下さい。 何故プログラム作成の時間に制限をするのでしょうか。 プロならば納期内という時間的制限があります。だから、少しでも早くやるというのなら話は分かりますが、プロではない_pipi_さんには制限というものが存在しないですよね。 そこを敢えて自分を追い詰めるような制限を作るのには何かしら理由があると思うのですが。 別に答えたくなければ、それでも一向に構いません。でしゃばり過ぎている面もあるので。 TAGというサイトを知る事ができたのも、それ以上に_pipi_さんと知り合えた事にも感謝しています。 前のお礼の内容に少し触れますが、もし私がTAGの方にも同じ内容の質問、いわゆるマルチポストをしたら、_pipi_さんは失望されるでしょうね。 おそらく、今回の質問に対してはこの辺でそろそろ謎解きを終わらせる時期だと私は感じています。 しかも、ここからは自分の力だけで解決できるのがBetterなのではないか、と思っています。

その他の回答 (4)

noname#84373
noname#84373
回答No.5

そうそう自分のレベルって測る基準がわかりませんね。 自分的には、10段階表記で、下から2くらいかなぁ~なんて思ってます! マジ! 上には凄い人達が・・・・。

persona
質問者

お礼

再度のレスを頂き、ありがとうございます。 できれば、補足質問に答えてもらえたら大変有り難かったのですが、無理でしたか。 話は変わりますが、この前紹介して頂いたURLでTAGというサイトに行きました。 あそことここでより多くの回答が貰えると喜びましたが、大きな間違いでした。 そのおかげで1つ教訓を覚えましたが。 俺はこの質問に書かれているソースコードも読み取れません。 _pipi_さんが10段階で下から2なのだとしたら、自分はマイナス10ぐらいでしょうか。 この質問をTAGの掲示板にも書きたい思いで一杯です。 そうすれば、もしかしたら私が理解できるくらいのレベルで解説を書いてくれる人がいるかもしれない。 勿論、いないかもしれない。 自分はいない確率の方が高いと考えていますがね。 このプログラムを理解するために、私は何をすべきなのでしょうかね。

noname#84373
noname#84373
回答No.3

まぁ~まぁ~ということで、息抜きに。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <title>Mojiga kuru2</title> <body> <p>文字列の表示</p> </body> <script type="text/javascript"> //@cc_on var str = '1文字が1メラメラだとすると、これは3ボウボウとかになるのかな~?まぁ~世の中いろいろな人がいるから、な~な~で良かったり。'; var strLen = str.length; var cha = [], c; var sinTbl = []; var cosTbl = []; var i, max; var cnt =0; r = 200; x2d = 400; y2d =400; var rd = Math.PI / 180; for (i = 0; i < 361; i++) { sinTbl[i] = Math.sin( i * rd ); cosTbl[i] = Math.cos( i * rd ); } for (i = 0; i < strLen; i++) { c = document.createElement('p'); c.style.position = 'absolute'; c.style.fontSize = '10px'; c.appendChild( document.createTextNode( str.substr(i, 1) ) ); cha[i] = document.body.appendChild( c ); } function kaiten(){ var t; for(i = 0; i < strLen; i++){ t=i*720/strLen; with(cha[i].style){ var z = zahyo( sin( t + cnt) * r, -100-i*5+cnt, cos( t + cnt) * r); top = z.y + 'px'; left = z.x + 'px'; fontSize = z.f+'px'; /*@if(1) filter = 'alpha(opacity='+ z.o+ ')'; @else @*/ MozOpacity = (z.o / 100); opacity = (z.o/ 100);/*@end@*/ } } cnt+=1; if(cnt>700) cnt =0; } function sin(n){ return sinTbl[ ((360 + n) % 360)|0 ];} function cos(n){ return cosTbl[ ((360 + n) % 360)|0 ];} function zahyo(x,y,z){ var k = (600-z) /400; var x = x2d - x / k; var y = y2d - y / k; var f = 40-k*10; var o = 100-k*30; return {'x':x, 'y':y, 'z':z, 'f':f, 'o':o } } setInterval( kaiten, 20); </script>

persona
質問者

お礼

一言圧巻です。 自分の実力の無さをまざまざと知り、ちょっと鬱入ってます。 上のソースコード動かしてみました。お見事です。 何かもう軽々しく_pipi_さんと呼べませんね。 自分は途轍もない人と出逢い、歓喜してます。 まず、自分はまだまだプログラミング言語を知らなさ過ぎる事を実感しました。 自分は所詮ホームページに飾りつけする程度だと思っていましたが、これはアッと驚く出来事です。 今自分がテキストにしている題名を少しはさんでみました。 今使ってるテキストなんて……。 困りました。もっと勉強しないとドンドン遅れていくような気がする。

  • t_netbug
  • ベストアンサー率34% (15/44)
回答No.2

難しく考えすぎているような…。 この関数で行っている式はプロジェクション座標からスクリーン座標変換を行った結果、算出された式だと思えば良いかな~と。 pipi様の回答が一番分かりやすいデスね・・・。 cosの特性をうまく使って遠近感を演出しているにすぎないって事ですね。 蛇足となりますが、3Dプログラミング用の数式、考え方などはここに書かれてました。 http://www.c3.club.kyutech.ac.jp/gamewiki/index.php?3D%BA%C2%C9%B8%CA%D1%B4%B9 高校3年までの数学知識で理解できると思います。

persona
質問者

お礼

レスを頂き、ありがとうございます。 そうですか。悲しい事に意味が全然分かりません。 泣けてきますね。 プロとアマだとこうも差の開きがでるものですかね。 プロレベルまで辿り着こうなんて思ってもいませんが、でも、こうも力量の差を見せつけられると正直凹みますね。 それと、3Dプログラミング用のサイトを紹介してもらい、大変感謝しています。 いつか役に立ててみせますので……。

noname#84373
noname#84373
回答No.1

さてさて、遅ればせながら自分なりに噛み砕いて説明してみます。 頭の中でダブっていたら読み飛ばして下さい。 サイン・コサイン・タンジェントなんて三角形に使うもの!と思わないで 円の描画に使う程度だと気楽に考えましょう。 r^2=y^2-x^2 この式だと、xに対して2つのyの値が導き出され、円の図であれば、 +側なのか-側なのか面倒です。 そこで、原点を中心にして考えます。 角度と距離(r)でxとyを求めようとするのが次式です y=cos(角度*PI/180)*r x=sin(角度*PI/180)*r 角度は、マイナスでもプラスでも360度を超えてもOK! でも面倒なので 角度=(角度+360)%360; にして、360で割って余りを使うことで、ループ内で使うのであれば常に 正の値にの角度で使えます(初期値が-360以下だとだめですが) (座標系なんて、右回りでも左回りでも上でも下でも関係ないでしょう?! 回転してればどうせ見た目同じだし^^;) (計算に時間のかかる関数なのであらかじめテーブルにして計算しておいて 使う方法とかもあります。) たとえば三角形を描くときに3点の座標を求めます for(i=0;i<361;i+=360/3){ ここにiを角度にして座標計算・・ } 衛星が回るようにするのであれば、360/3の、「3」を衛星の数にします ここではiList.lengthですね >3Dに見えるように錯覚・・ あなたが考えたとおりこれは、ただの横につぶれた楕円軌道を描くだけです そして問題の一つが、zIndexですね スタイルシートで定義するときは z-index ですが、スクリプトで使うときはzIndexとします これと似たようなものにbackground-colorもあります。これもスクリプトで使うときは backgroundColorです ようは'-'をとり、次の文字は大文字にする。そんな程度で覚えて置いてください。 zIndexは画像が重なって表示されたときに、手前に表示させるか、奥に表示させるかに使われます なので z = 100 - Math.cos(n) * 50 が50~150の範囲で奥行きを変化させます。 ここでの100は、横の回転半径ではありません。 円の中心を100だけ奥にずらしている?と考えればOK! >奥に行くに従って徐々に小さくなるのには別のソースコードが必要 これは、必要ありません。これはあくまで楕円軌道です。 奥(上)に行った図の、高さと幅をzで割って、小さく見せているだけです。 もし、3Dで計算するならyの値にzの値が関連してくるはずです。 以下みたいな~(あくまでも気楽に考えてね。プログラムの文法ならエラーだから) 2Dx = 3Dx - (1/3Dz); 2Dy = 3Dy - (1/3Dz); document.images[iList[i]].style.pixelTop = y; これはストレートな記述なので、しつこいようですが楕円軌道です

persona
質問者

お礼

_pipi_さん、またお逢いできて嬉しい限りです。 今の時点で脳みそはパッパラパーとでも言うのでしょうか。 今回はお礼&補足説明をお願いするかもしれません。 横に潰れた楕円軌道ですか。まずこういうモノを身近では初めて見たので多少困惑しています。 まず rx = 100; // 回転半径(横) ry = 50; // 回転半径(縦) の部分ですが、このコメントが難解です。 これだと横と縦に回転しているように読み取ってしまいます。 これは一体何が言いたいのでしょうか。 次に z = 100 - Math.cos(n) * 50 が50~150の範囲で奥行きを変化させます。 ここでの100は、横の回転半径ではありません。 円の中心を100だけ奥にずらしている?と考えればOK! 何故50~150と断定できるのでしょうか。 後、円の中心を100ずらしているという部分ですが、これは楕円軌道で回転する円でいいのでしょうか。 最後に document.images[iList[i]].style.width = z / 1.5; document.images[iList[i]].style.height = z / 2; についてですが、これで奥に画像が行く際に画像を縮小させるのでしょうが、何故上手く奥に画像が行った際に縮小されるのでしょうか。 これならば、画像が前方にある時点で縮小される恐れは無いのですか。 質問は以上です。 今、_pipi_さんと自分のレベルの差が天と地もある事に驚かされています。 いやはや凄い人だったんですね。 改めてお訊きしますが、_pipi_はプロの方なのですか。 それとも、この程度のプログラムなんかヘッチャラなんでしょうか。 そうだとしたら、脱帽ですね。 またのレス、期待してますね。

関連するQ&A

  • このサンプル(画像をY軸回転させる)コードの説明をお願いします。

    javascriptに興味がありネットでサンプルを見ながら使い方を 勉強しているものです。 ネットで以下のサンプルをみつけコードを解釈しようとしたのですが よくわかりません。はじめから多少コメントがついてるのですが 数字の(1)~(8)の部分がわかりませんでした。 これはjavascriptというより数学的な意味を把握できないため 分からないと思うんですが解説をして頂けたらと思い質問させて頂きます。 <HEAD><TITLE>画像をY軸回転させる</TITLE> <SCRIPT language=JavaScript><!-- iList = ["img0","img1","img2","img3","img4","img5"]; cx = 150; // 回転の中心X座標 cy = 100; // 回転の中心Y座標 cnt = 0; rx = 140; // 回転半径(横) ry = 70; // 回転半径(縦) function rotZIMG() { for (i=0; i<iList.length; i++) { n = (i * (360 / iList.length) + cnt++) * Math.PI / 180; //(1)? y = cy - Math.cos(n) * ry;//(2)? z = 100 - Math.cos(n) * 50; // (3)? document.images[iList[i]].style.pixelLeft = cx + Math.sin(n) * rx;//(4)? document.images[iList[i]].style.pixelTop = y;//(5)? document.images[iList[i]].style.zIndex = z;//(6)? document.images[iList[i]].style.width = z / 1.5;//(7)? document.images[iList[i]].style.height = z / 2;//(8)? } } // --></SCRIPT> </HEAD> <BODY onload="setInterval('rotZIMG()',100)"> <IMG style="POSITION: absolute" src="0.gif" name=img0> <IMG style="POSITION: absolute" src="1.gif" name=img1> <IMG style="POSITION: absolute" src="2.gif" name=img2> <IMG style="POSITION: absolute" src="3.gif" name=img3> <IMG style="POSITION: absolute" src="4.gif" name=img4> <IMG style="POSITION: absolute" src="5.gif" name=img5>  あと、こういった図形を描画するプログラムは大変面白いと思うのですが 文系人間のためsin cos などがでてくると分かりません。 もう一度基礎ぐらいは勉強してみたい気持ちがあるので どういった分野(例えば高校数学の三角関数とか)の勉強をすればいいのかなども教えていただければうれしいです。 宜しくお願いします。

  • プログラムですけど、問題はsinθとcosθです

    <script language="JavaScript"> <!-- iList = ["img0","img1","img2","img3","img4","img5"]; mx = my = cnt = 0; r = 35; function rotIMG(){ for (i=0; i<iList.length; i++){ n = (i * (360 / iList.length) + cnt++) * Math.PI / 180; document.images[iList[i]].style.pixelLeft = mx + Math.sin(n) * r; document.images[iList[i]].style.pixelTop = my - Math.cos(n) * r; } } // --></script> これで document.images[iList[i]].style.pixelLeftは横の位置を document.images[iList[i]].style.pixelTop は縦の位置を 導き出しているんですよね。 そうすると、Math.sin(n) * r は縦の長さをMath.cos(n) * r は横の長さを表してる訳ですから mx + Math.sin(n) * r とmy + Math.cos(n) * r は 長さを導き出すのに矛盾してないでしょうか。 ここまで頭が悪くて相当ショックを受けているんですけど。 詳しい説明を含めて宜しくお願い致します。

  • cookie.jsを使ってクッキーを利用する方法。

    cookie.jsを使ってクッキーを利用する方法。 現在ジャバスクリプトにて、複数の画像、リンク、位置データがonClickで変わるように設定しています。 違うページに行き戻ると、置き換えられた画像のデータがなくなってしまいます。 cookie.jsを使えばいいと思い、その設定方法をいろいろと調べてみましたがわかりませんでした。 こういう場合は、ジャバスクリプトをどのように記入すれば良いのでしょうか。 よろしくお願いいたします。 <body> <a href="http://www.a01"> <img name="AAA" id="AAA" src="images/a01.jpg" style="position: absolute; top: 310px; left: 220px; z-index: 45;" border="0" /></a> <a href="http://www.b01"> <img name="BBB" id="BBB" src="images/b01.jpg" style="position: absolute; top: 227px; left: 363px; z-index: 120;" border="0" /></a> <a href="http://www.c01"> <img name="CCC" id="CCC" src="images/c01.jpg" style="position: absolute; top: 418px; left: 425px; z-index: 120;" border="0" /></a> <form> <input value="" title="clear" style="background: transparent url(images/clear.gif) no-repeat;" onclick="document.AAA.src='images/spacer.gif';document.links[0].href='#';" type="button" /> <div class="AAA"> <a href="#" class="prev_AAA">戻る</a> <a href="#" class="next_AAA">進む</a> <ul> <li> <input value="" title="" style="background: transparent url(images/a01.gif) no-repeat 0pt 0pt; width: 64px; height: 64px; cursor: pointer; " onclick="document.AAA.style.top= '310px';document.AAA.style.left='220px';document.AAA.src='images/a01.jpg';document.links[0].href='http://www.a01'" type="button" /> </li> <li> <input value="" title="" style="background: transparent url(images/a02.gif) no-repeat 0pt 0pt; width: 64px; height: 64px; cursor: pointer; " onclick="document.AAA.style.top= '310px';document.AAA.style.left='220px';document.AAA.src='images/a02.jpg';document.links[0].href='http://www.a02'" type="button" /> </li> </ul></div> ……………… </form></body>

  • 10個の落ちてくる文字の位置を常に真中に表示

    お知恵をおかりしたいのですが、 下記のソースで10個の文字(GIF)がオンロードで落ちてくる という仕様なのですが、現在はポジションを指定してあるのですが、 これをスクリプトの追加で常に真中に揃えることがしたいのですが、 自分でもやってみましたがうまくいかずおわかりになる方お力をお貸しください。 <html> <head> <title></title> <script type="text/javascript"> window.onload = init; var n=8; var frac = [1.7,1.8,1.6,1.8,1.7,1.5,1.7,1.9]; var bound = [0.5,0.6,0.5,0.6,0.6,0.5,0.6,0.5]; var count = []; var elm=[]; var y = []; var handle=[]; function falling() { for(i=0;i<n;i++){ y[i] += ++count[i] * 0.001 * frac[i]; elm[i].style.top = y[i]; if(y[i] >= wH){ y[i] = wH; count[i] = Math.ceil(-count[i] * bound[i]); if( count[i] == -1 ) clearInterval( handle[i] ); } } } function init() { for(i=0;i<n;i++) { elm[i] = document.getElementById("sample"+i); handle[i] = setInterval(falling,10); y[i]=count[i]=0; } wH = document.all ? document.body.clientHeight : window.innerHeight; wH = wH - elm[0].height; } </script> </head> <body> <center> <img src=".jpg" width="330" height="440"> <img src=".gif" id="sample0" style="position:absolute;left:250px;"> <img src=".gif" id="sample1" style="position:absolute;left:300px;"> <img src=".gif" id="sample2" style="position:absolute;left:350px;"> <img src=".gif" id="sample3" style="position:absolute;left:400px;"> <img src=".gif" id="sample4" style="position:absolute;left:450px;"> <img src=".gif" id="sample5" style="position:absolute;left:500px;"> <img src=".gif" id="sample6" style="position:absolute;left:550px;"> <a href="#" alt="ENTER"><img src="enter.gif" id="sample7" border="0" style="position:absolute;left:680px;"></a> </center> </body> </html> というソースなのですが、たぶん1行か2行のコードの追加でモニタサイズなど関係なしに常にど真ん中にならべることができると思うのですが、難しく。。。。。 どうかなのとぞよろしくお願いいたします。

  • マウスオーバーで画像変更で

    以下のような方法で画像変換を行っています。 <script language="JavaScript"> function imageChange(imageName,imageURL){ document.images[imageName].src = imageURL; } </script> <TR><TD><IMG SRC="./img/01.gif" NAME="image01" style="position:absolute;top:20;left:10;" onMouseOver="imageChange('image01','sub01_01b');"> </TD></TR> <IMG SRC="./img/01_01b.gif" name="sub01_01b"> 実際にマウスオーバーさせると×印が出てしまいます。 onMouseOver="this.src='./img/01_01b.gif'" とするとできるのですが。 どこかに間違いがあるのだと思うのですが、自分で発見できません(><) 間違いを訂正してください!

  • 関数の重複で動かない?

    ブログのサイドバーにjavascriptを使ってるのですが同じものを2個貼り付けたら古い方が動かなくなってしまいました。 関数の重複かも、というとところまではなんとなくわかったのですがどこをどうすれば動くようになるでしょうか? ---------------------------------------- <HTML> <HEAD> <TITLE>TAG index Webサイト</TITLE> <SCRIPT TYPE="text/javascript"> <!-- if (document.images) { // 設定開始(使用する画像を設定してください) // 通常の画像 var img0 = new Image(); img0.src = "image/start.jpg"; // ポイント時の画像1 var img1 = new Image(); img1.src = "image/newyork.jpg"; // ポイント時の画像2 var img2 = new Image(); img2.src = "image/london.jpg"; // ポイント時の画像3 var img3 = new Image(); img3.src = "image/yokohama.jpg"; // 設定終了 } // ポイント時の処理 function On(name) { if (document.images) { document.images['def'].src = eval(name + '.src'); } } // 放した時の処理 function Off() { if (document.images) { document.images['def'].src = img0.src; } } // --> </SCRIPT> </HEAD> <BODY> <IMG SRC="image/start.jpg" ALT="START" WIDTH="150" HEIGHT="100" NAME="def"> <BR> <A HREF="change3.html" onMouseOver="On('img1')" onMouseOut="Off()">NEW YORK</A> | <A HREF="change3.html" onMouseOver="On('img2')" onMouseOut="Off()">LONDON</A> | <A HREF="change3.html" onMouseOver="On('img3')" onMouseOut="Off()">YOKOHAMA</A> </BODY> </HTML> ----------------------------------------------

  • DOM 属性の取得

    下記は画像などのスライドのスクリプトです。 スライドの後のほう、つまり順番の最後にあたる9番目で http://www.trape3.com/ban.htmlへのリンクを貼っています。 そのリンクを外した上で、 <img>を入れなおしています。 つまり、 1) <img src="image02/ani001.jpg" name="anime"> へのリンクを貼る。 →その結果このようになる。   <a href="http://www.trape3.com/ban.html"><img src="image02/ani001.jpg" name="anime"></a> 2) その次に 上記の全体をremoveする。 3) その上で、<img src="image02/ani001.jpg" name="anime"> を置きなおす。 という操作をしていますが、そこで問題。 この最後の9場面が終了して、ふたたび一番目に戻って、そこでスライドが止まってしまいます。 理由は、 1) name="anime" を取得できない。 2) あるいは、 name="anime" が存在していない。 どちらかだと思われます。 というのは、 document.anime.src の代わりに document.getElementById('bb01').firstChild.src とすると、動きが止まらないで継続していくからです。 ということで、 name="anime" はどうなってしまったのか。 この部分の操作に関するスクリプトは 次のとおりです。 imageTag=document.createElement('img'); imageTag.setAttribute('name','anime'); imageTag.setAttribute('src','image02/ani001.jpg');    document.getElementById("bb01").appendChild(imageTag); imgエレメントを作成し、そこに 属性としてのname="anime"を置くということですね。 本に書かれてあるとおりです。(笑 この置いたはずの name="anime" が効いていない、どうしてなのかという質問です。 よろしくお願いします。 ------------------------------------------- スクリプト ■htmlファイル <body onload="timerID=setTimeout('change()',5000)"> <div style="position: absolute; top: 220px; left:80px" id="bb01"><img src="image02/ani001.jpg" name="anime" alt="アニメ"></div> ■jsファイル image1=new Image(); image1.src="image02/ani001.jpg"; image2=new Image(); image2.src="image02/ani002.jpg"; image3=new Image(); image3.src="image02/ani003.jpg"; image4=new Image(); image4.src="image02/ani004.jpg"; image5=new Image(); image5.src="image02/ani005.jpg"; image6=new Image(); image6.src="image02/ani006.jpg"; image7=new Image(); image7.src="image02/ani007.jpg"; image8=new Image(); image8.src="image02/ani008.jpg"; image9=new Image(); image9.src="image02/150.jpg"; function change() { clearTimeout(timerID); if(document.anime.src==image1.src) document.anime.src=image2.src; else if(document.anime.src==image2.src) document.anime.src=image3.src; else if(document.anime.src==image3.src) document.anime.src=image4.src; else if(document.anime.src==image4.src) document.anime.src=image5.src; else if(document.anime.src==image5.src) document.anime.src=image6.src; else if(document.anime.src==image6.src) document.anime.src=image7.src; else if(document.anime.src==image7.src) document.anime.src=image8.src; else if(document.anime.src==image8.src) { document.getElementById('bb01').removeChild(document.getElementById('bb01').firstChild); document.getElementById("bb01").innerHTML = "<a href=\"http://www.trape3.com/ban.html\">" + "<img src=" + "\"" + image9.src + "\"" + "width=\"100px\"" + "name=\"anime\"" + "\">" + "</a>"; } else { document.getElementById('bb01').removeChild(document.getElementById('bb01').firstChild); imageTag=document.createElement('img'); imageTag.setAttribute('name','anime'); imageTag.setAttribute('src','image02/ani001.jpg'); document.getElementById("bb01").appendChild(imageTag); } timerID=setTimeout("change()",5000); }

  • 外部ファイルについて

    JavaScriptやCSSなどHEAD内に書き込むものなら外部ファイルにできますよね? ではBODY部に書くものは?? <BODY>    : <DIV ID="MENU" STYLE="POSITION:ABSOLUTE; TOP:0; LEFT:0;"> <IMG SRC="../img/var.jpg" NAME="VAR" WIDTH=101% HEIGHT=25 STYLE="filter:Alpha(opacity=40);" onMouseOver="change(this,100);" onMouseOut="change(this,40);"> <SPAN STYLE="POSITION:ABSOLUTE; TOP:8; LEFT:10"> <A HREF="../default.htm"> <IMG SRC="../img/0101.gif" NAME="image01" BORDER=0></A> </SPAN>    : </DIV> となってるんですが、 <DIV>~</DIV> の間を外部ファイルにしたいんです。 このようなことはできますか?

    • ベストアンサー
    • CSS
  • プログラムのみで複雑に画像を変える方法役

    クリックすると画像が次々と変わるものを作りたいのですが、 下記方法では画像の枚数が増えたり、複雑な動作を作る場合、 複雑な構造になってしまうと思うのですが、 少しでも複雑にならない方法はありますか? フラッシュは使わずにプログラムだけで 同じ位置で画像を変えたいです。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Shift_JIS"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title></title> <script language="JavaScript"> <!-- var img1 = new Image(100,50); var img2 = new Image(100,50); var img3 = new Image(100,50); var img1.src = "sample1.gif"; var img2.src = "sample2.gif"; var img3.src = "sample3.gif"; function mF1(){ document.images[0].src = img1.src; setTimeout("mF2()",100); } function mF2(){ document.images[0].src = img2.src; setTimeout("mF3()",100); } function mF2(){ document.images[0].src = img3.src; } //--> </script> </head> <body> <img src="omote.jpg" width="100" height="50" onclick="mF1()"> </body> </html> あと、document.images[0].srcを変数として格納すると動作しないのですが、 document~というのは変数にできないのでしょうか。 var dcum = document.images[0].src; function mF1(){ dcum = img1.src; setTimeout("mF2()",100); } function mF2(){ dcum = img2.src; setTimeout("mF3()",100); } function mF2(){ dcum = img3.src; }

  • スタイルシートのレイヤーに乗せた画像を動的に表示する方法

    <div id="test" style="position=absolute; top=400px; left=200px; z-index=10;"><img src="gazou.gif"></div> 上記を動的に表示するために以下の方法を考えました var element = document.createElement('div'); element.id = "test"; element.style = "position=absolute; top=400px; left=200px; z-index=10;"; element.innerHTML = '<img src="gazou.gif">'; var objBody = document.getElementsByTagName("body").item(0); objBody.appendChild(element); しかしこれだと、element.style = "position=absolute; top=400px; left=200px; z-index=10;"; の部分がまずいらしく動作しません。 どのようにすればよいでしょうか。 よろしくお願いします。

専門家に質問してみよう