質問編集履歴

5

不要なコードを削除しました

2018/12/30 05:25

投稿

masayasasaki96
masayasasaki96

スコア19

test CHANGED
File without changes
test CHANGED
@@ -128,8 +128,6 @@
128
128
 
129
129
  add_box.addEventListener("click", () => {
130
130
 
131
- alert("aiueo");
132
-
133
131
  let div4box = document.createElement("div");
134
132
 
135
133
  div4box.insertAdjacentHTML("afterbegin", '<div id=box' + box_count + '><table><tr><td>hoge1</td></tr><tr><td>hoge2</td></tr></table></div>');

4

コード等を追加しました

2018/12/30 05:25

投稿

masayasasaki96
masayasasaki96

スコア19

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,246 @@
16
16
 
17
17
 
18
18
 
19
+ #作成したコード
20
+
19
- これらようにすれば現できるのでょうか?
21
+ 現在、追加ボタン「+」ています。
22
+
23
+ ```HTML
24
+
25
+ <!DOCTYPE html>
26
+
27
+ <html lang="ja">
28
+
29
+ <head>
30
+
31
+ <meta charset="utf-8">
32
+
33
+ <title>box</title>
34
+
35
+ <link rel="stylesheet" href="bx.css">
36
+
37
+ </head>
38
+
39
+ <body>
40
+
41
+ ボックス追加:
42
+
43
+ <button id="add_box">+</button>
44
+
45
+
46
+
47
+ <div class="box" id="boxes">
48
+
49
+ <!-- ここを動的に作成したいです
50
+
51
+ <div id="box0">
52
+
53
+ <table>
54
+
55
+ <tr>
56
+
57
+ <td>
58
+
59
+ hoge1
60
+
61
+ </td>
62
+
63
+ </tr>
64
+
65
+ <tr>
66
+
67
+ <td>
68
+
69
+ hoge2
70
+
71
+ </td>
72
+
73
+ </tr>
74
+
75
+ </table>
76
+
77
+ </div>
78
+
79
+ -->
80
+
81
+
82
+
83
+ <!--
84
+
85
+ <div id="box1">
86
+
87
+ <table>
88
+
89
+ <tr>
90
+
91
+ <td>
92
+
93
+ hoge1
94
+
95
+ </td>
96
+
97
+ </tr>
98
+
99
+ <tr>
100
+
101
+ <td>
102
+
103
+ hoge2
104
+
105
+ </td>
106
+
107
+ </tr>
108
+
109
+ </table>
110
+
111
+ </div>
112
+
113
+ -->
114
+
115
+ </div>
116
+
117
+ ```
118
+
119
+
120
+
121
+ ```JavaScript
122
+
123
+ <script> /*** プラスボタンでボックスを追加 ***/
124
+
125
+ let add_box = document.getElementById("add_box");
126
+
127
+ let box_count = 0;
128
+
129
+ add_box.addEventListener("click", () => {
130
+
131
+ alert("aiueo");
132
+
133
+ let div4box = document.createElement("div");
134
+
135
+ div4box.insertAdjacentHTML("afterbegin", '<div id=box' + box_count + '><table><tr><td>hoge1</td></tr><tr><td>hoge2</td></tr></table></div>');
136
+
137
+ let parent_div = document.getElementById("boxes");
138
+
139
+ parent_div.appendChild(div4box);
140
+
141
+ box_count++;
142
+
143
+
144
+
145
+ /*** ボックス移動 ***/
146
+
147
+ (function(){
148
+
149
+ let drg_and_drp = document.getElementById("box0");
150
+
151
+ let drag_toggle;
152
+
153
+ let x, y;
154
+
155
+ alert(box_count);
156
+
157
+ drg_and_drp.addEventListener("mousedown", (msdwn_evnt) => {
158
+
159
+ drag_toggle = "on";
160
+
161
+ x = msdwn_evnt.clientX - drg_and_drp.offsetLeft;
162
+
163
+ y = msdwn_evnt.clientY - drg_and_drp.offsetTop;
164
+
165
+ }, false);
166
+
167
+
168
+
169
+ document.body.addEventListener("mouseup", (msup_evnt) => {
170
+
171
+ drag_toggle = "off";
172
+
173
+ }, false);
174
+
175
+
176
+
177
+ document.body.addEventListener("mousemove", (msmv_evnt) => {
178
+
179
+ if(drag_toggle == "on"){
180
+
181
+ /****** ここが機能しません ******/
182
+
183
+ drg_and_drp.style.left = msmv_evnt.clientX - x + "px";
184
+
185
+ drg_and_drp.style.top = msmv_evnt.clientY - y +"px";
186
+
187
+ }
188
+
189
+ }, false);
190
+
191
+ })();
192
+
193
+ }, false);
194
+
195
+ </script>
196
+
197
+
198
+
199
+ </body>
200
+
201
+ </html>
202
+
203
+ ```
204
+
205
+
206
+
207
+ ```CSS
208
+
209
+ .box table {
210
+
211
+ border-radius: 10px;
212
+
213
+ border: 3px solid deepskyblue;
214
+
215
+ border-spacing: 0; /* 無駄な余白を削除 */
216
+
217
+ text-align: center; /* 要素をテーブルの中央に寄せる */
218
+
219
+
220
+
221
+ cursor: grab;
222
+
223
+ position: absolute;
224
+
225
+ z-index: 1000;
226
+
227
+ }
228
+
229
+
230
+
231
+ .box table tr:first-child td {
232
+
233
+ padding: 0px 15px; /* 上下0px、左右15px */
234
+
235
+ border-bottom: 2px solid deepskyblue; /* ヨコ線はbottomだけ表示 */
236
+
237
+ }
238
+
239
+
240
+
241
+ .box table tr:last-child td {
242
+
243
+ padding: 5px 15px; /* 上下5px、左右15px */
244
+
245
+ border-bottom: none; /* テーブルの一番下の線を消す */
246
+
247
+ }
248
+
249
+ ```
250
+
251
+
252
+
253
+ #お尋ねしたいこと
254
+
255
+ 動的にボックスを追加でき表示までされるのですが、それをドラッグして移動させることができません。
256
+
257
+ JavaScriptの最後の関数の中で使用している.style.leftと.style.topの値は変わっているにも関わらず、実際に表示されているボックスの位置に変化がないのですが、どのようにすれば解決できるでしょうか?
258
+
259
+
20
260
 
21
261
  どうぞよろしくお願いいたしますm(_ _)m

3

回答が得られなかったため質問を修正しました

2018/12/30 05:09

投稿

masayasasaki96
masayasasaki96

スコア19

test CHANGED
@@ -1 +1 @@
1
- JavaScriptでドラッグ移動できる要素を動的に作成したいです
1
+ JavaScriptでドラッグ移動できる要素を動的に作成したい
test CHANGED
@@ -1,173 +1,21 @@
1
- #やりたいこと
1
+ #実現したいこと
2
2
 
3
- JavaScript(ネイティヴ)で、次の動作を実現したいです。
3
+ JavaScript(ネイティヴ)で、次の条件を満たす動作を実現したいです。
4
4
 
5
5
  - 初期画面
6
6
 
7
- ・ドラッグで移動可能なボックスが一つある状態
7
+ ・ドラッグで移動可能なボックス(テーブルなどの要素)が一つある状態
8
8
 
9
- ・ボックス追加用ボタン「+」が表示されている状態
9
+ ・ボックス追加用ボタン「+」、削除用ボタン「-」が表示されている状態
10
10
 
11
11
  - 「+」ボタンを押すとボックスが新しく作られ表示される
12
12
 
13
13
  - 追加したボックスはユニークなidを持っていて、ドラッグで動かすことができる
14
14
 
15
-
16
-
17
- #ドラッグでボックスを(一応)移動できコード
15
+ - 「-」タンを押すとボックスが削除され
18
-
19
- ```JavaScript
20
-
21
- <!DOCTYPE html>
22
-
23
- <html lang="ja">
24
-
25
- <head>
26
-
27
- <meta charset="utf-8">
28
-
29
- <title>drag-and-drop</title>
30
-
31
- </head>
32
-
33
- <body>
34
-
35
- <!-- ボックスを作成 -->
36
-
37
- <div class="drag_and_drop">
38
-
39
- <table>
40
-
41
- <tr>
42
-
43
- <td>hoge1</td>
44
-
45
- </tr>
46
-
47
- <tr>
48
-
49
- <td>hoge2</td>
50
-
51
- </tr>
52
-
53
- </table>
54
-
55
- </div>
56
16
 
57
17
 
58
18
 
59
- <style> /*** ボックスの見た目 ***/
60
-
61
- .drag_and_drop {
62
-
63
- cursor: move;
64
-
65
- position: absolute;
66
-
67
- }
68
-
69
-
70
-
71
- table {
72
-
73
- border: 3px solid deepskyblue;
74
-
75
- border-spacing: 0;
76
-
77
- text-align: center;
78
-
79
- }
80
-
81
-
82
-
83
- table tr:first-child td {
84
-
85
- padding: 3px 10px;
86
-
87
- border-bottom: 2px solid deepskyblue;
88
-
89
- }
90
-
91
-
92
-
93
- table tr:last-child td {
19
+ これらはどのようにすれば実現できるのでしょうか?
94
-
95
- padding: 3px 10px;
96
-
97
- }
98
-
99
- </style>
100
-
101
-
102
-
103
- <script> /*** ボックス移動 ***/
104
-
105
- let drg_and_drp = document.getElementsByClassName("drag_and_drop");
106
-
107
- let drag_toggle;
108
-
109
- let x, y;
110
-
111
-
112
-
113
- for(let i = 0; i < drg_and_drp.length; i++){
114
-
115
- drg_and_drp[i].addEventListener("mousedown", (msdwn_evnt) => {
116
-
117
- drag_toggle = "on";
118
-
119
- x = msdwn_evnt.clientX - drg_and_drp[i].offsetLeft;
120
-
121
- y = msdwn_evnt.clientY - drg_and_drp[i].offsetTop;
122
-
123
- }, false);
124
-
125
-
126
-
127
- document.body.addEventListener("mouseup", (msup_evnt) => {
128
-
129
- drag_toggle = "off";
130
-
131
- }, false);
132
-
133
-
134
-
135
- document.body.addEventListener("mousemove", (msmv_evnt) => {
136
-
137
- if(drag_toggle === "on"){
138
-
139
- drg_and_drp[i].style.left = msmv_evnt.clientX - x + "px";
140
-
141
- drg_and_drp[i].style.top = msmv_evnt.clientY - y + "px";
142
-
143
- }
144
-
145
- }, false);
146
-
147
- }
148
-
149
- </script>
150
-
151
- </body>
152
-
153
- </html>
154
-
155
- ```
156
-
157
-
158
-
159
- #お尋ねしたいこと
160
-
161
- **① 上に示したコードの最適化**
162
-
163
- 載せているコードには少しバグ(?)のようなものがあります。具体的には、たまにクリックしていないのにボックスがカーソルについていき、カーソルから離れにくいなどです。
164
-
165
- また、for文を使っているのはボックスを増やしていこうと考えたためですが、どのように実装すれば目的の動作になるのか分からなかったため現時点では意味ありません。。
166
-
167
-
168
-
169
- **② ドラッグして移動可能なボックスを追加できるプログラム(可能ならば削除機能も)を教えて頂きたいです。**
170
-
171
-
172
20
 
173
21
  どうぞよろしくお願いいたしますm(_ _)m

2

不要な部分を削除しました

2018/12/30 00:29

投稿

masayasasaki96
masayasasaki96

スコア19

test CHANGED
File without changes
test CHANGED
@@ -166,7 +166,7 @@
166
166
 
167
167
 
168
168
 
169
- **② 追加ボタンでドラッグして移動可能なボックスを追加できるプログラム(可能ならば削除機能も)を教えて頂きたいです。**
169
+ **② ドラッグして移動可能なボックスを追加できるプログラム(可能ならば削除機能も)を教えて頂きたいです。**
170
170
 
171
171
 
172
172
 

1

不要な部分を削除しました

2018/12/28 19:33

投稿

masayasasaki96
masayasasaki96

スコア19

test CHANGED
File without changes
test CHANGED
@@ -120,8 +120,6 @@
120
120
 
121
121
  y = msdwn_evnt.clientY - drg_and_drp[i].offsetTop;
122
122
 
123
- console.log("mouseDOWN");
124
-
125
123
  }, false);
126
124
 
127
125
 
@@ -129,8 +127,6 @@
129
127
  document.body.addEventListener("mouseup", (msup_evnt) => {
130
128
 
131
129
  drag_toggle = "off";
132
-
133
- console.log("mouseUP");
134
130
 
135
131
  }, false);
136
132