• ベストアンサー

DIV内のDIV要素を移動する。

いつもお世話になります。 DIV内にDIVをいくつか作り、position:absolute; で、それぞれ位置を指定します。 この、DIV内のDIVをマウスによりその位置を移動するにはどのようにしたらよいものでしょうか。 BODYタグ内のDIVについてのサンプルは、 http://jsm.suepon.com/script/jsm31.html に、わかりやすいものが掲載してありましたが、 これを基にと思うのですが、行き詰まってしまいました。 おわかりになる方見えましたら、どうかよろしくお願いします。

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

  • ベストアンサー
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.5

ええと、対策はわかりました。 とりあえず、3の回答の後半部を以下のようにしてください。 ------------------------------------ <style> div{ border:solid blue 2px;background-color:yellow; }; </style> </head> <body onload="init();"> <div id="test1" style="width:300px;height:300px;">TEST1 <div id="test2" style="width:200px;height:200px;">TEST2 <div id="test3" style="width:100px;height:100px;">TEST3 </div> </div> </div> </body> ------------------------------------ それぞれに幅・高さと背景色をつけただけですが。 こうしないと、IEで、移動後にドラッグ可能な部分が文字のところだけになってしまいます。 原因は・・・不明^^; これでご要望は満たせますでしょうか?

rqg2010
質問者

補足

susie-tさん、ありがとうございます。 いろいろ試していますが、susie-tさんの速度についていけません。 すぐに、お返事できなくてすみません。 改めて、お礼をさせていただきます。 まずは、新たなアドバイスに対するお礼まで。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • susie-t
  • ベストアンサー率86% (37/43)
回答No.4

すみません、下の回答、IEで不具合がありました。ただ、ちょっといま改修する時間がないです。参考程度にしていただくか、改修までしばらくお待ちください・・・。バタバタして申し訳ないです。

rqg2010
質問者

補足

No.3のお礼を申し上げて、その「お礼」の確認をしたら、新たにレスがありまして驚きました。 私の方、いろいろと試すだけでも時間がかかっております。 >改修までしばらくお待ちください・・・。 いつまでも待ちます。 私も勉強させていただきます。 どうも、ご丁寧にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.3

> <div id="test1"> > <div id="test2"> > 内の<div>タグをとなると だとすると根本的にやり方を変えたほうがいいです。 以下、サンプルです。要素IDを引数にしてmakeDraggable関数を呼び出すだけでOKです。場所は問いません。 ----------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 //EN"> <html> <head> <script> function getStyle(elem, IEStyleProp, CSSStyleProp){ if(elem.currentStyle){ return elem.currentStyle[IEStyleProp]; }else if(window.getComputedStyle){ var compStyle = window.getComputedStyle(elem, ""); return compStyle.getPropertyValue(CSSStyleProp); } } function pointerX(event) { return event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)); } function pointerY(event) { return event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop)); } function stop(event) { if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else { event.returnValue = false; event.cancelBubble = true; } } function makeDraggable(id){ var element = document.getElementById(id); var pos = getStyle(element, 'position', 'position'); if (pos == 'static' || !pos) { element.style.position = 'relative'; if (window.opera) { element.style.top = 0; element.style.left = 0; } } element.style.cursor = "pointer"; element.onmousedown = start; var dx = dy = 0; function start(event){ event = event || window.event; var x = getStyle(element, 'left', 'left'); var y = getStyle(element, 'top', 'top'); x = (!x || x == 'auto') ? 0 : parseInt(x); y = (!y || y == 'auto') ? 0 : parseInt(y); dx = pointerX(event) - x; dy = pointerY(event) - y; document.onmousemove = move; document.onmouseup = end; stop(event); } function move(event){ event = event || window.event; var x = parseInt(pointerX(event) - dx); var y = parseInt(pointerY(event) - dy); element.style.left = x + "px"; element.style.top = y + "px"; stop(event); } function end(){ document.onmousemove = null; document.onmouseup = null; stop(event); } } function init(){ makeDraggable("test1"); makeDraggable("test2"); makeDraggable("test3"); } </script> <style> div{border:solid blue 2px}; </style> </head> <body onload="init();"> <div id="test1">TEST1 <div id="test2">TEST2 <div id="test3">TEST3 </div> </div> </div> </body> </html>

rqg2010
質問者

お礼

susie-tさん、ご丁寧なレスありがとうございます。 早速試してみました。 ともかく、凄そう。「こんなことできるんだ。」と、いった感想です。 ありがとうございます。 じっくりと、研究させていただきます。 まずは、お礼まで。

全文を見る
すると、全ての回答が全文表示されます。
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.2

申し訳ありません。再度コードを挙げます。 この方法ではdocument.allは使用できないようなので、IEでも要素取得にdocument.getElementByIdを使用しました。このため、古いIEは対象外となります。 ---------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 //EN"> <html> <head> <script> N4 = GK = IE = obj = eoX = eoY = 0; if (document.layers) N4 = 1; else if (document.all) IE = 1; else if (document.getElementById) GK = 1; function init() { var test = null; if (N4) { list = document.layers; document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP); } else list = document.getElementById("test").getElementsByTagName("div"); for (i = 0; i < list.length; i ++) { if (N4) list[i].captureEvents(Event.MOUSEDOWN); list[i].onmousedown = down; } document.onmouseup = up; document.onmousemove = move; } function down(e) { obj = this; if (N4) { eoX = e.layerX; eoY = e.layerY; for (i in list) list[i].zIndex = 0; obj.zIndex = 1; } else if (GK) { eoX = e.pageX - parseInt(obj.style.left); eoY = e.pageY - parseInt(obj.style.top); } else if (IE) { eoX = event.clientX + document.body.scrollLeft - this.style.posLeft; eoY = event.clientY + document.body.scrollTop - this.style.posTop; } if (! N4) { for (i = 0; i < list.length; i ++) list[i].style.zIndex = 0; obj.style.zIndex = 1; } return false; } function move(e) { if (obj) { if (N4) obj.moveTo(e.pageX - eoX,e.pageY - eoY); else if (GK) { obj.style.left = (e.pageX - eoX) + "px"; obj.style.top = e.pageY - eoY + "px"; } else if (IE) { obj.style.left = (event.clientX + document.body.scrollLeft - eoX) + "px"; obj.style.top = (event.clientY + document.body.scrollTop - eoY) + "px"; } return false; } } function up(e) { obj = null; } onload = init; </script> </head> </body> <!-- position:absolute を指定したdivで囲んだ物は幾つでも全て移動の対象になります --> <div id="test"> <div style="position:absolute; left:50px; top:70px; z-index:0;"> <img src="xxx.gif"> </div> <div align=center style="width:150px; height:100px; border:double 3px black; position:absolute; left:250px; top:70px; z-index:0;"> <table height=100%><td> この文章と<br>左右の画像は<br>マウスで<br>移動できます </td></table> </div> <div style="position:absolute; left:450px; top:70px; z-index:0;"> <img src="yyy.gif"> </div> </div> </body> </html> ---------------------------------------------------- 失礼しました。

rqg2010
質問者

補足

できました。 ありがとうございます。 最初の質問が言葉足らずだったんですが、 <div id="test"> 内の<div>は動作しますが、 <div id="test1"> <div id="test2"> 内の<div>タグをとなると親エレメントのオブジェクトを取得するのに else list = document.getElementById("test*").getElementsByTagName("div"); とかできないんですね。 なにか良い方法はないものでしょうか。 最初思ったようには動作しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • susie-t
  • ベストアンサー率86% (37/43)
回答No.1

外側のDIVのidを「test」とした場合の例。IE6、Firefox2で動作は確認しました。N4は環境がなく対応してません。(document.layersをtest.layers等で可能?) グローバル変数名offsetX、offsetYはFirefoxでwindowオブジェクトのプロパティとバッティングしてしまうので変更しています。 styleプロパティへの登録時、"px"等の単位をつけたほうがいいです。(Firefoxはそうでないと動作しません) 余談ですが、最近のIEならgetElementByIdに対応しているので、判定は不要な気がします。 ---------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 //EN"> <html> <head> <script> N4 = GK = IE = obj = eoX = eoY = 0; if (document.layers) N4 = 1; else if (document.all) IE = 1; else if (document.getElementById) GK = 1; alert(GK); function init() { var test = null; if (N4) { list = document.layers; document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP); } else if (GK) list = document.getElementById("test").getElementsByTagName("div"); else if (IE) list = document.all("test").tags("div"); for (i = 0; i < list.length; i ++) { if (N4) list[i].captureEvents(Event.MOUSEDOWN); list[i].onmousedown = down; } document.onmouseup = up; document.onmousemove = move; } function down(e) { obj = this; if (N4) { eoX = e.layerX; eoY = e.layerY; for (i in list) list[i].zIndex = 0; obj.zIndex = 1; } else if (GK) { eoX = e.pageX - parseInt(obj.style.left); eoY = e.pageY - parseInt(obj.style.top); } else if (IE) { eoX = event.clientX + document.body.scrollLeft - this.style.posLeft eoY = event.clientY + document.body.scrollTop - this.style.posTop } if (! N4) { for (i = 0; i < list.length; i ++) list[i].style.zIndex = 0; obj.style.zIndex = 1; } return false; } function move(e) { if (obj) { if (N4) obj.moveTo(e.pageX - eoX,e.pageY - eoY); else if (GK) { obj.style.left = (e.pageX - eoX) + "px"; obj.style.top = e.pageY - eoY + "px"; } else if (IE) { obj.style.left = (event.clientX + document.body.scrollLeft - eoX) + "px";; obj.style.top = (event.clientY + document.body.scrollTop - eoY) + "px";; } return false; } } function up(e) { obj = null; } onload = init; </script> <!-- position:absolute を指定したdivで囲んだ物は幾つでも全て移動の対象になります --> <div id="test"> <div style="position:absolute; left:50px; top:70px; z-index:0;"> <img src="xxx.gif"> </div> <div align=center style="width:150px; height:100px; border:double 3px black; position:absolute; left:250px; top:70px; z-index:0;"> <table height=100%><td> この文章と<br>左右の画像は<br>マウスで<br>移動できます </td></table> </div> <div style="position:absolute; left:450px; top:70px; z-index:0;"> <img src="yyy.gif"> </div> </div> </body> </html>

rqg2010
質問者

お礼

susie-tさん、早速レスありがとうございます。 ご丁寧にスクリプトまで記載していただきありがとうございます。 しかし、残念ながら、動作しません。 </script> の次に </head> <body> を入れてみました。 IE6を主に使用していますので、 alert(GK); を alert(IE); と、してみました。1が表示されます。 その他、細部のチェックはしていません。 これから、細部について見させていただきます。 まずは、お礼まで。 ありがとうございました。

rqg2010
質問者

補足

補足にてお礼させていただきます。 イベントについていまいち理解していないところがあり、 これから勉強していきます。 susie-tさんよりのアドバイスは、とてもわかりやすかったです。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CSSのdivのposition:relative;で位置がずれない

    IE6を使用しています。 次のような 「sample.css」 .sample {height:90px; background-color:#00ff00; font-weight:bold; position:relative; top 40px; } .sample2 {color:#ff0000; position:absolute; top:10px; left:10px } .sample3 {color:#ff0000; position:absolute; top:30px; left:30px } 「a.html」 <html> <head> <link rel="stylesheet" href="sample.css" type="text/css"> </head> <body> <div class="sample"> position:relative <div class="sample2"> sample2 </div> <div class="sample3"> sample3 </div> </div> </body> </html> を実行した場合に、ブラウザのトップから40pxだけ下にclass="sample"にある内容を 表示させたいのですが、どうも下にずれてないようなのです・・・ 何が原因なのでしょうか?

    • ベストアンサー
    • HTML
  • <DIV>の使い方

    また、お世話になります。 HPを作成する際、画面のサイズによって文字が改行されますよね。 これを防ぐ為に私は、 <BODY> <DIV STYLE="position: absolute; top: 0; left: 0; width: 1000; height: 2400"> ・・・ </DIV> </BODY> としているのですが、この使い方は間違っているのでしょうか? 表とか出なくても、<TD>や<TR>などで作成したほうがよいのでしょうか? アドバイス、よろしくお願い致します。

    • ベストアンサー
    • HTML
  • div要素を半透明にして且つ外枠をつけたい

    div要素を半透明にして且つ外枠をつけたいです。 下記のように書いたのですが、borderも一緒に半透明になってしまいます。添付画像の様にするにはどうしたらよいでしょうか? 教えてください。 <html> <head> <style> div{ background: green; opacity:0.2; filter: alpha(opacity=20); border: 1px solid green; } #hoge{ position: absolute; top: 0; left: 50; width :50; height :50; } </style> </head> <body> あいうえお <div id='hoge' ></div> </body>

    • ベストアンサー
    • HTML
  • HTMLの画像の位置の指定

    HTMLで、画像の位置などを決めるときに、<div align="center"></div>などを使いますが、CSSやジャバスクリプトで使用している、 position:absolute; 絶対配置 position:relative; 相対配置 position:static; 通常配置(指定しない場合はこれ) position:fixed; 上のようなポジションタグを使う事は可能ですか? できれば、そのサンプルのようなものを書いてもらえると 助かります。

    • ベストアンサー
    • HTML
  • 文字を移動させその位置を表示したい

    複数のプログラムを拝借し組み合わせたのですが、以下3点の内容にしたく質問しました。宜しくお願いいたします。 (1)文字「このオブジェクトが移動します」を移動させその位置を表示したいのですが、マウスの位置が表示されています。 (2)文字「このオブジェクトが移動します」に合わせクリックすると反転表示になりますが反転表示にならないようにしたいです。 (3)動作するのですがエラーが表示されます。エラーの原因は何でしょうか? <HTML> <HEAD> <STYLE type="text/css"> </STYLE> <SCRIPT language="JavaScript"> <!-- var target; var isDrag=0; function document_onmousedown(){ isDrag=1; target=event.srcElement;} function document_onmousemove(){ if( isDrag ){ target.style.top=event.clientY-8; target.style.left=event.clientX-8;} } function document_onmouseup(){ isDrag=0; sample.style.top=text1.style.top; sample.style.left=text1.style.left; } document.onmouseup = fOnmousemove; function fOnmousemove() { sClientX.value = event.clientX; sClientY.value = event.clientY; } //--> </SCRIPT> </HEAD> <BODY onmousemove="document_onmousemove()" onmousedown= "document_onmousedown()" onmouseup="document_onmouseup()"> <DIV style="position:relative" id=sample> このオブジェクトが移動します </DIV> <DIV id="test" id=text1 style="position:absolute;font-size:24px; cursor:hand"> </DIV> <SCRIPT language="JavaScript"> </SCRIPT> clientX=<input type="text" id="sClientX"><br> clientY=<input type="text" id="sClientY"><br> </BODY> </HTML>

  • Divの入れ子とHeight

    こんにちわ。初歩的な質問かもしれませんがお願いします。 DivのContainerの中にPosition:Absoluteの3つのDivを入れ子にしたいんですが、Containerの高さを中身のDivの高さに依存する形にしたいのですが、うまくいきません。 Containerの高さと中身のコンテンツの高さをAutoにした場合、中身のほうは内容に依存する形で高さが自動になるんですが、Containerのほうがうまくいきません。FloatをつかわずにPosition:Absoluteでして、Containerを中身の高さに依存、という風にする方法はないのでしょうか? こちらがコードです。 HTML CODE <HTML> <HEAD> <link rel="stylesheet" href="hp.css" type="text/css" /> </HEAD> <BODY> <div class="container"> <div class="banner"> </div> <div class="menu"> </div> <div class="main"> a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br> </div> </div> </BODY> </HTML> CSS CODE * {margin:0;padding: 0;} div.container{border:2px solid RGB(888888); position: absolute; top:20px; left:50px; width:900px; height:auto;} div.banner { position: absolute; top:20px; left:80px; width:700px; height:150px; border:2px solid RGB(888888);} div.menu{ position: absolute; top:190px; left:30px; width:150px; height:300px; font-weight:bold; border:2px solid RGB(888888);} div.main{ position:absolute; top:190px; left:200px; width:600px; height:auto; border:2px solid RGB(888888);}

    • ベストアンサー
    • HTML
  • スタイルシートで位置固定すると、スタイルシートでの改ページ指定ができなくなる

    スタイルシートのpositionを使用して位置固定すると、page-break-beforでの 改ページができなくなります。 位置固定し、かつ、その文字の直前で改ページする方法はないでしょうか? ブラウザはIE5.5以降を考えてます。 ====================================================================== <html> <body> <div style="position:absolute; top:100px;"> テスト1 </div> <div style="position:absolute; top:150px; page-break-before:always;"> テスト2(この文字の直前で改ページさせたい) </div> <div style="position:absolute; top:200px;"> テスト3 </div> </body> </html> ====================================================================== 宜しくお願いします。

    • ベストアンサー
    • HTML
  • <DIV>タグで書いた文字が、

    <DIV>タグで書いた文字が、 IEで位置を合わせるとFIREFOXではズレてしまいます。 どうしてなんでしょう? <DIV style="top : 79px;left : 55px; position : absolute; z-index : 23; width : 530px; height : 13px; " id="moji"> <P><FONT size="2">IE8とFIREFOXとでズレる</FONT></P> どうもこんな感じのプログラムで、だいたい20ピクセルぐらい下がって表示されてしまうようです。 前に同じ質問をしたのですが、うまく解決できなかったもので急いでます…

  • メニュー3つとも個々にドロップして移動したいのですが

    メニュー3つとも個々にドロップして移動したいのですが、どのように すれば良いのでしょうか。 お願いします。 <html> <head> <title>ドラッグして画像を移動する</title> <script type="text/javascript"><!-- //2つ適応 window.onload=function(){ flag = false; offx = 80; offy = 100; document.getElementById("menu1").onmousedown= function dragOn(){ flag = true;} window.document.onmousemove = dragImg; window.document.onmouseup = dragOff; function dragOff(){ flag = false; } function dragImg(){ if (!flag) return; document.getElementById("menu1").style.top = event.y-offx; document.getElementById("menu1").style.left = event.x-offy; return false;} } // --></script> </head> <body> <div id="menu1" style="background-color:red; position:absolute; width:120px;height:150px;">メニュー1</div> <div id="menu2" style="background-color:green; position:absolute;top:200px;width:120px;height:150px;">メニュー2</div> <div id="menu3" style="background-color:blue; position:absolute;top:400px;width:120px;height:150px;">メニュー3</div> </body> </html>

  • javascriptで指定するdivを読み込み

    初歩的な質問ですみません。 どなたか詳しい方教えてください。 同一ページ内で、指定したdivの内容を読み込みしたいのですが javascriptで以下のことは可能でしょうか? <html> <body> <div id="sample">内容内容内容内容内容内容</div> • • • ここにもsampleの内容を読み込んで表示させたい。 </body> </html>

スキャナーの製品名:FAX2840
このQ&Aのポイント
  • スキャナーとして使用できるFAX2840についての相談やトラブルに関する質問です。
  • お使いの環境について、電話回線の種類を教えてください。
  • この質問はブラザー製品に関するものです。
回答を見る