• ベストアンサー

div要素を滑らかに動かしたい

<div id="div1" class="div1" onclick="init();">move box</div> 上記のようなdiv要素を、画面右方向へ滑らかに 動かしたいのですが、どのようなscriptを記述すればよいでしょうか? setIntervalを使って0.5秒毎に1ピクセル右に移動、 というのを期待して以下のようなscriptを書いてみたのですが、 うまく動作しませんでした。 function init(){ setInterval(moveY, 500); } function moveY(){ var obj = document.getElementById("div1"); obj.style.left = obj.style.left+1 + "px"; }

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

  • ベストアンサー
  • ESate
  • ベストアンサー率64% (11/17)
回答No.5

No.2のtalooさんのご指摘どおりのことですが、 obj.style.leftに初期値を与えてないために値が空でparseIntで余計な値を返して、[NaN1px]という値ができてました。 自信ありとしておきながら本当に申し訳ありません 直接styleに初期値を与えるのもいいですが、 classやidでleftの値を指定してる可能性を考慮して以下のように 解決例: function moveY(){ var obj = document.getElementById("div1"); alert(obj.style.left); obj.style.left = parseInt(obj.style.left || obj.offsetLeft)+1 + "px"; //修正箇所 }

zuntata99
質問者

お礼

たびたびのご回答ありがとうございます。 obj.style.leftではあいかわらず動かなかったのですが、offsetleftでは、 動作させることができました。

その他の回答 (4)

  • leap_day
  • ベストアンサー率60% (338/561)
回答No.4

こんにちは こんな感じでどうでしょう? 0.5秒ごとではカチッカチッって感じで滑らか(?)とはいえなかったので勝手に調整させてもらいましたm(--)m <script Language="JavaScript"> <!-- initX = 0; function rollText() { clipW = parseInt(document.getElementById("block1").style.width); divW = parseInt(document.getElementById("div1").style.width); x += 1; document.getElementById("div1").style.left = x; if (x > clipW) { x = -400; } setTimeout('rollText()',20); } function init() { x = initX; setTimeout('rollText()',20); } // --> </script> <div id="block1" style="position:absolute;top:0px;left:0px;width:600px;height:100px;clip:rect(0,600,100,0);"> <div id="div1" style="position:absolute;top:0px;left:0px;width:400px;height:100px;background-color:lightcyan;" onClick="init()"> move box </div> </div> clip:rect(0,600,100,0);が表示させる部分の範囲となり(上、右、下、左)となります(実際に数値を変えてみてもらうと分かると思います) あと参考サイトではdocument.all~となっていてIE専用となってましたので変えてみたのですがIE以外での動作は未確認です(><) もしダメなようでしたら↓のサイトを参考に作ってみてはいかがでしょう?(スクロール以外のスクリプトも入っているのですが・・・) http://www.openspc2.org/reibun/javascript/string/036/index.html http://www.openspc2.org/reibun/javascript/string/037/index.html

参考URL:
http://www.openspc2.org/reibun/javascript/string/041/index.html
zuntata99
質問者

お礼

ご回答ありがとうございます。 FireFoxでは動作させることができませんでした。 でも、今後の参考に、利用させていただきます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

こんなんでどうでしょう? (オーバーフローをさけるため最終位置をいれた方がいいかなぁ・・) <script language=javascript> pos=0; function init(){ var timerID=setInterval(moveY, 500); } function moveY(){ var obj = document.getElementById("div1"); pos+=(pos<10)?1:0; //posの最大値は10 obj.style.marginLeft =pos; document.getElementById("debug").innerHTML=pos; } </script> <div id="div1" class="div1" onclick="init();">move box</div> <div id="debug"></div>

zuntata99
質問者

お礼

ご回答ありがとうございます。 div箱実体を動かしたかったので、marginの利用は考えておりませんでした。 しかし、MAXをつけるのは非常に参考になりました。 ありがとうございます。

回答No.2

position:absolute か position:relative にしてありますか? > <div id="div1" class="div1" onclick="init();">move box</div> この書き方はclassによりスタイルは適用されますが、 style属性が書かれていないのでobj.style.leftはnullになります。 やりかたはいろいろありますが、 <div (略) style="left:0px;">move box</div> とあらかじめ指定しておくか、 if(obj.style.left===null)obj.style.left='1px'; // if文のイコールは3つ とするのが簡単だと思います。

zuntata99
質問者

補足

ご回答ありがとうございます。 CSSもつけるべきでした。 外部CSSでposition:absoluteを設定してあります。

  • ESate
  • ベストアンサー率64% (11/17)
回答No.1

obj.style.leftの中身は[○px]となっており型はstringである よってobj.style.left+1+"px"は[○px1px]となり代入出来ない値となる obj.style.leftを数値変換してやることが必要である 解決例: function moveY(){ var obj = document.getElementById("div1"); obj.style.left = parseInt(obj.style.left)+1 + "px"; //修正箇所 }

zuntata99
質問者

補足

ご回答ありがとうございます。 頂いた解決例を試してみたのですが、divは右に移動してくれませんでした。 ためしに、 function moveY(){ var obj = document.getElementById("div1"); alert(obj.style.left); obj.style.left = parseInt(obj.style.left)+1 + "px"; //修正箇所 } としてみたのですが、アラートの内容は空でした。 もしかして、そもそも、divが取れていないのかと考え、 colorの変更など試してみたところ、それは適用されたので、 objに正しくdivが入っているようです。 では、何故obj.style.leftの値が増やせないのでしょうか....

関連するQ&A

  • 同じ i 番目のclassを連動させることはできますか?

    お世話になります <script type="text/javascript"><!-- window.onload = function() { document.getElementsByClassName = function (className) { var i, j, eltClass; var objAll = document.getElementsByTagName ? document.getElementsByTagName("*") : document.all; var objCN = new Array(); for (i = 0; i < objAll.length; i++) { eltClass = objAll[i].className.split(/\s+/); for (j = 0; j < eltClass.length; j++) { if (eltClass[j] == className) { objCN.push(objAll[i]); break; } } } return objCN; } obj0 = document.getElementsByClassName("id"); obj1 = document.getElementsByClassName("pass"); for(i=0;i<obj0.length;i++) { obj0[i].onclick = function() { obj1[i].style.display = "block"; } } } //--></script> <style type="text/css"><!-- .id { width:150px; float:left; cursor:pointer; } .pass { display:none; } .pass0 { width:100px; } --></style> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass0"> <input type="button" name="login" value="LOG IN" class="login"> </div> <div class="id">名前1</div> <div class="pass"> <input type="password" name="password" class="pass"> <input type="button" name="login" value="LOG IN" class="login"> </div> のような感じでclass("id")[0]をクリックしたらclass("pass")[0]を表示、class("id")[1]をクリックしたらclass("pass")[1]を表示・・・というふうにしたいのですがなかなかうまくいきません>< 名前とパス両方を入力にしてやる方法もできますし、 それぞれのclass("id")にfunction()を振って obj0[0].onclick = function() { obj1[0].style.display = "block"; } obj0[1].onclick = function() { obj1[1].style.display = "block"; } のようなやり方もできるのはできます 後者のやり方は他の部分でもいろいろ使っているので記事やメンバーが増えるたびに新たに追加していかないといけないので***.onclick = function() { } を配列にするなどまとめてできる方法があれば教えていただきたいのですが^^;

  • div要素をランダムに表示させたい

    お世話になります。Javascriptについて質問させていただきます。 拙い説明で分かりにくいかと思いますが、ご教授いただけたらと思います。 javascriptとcssを使用して、ページをリロードする度に、divの要素をランダムに表示させるようにしたいと考えています。 ランダムで表示させるにはfunction test(no)関数のどこかにランダムで値を取得できるようにする必要があると思っているのですが、上手く設定ができずに悩んでいます。 ご回答頂けたら幸いです。 ■ html <body onLoad="test(no)"> <div id="link"> <div class="link01"> <p>文章1</p> </div> <div class="link02"> <p>文章2</p> </div> <div class="link03"> <p>文章3</p> </div> </div> <ul> <li><a href="#" onclick="showChanger(1);">リンク1</a></li> <li><a href="#" onclick="showChanger(2);">リンク2</a></li> <li><a href="#" onclick="showChanger(3);">リンク3</a></li> </ul> ■javascript function test(no){ var parenObj=document.getElementById("link"); for(var i in parenObj.childNodes){ var childObj=parenObj.childNodes[i]; if(childObj.tagName=="DIV"){ if(no == 1){ if(childObj.className=="link01"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } if(no == 2){ if(childObj.className=="link02"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } if(no == 3){ if(childObj.className=="link03"){ childObj.style.display = "block"; }else{ childObj.style.display = "none"; } } } } } ■css .link01 { display:block; margin-bottom:10px; } .link02 { display:none; margin-bottom:10px; } .link03 { display:none; margin-bottom:10px; }

  • DIVの高さをかっこよく変える方法

    皆さん、教えてください ボタンを押すとDIVの高さを、動的に大きくするjavascriptを構築しています ですが初めにサイズを指定しないで、なおかつDIVを表示しないページなので、 どうしても初めにDIVを一瞬でも表示しなければなりません それを解決させる方法はありますでしょうか 皆さんのお知恵をお貸しください ソースコード <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>高さを変えるサンプル</title> <script TYPE="text/javascript"> <!-- var max = 0; var hmove = 0; function init(){ max = document.all("height1").offsetHeight document.all("height1").style.display = "none"; } function Height(){ document.all("height1").style.display = "block"; htime = setTimeout("Height()", 30); document.getElementById("height1").style.height = hmove * 3 + "px"; hmove++; if((hmove * 3) >= max){ hmove = 0; clearTimeout(htime); } } //--> </script> </head> <body onload="init()"> <a href='javascript:onClick=Height();'>ここ</A> <div id="height1" style="background:red;overflow:hidden;"> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br> 10<br> </div> </body> </html>

  • マウスポインタが砂時計に

    IE6で、以下のスクリプトを表示させると、 マウスカーソルが砂時計になって、チカチカします。 <script language="JavaScript"> var x = 10; function hogehoge() { document.getElementById('test').style.left = x + "px"; x++; } setInterval ( 'hogehoge()',50 ) ; </script> <div id="test">xxxx</div> チカチカしなくなるようにしたいのですが、方法が有りましたらご教授願います。 なお、オブジェクトはこれ以上軽くすることは出来ません。 よろしくお願いいたします。

  • ひとつのボタンでタイマーを動かしたり止めたりしたいのですが

    ひとつのボタンでタイマーを動かしたり止めたりしたいのですが こんにちは 趣味でjavascriptをしているものです 以下のサイトから、テトリスのコードをダウンロードしたのですが、 http://java.aimary.com/ このjavascriptの動くhtml内に  gameInterval(ゲーム内のタイマー変数)を 使って、ポーズボタンのようなものを追加したいと思ったのですが、 以下のコードのようにすると、いったん停止したとおもったら、 再びタイマーが呼び出され、何度も押すと、タイムインターバルが 短くなっていきました。 //headに追加 function clear_timer() { var obj = document.getElementById("timer_control"); clearInterval( gameInterval ); obj.detachEvent('onclick', clear_timer); obj.attachEvent('onclick', set_timer ); } function set_timer() { var obj = document.getElementById("timer_control"); obj.detachEvent('onclick', set_timer ); obj.detachEvent('onclick', clear_timer ); gameInterval = window.setInterval("Handle_Interval()", (maxspeed-speed+1)*60); obj.attachEvent( 'onclick', clear_timer ); } //bodyに追加 <div style='position:absolute; left:520px; top:100px;'> <form name='Form1'> <input type="button" id="timer_control" value="pause" onclick="JavaScript:clear_timer();"> </form> </div> おそれいりますが、どなたか、正しい記述の仕方を 教えていただけないでしょうか? よろしくおねがいします。

  • getElementsByNameで要素が取得できない

    久々にJavaScriptを組みました。 以下のソースコードなんですが、ボタンクリック時にalertで「1」 が表示されるはずだと思っているのですが、「0」が返ってきます。 何かおかしなところはありますでしょうか?宜しくお願いします。 <html> <head> <script language="javascript"> function test(){ var obj = document.getElementsByName("name1"); alert(obj.length); } </script> </head> <body> <div name="name1"></div> <button onclick="test();">TEST</button> </body> </html>

  • 2段階ラジオボタン後、DIVを表示したい

    色々と自力で試行錯誤しましたが、知識が足りません。 javaScriptのif構文とかswich構文の部分が問題かなぁ~と推測しますが、自力で構文を認識・改造が出来ませんので、ご指導をお願い致します。 1段目(ラジオ)<バス><電車> 2段目(ラジオ)<バス/高級><バス/普通> 2段目(ラジオ)<電車/高級><電車/普通> 3段目(DIV)<高級バス><バス><高級電車><電車> 2段目の動作がオカシイです。 連動している一方のみを表示したいです。(連動してないその他は、見えなくしたいです) 以下、ソースです。 <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <head> <style type="text/css"> .second , .third{ display: none; } </style> <script type="text/javascript"><!-- function AllHide() { document.getElementById('bus_high').style.display = 'none'; document.getElementById('bus_normal').style.display = 'none'; document.getElementById('train_high').style.display = 'none'; document.getElementById('train_normal').style.display = 'none'; } function SetSubMenu( idname ) { AllHide(); if( idname != "" ) { document.getElementById(idname).style.display = 'block'; } } // --></script> </head> <body> <form action=""> <label><input type="radio" name="move" value="bus" id="move_0" onClick="SetSubMenu(value);">バス</label> <label><input type="radio" name="move" value="train" id="move_1" onClick="SetSubMenu(value);">電車</label> </form> <form action=""> <div class="second" id="bus"> <label><input type="radio" name="grade" value="bus_high" id="grade_0" onClick="SetSubMenu(value);">バス/高級</label> <label><input type="radio" name="grade" value="bus_normal" id="grade_1" onClick="SetSubMenu(value);">バス/普通</label> </div> <div class="second" id="train"> <label><input type="radio" name="grade" value="train_high" id="grade_2" onClick="SetSubMenu(value);">電車/高級</label> <label><input type="radio" name="grade" value="train_normal" id="grade_3" onClick="SetSubMenu(value);">電車/普通</label> </div> </form> <div class="third" id="bus_high">高級バス</div> <div class="third" id="bus_normal">バス</div> <div class="third" id="train_high">高級電車</div> <div class="third" id="train_normal">電車</div> </body> </html>

  • javascriptで困っています。教えてください

    javascript初心者です。以前javascriptでクラスについていろいろな方にアドバイスをいただき、疑問が解決しました。ありがとうございました。 そこで、そのクラスから作ったインスタンスを移動させようとしているのですが、うまくいきません。 html <body onload="init();"> <div id="a"></div> </body> css body{ position:relative; } #a{ width:100px; height:100px; position:absolute; background-color:#0F0; } javascript function Character(x,y){      this.ele = document.getElementById("a"); this.x = x; this.y = y; this.move = function () { this.x += 10; this.y += 10; this.ele.style.left = this.x+"px"; this.ele.style.top = this.y+"px"; } } function init(){ var cha = new Character(10,10); var timer; timer = setInterval("loop()",1000); } function loop(){ cha.move(); } としたら、緑の正方形がx方向、y方向に移動1秒毎に10pxずつ増えながら移動していくと思っていたのですが、うまくいきませんでした。 setIntervalを使わず、var cha = new Character(10,10);の後にcha.move();cha.move();cha.move();c1.move();cha.move();とすると、座標(60,60)に緑の正方形が現れます。 緑の正方形を移動させるにはどうしたらいいのでしょうか。教えてください。

  • <div>タグの中にscriptで表示

    プログラムを初めて2年目、JSは一年目です。 配列の文字列をランダム表示したいのですが、<div>タグの中にscriptで表示させるにはどうしたらよいでしょう? ソースは下記です。 ~~~~~~~~~~~~~~~~~~~~~~~~ <script type="text/javascript"> var comment = new Array(3) ;   //配列を作ってます。 week[0] = "なるほど" ; week[1] = "賛成" ; week[2] = "そう思いません。" ; var randnum = Math.floor( Math.random() * 3 ); // 0,1,2のランダム window.onload = function(){ setInterval('vi()' , 2000 ); } function vi(){ var e = document.getElementById('comment'); e.style.visibility = 'visible'; } // 2秒後にメッセージが表示されます。 </script> <div id="comment" style="visibility:hidden; position:absolute; border: 3px ridge gray; background-color:#ffffcc"> ★ここに配列の文字列を、ランダムで表示したい </div> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ document.write(comment[ randnum]) ; をうまく使えないでしょうか? よろしくお願いします。

  • あとだしじゃんけんで

    こんにちは。趣味でjavascriptをしている者です。 さっそくですが質問させていただきます あとだしじゃんけんを作っているのですが、 キーコードによって、グー、チョキ、パーを表示させることが できません・・・ 以下のコードの悪い点を指摘していただけないでしょうか よろしくお願いします <html> <head> <script type="text/javascript"> function init() { document.onkeypress = KeyPressed; } function KeyPressed() { switch(event.keyCode) { case 49: appendElement ( "Mytable", "jk/Myhand1.jpg"); break; case 50: appendElement( "Mytable", "jk/Myhand2.jpg"); break; case 51: appendElement( "Mytable", "jk/Myhand3.jpg"); break; default: break; } } function henkou() { document.getElementById("span1").childNodes[0].nodeValue = "こんばんは!!"; } function removeElement( id ) { var obj = document.getElementById( id ); if ( obj.hasChildNodes() ) { obj.removeChild( obj.lastChild ); } } function appendElement( pid, src) { var pobj = document.getElementById( pid ); var cobj = document.createElement("img"); cobj.src = src; pobj.appendChild( cobj ); } </script> </head> <body bgColor="rgb(230,240,250)"> <form name="Form1"> <input type="button" value="変更" onClick="henkou()">  <input type="button" value="remove1" onClick="removeElement( 'PCtable' );">  <input type="button" value="remove2" onClick="removeElement( 'Mytable' );"><br> <input type="button" value="append1" onClick="appendElement( 'PCtable', 'jk/PChand3.jpg' );"> </form> <div id="div1" style="position:absolute; left:130px; top:80px;"> <table width="200" height="200" bgColor="00ef66"> <td id="PCtable"> <img id="PHi" src="jk/PChand1.jpg"></td></table> </div> <div id="div2" style="position:absolute; left:430px; top:80px;"> <table width="200" height="200" bgColor="00ef66"> <td id="Mytable"> <img id="MHi" src="jk/Myhand1.jpg"></td></table> </div> <div style="position:absolute; left:360px; top:210px;"> <span id="spanvs" style="color:#ff2244; font-size:36px; font-weight:bold;"> VS </span> </div> <div style="position:absolute; left:100px; top:310px;"> <span id="span1" style="color:#0055ff; font-size:26px; font-weight:bold;"> こんにちは </span> </div> <div style="position:absolute; left:100px; top:350px;"> <span id="span1" style="color:#00ff55; font-size:26px; font-weight:bold;"> おはようございます </span> </div> </body> </html>

専門家に質問してみよう