回答編集履歴

4

追記

2021/07/15 04:50

投稿

Jon_do
Jon_do

スコア1373

test CHANGED
@@ -190,7 +190,7 @@
190
190
 
191
191
  const onMouseMove = (e) =>{
192
192
 
193
- if(e.pageY < 0|| e.pageX < 0 || e.pageX > window.innerWidth){
193
+ if(e.pageY < 0 || e.pageY > window.innerHeight || e.pageX < 0 || e.pageX > window.innerWidth){
194
194
 
195
195
  document.removeEventListener("mousemove", onMouseMove);
196
196
 

3

追記

2021/07/15 04:50

投稿

Jon_do
Jon_do

スコア1373

test CHANGED
@@ -190,6 +190,12 @@
190
190
 
191
191
  const onMouseMove = (e) =>{
192
192
 
193
+ if(e.pageY < 0|| e.pageX < 0 || e.pageX > window.innerWidth){
194
+
195
+ document.removeEventListener("mousemove", onMouseMove);
196
+
197
+ };
198
+
193
199
  const modalWidth = modal.clientWidth;
194
200
 
195
201
  const modalHeight = modal.clientHeight;

2

追記

2021/07/15 04:46

投稿

Jon_do
Jon_do

スコア1373

test CHANGED
File without changes

1

追記

2021/07/15 04:46

投稿

Jon_do
Jon_do

スコア1373

test CHANGED
@@ -7,3 +7,245 @@
7
7
  Javascript ドラッグ&ドラッグで検索したら実装方法が出てきます。
8
8
 
9
9
  専用のライブラリもあるのでそれを使っても良いと思います。
10
+
11
+
12
+
13
+ 追記:実装例
14
+
15
+ ```
16
+
17
+ <!DOCTYPE html>
18
+
19
+ <html lang="ja">
20
+
21
+
22
+
23
+ <head>
24
+
25
+ <meta charset="UTF-8">
26
+
27
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
28
+
29
+ <title>Document</title>
30
+
31
+ <style>
32
+
33
+
34
+
35
+ body {
36
+
37
+ width: 100%;
38
+
39
+ height: 100vh;
40
+
41
+ margin: 0;
42
+
43
+ }
44
+
45
+
46
+
47
+ .modal {
48
+
49
+ display:none;
50
+
51
+ width:500px;
52
+
53
+ height:400px;
54
+
55
+ border:solid 1px black;
56
+
57
+ position: absolute;
58
+
59
+ z-index: 1;
60
+
61
+ background-color:white;
62
+
63
+ top: calc(50% - 200px);
64
+
65
+ left: calc(50% - 250px);
66
+
67
+ }
68
+
69
+
70
+
71
+ .modalWrap {
72
+
73
+ width:100%;
74
+
75
+ position: relative;
76
+
77
+ overflow: hidden;
78
+
79
+ top:0;
80
+
81
+ left:0;
82
+
83
+ }
84
+
85
+
86
+
87
+ .open {
88
+
89
+ z-index: 0;
90
+
91
+ }
92
+
93
+
94
+
95
+ .close {
96
+
97
+ float: right;
98
+
99
+ }
100
+
101
+
102
+
103
+ </style>
104
+
105
+ </head>
106
+
107
+
108
+
109
+ <body>
110
+
111
+ <div class="modalWrap">
112
+
113
+ <button class="open">open</button>
114
+
115
+ <div class="modal">
116
+
117
+ <button class="close">close</button>
118
+
119
+ </div>
120
+
121
+ </div>
122
+
123
+ <script>
124
+
125
+ const open = document.getElementsByClassName("open")[0];
126
+
127
+ const close = document.getElementsByClassName("close")[0];
128
+
129
+ const modal = document.getElementsByClassName("modal")[0];
130
+
131
+ const modalWrap = document.getElementsByClassName("modalWrap")[0];
132
+
133
+
134
+
135
+ modalWrap.style.height = window.innerHeight + "px";
136
+
137
+
138
+
139
+ open.addEventListener("click", () => {
140
+
141
+ modal.style.display = "block";
142
+
143
+ });
144
+
145
+
146
+
147
+ close.addEventListener("click", () => {
148
+
149
+ modal.style.display = "";
150
+
151
+ });
152
+
153
+
154
+
155
+ let mX;
156
+
157
+ let mY;
158
+
159
+ let dX;
160
+
161
+ let dY;
162
+
163
+
164
+
165
+ modal.onmousedown = (e) => {
166
+
167
+ // クリック時のマウスカーソルX座標
168
+
169
+ mX = e.pageX;
170
+
171
+ // クリック時のマウスカーソルY座標
172
+
173
+ mY = e.pageY;
174
+
175
+ // クリック時の要素のX位置
176
+
177
+ dX = window.pageXOffset + modal.getBoundingClientRect().left
178
+
179
+ // クリック時の要素のY座標
180
+
181
+ dY = window.pageYOffset + modal.getBoundingClientRect().top
182
+
183
+ document.addEventListener("mousemove", onMouseMove);
184
+
185
+ }
186
+
187
+
188
+
189
+
190
+
191
+ const onMouseMove = (e) =>{
192
+
193
+ const modalWidth = modal.clientWidth;
194
+
195
+ const modalHeight = modal.clientHeight;
196
+
197
+ const shiftX = -(mX - e.pageX);
198
+
199
+ const shiftY = -(mY - e.pageY);
200
+
201
+ if(dX + shiftX < 0){
202
+
203
+ modal.style.left = "0px";
204
+
205
+ } else if (dX + shiftX + modalWidth > window.innerWidth) {
206
+
207
+ modal.style.left = window.innerWidth - modalWidth + "px";
208
+
209
+ } else {
210
+
211
+ modal.style.left = dX + shiftX + "px";
212
+
213
+ }
214
+
215
+ if(dY + shiftY < 0){
216
+
217
+ modal.style.top = "0px";
218
+
219
+ } else if(dY + shiftY + modalHeight > window.innerHeight){
220
+
221
+ modal.style.top = window.innerHeight - modalHeight + "px";
222
+
223
+ } else {
224
+
225
+ modal.style.top = dY + shiftY + "px";
226
+
227
+ }
228
+
229
+ }
230
+
231
+
232
+
233
+ modal.onmouseup = () => {
234
+
235
+ document.removeEventListener("mousemove", onMouseMove);
236
+
237
+ }
238
+
239
+
240
+
241
+ </script>
242
+
243
+ </body>
244
+
245
+
246
+
247
+ </html>
248
+
249
+
250
+
251
+ ```