teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

追記

2021/07/15 04:50

投稿

Jon_do
Jon_do

スコア1373

answer CHANGED
@@ -94,7 +94,7 @@
94
94
 
95
95
 
96
96
  const onMouseMove = (e) =>{
97
- if(e.pageY < 0|| e.pageX < 0 || e.pageX > window.innerWidth){
97
+ if(e.pageY < 0 || e.pageY > window.innerHeight || e.pageX < 0 || e.pageX > window.innerWidth){
98
98
  document.removeEventListener("mousemove", onMouseMove);
99
99
  };
100
100
  const modalWidth = modal.clientWidth;

3

追記

2021/07/15 04:50

投稿

Jon_do
Jon_do

スコア1373

answer CHANGED
@@ -94,6 +94,9 @@
94
94
 
95
95
 
96
96
  const onMouseMove = (e) =>{
97
+ if(e.pageY < 0|| e.pageX < 0 || e.pageX > window.innerWidth){
98
+ document.removeEventListener("mousemove", onMouseMove);
99
+ };
97
100
  const modalWidth = modal.clientWidth;
98
101
  const modalHeight = modal.clientHeight;
99
102
  const shiftX = -(mX - e.pageX);

2

追記

2021/07/15 04:46

投稿

Jon_do
Jon_do

スコア1373

answer CHANGED
File without changes

1

追記

2021/07/15 04:46

投稿

Jon_do
Jon_do

スコア1373

answer CHANGED
@@ -2,4 +2,125 @@
2
2
  モーダルウィンドウを普通に実装して、ドラッグ&ドロップで動かせるようにしたら完成です。
3
3
 
4
4
  Javascript ドラッグ&ドラッグで検索したら実装方法が出てきます。
5
- 専用のライブラリもあるのでそれを使っても良いと思います。
5
+ 専用のライブラリもあるのでそれを使っても良いと思います。
6
+
7
+ 追記:実装例
8
+ ```
9
+ <!DOCTYPE html>
10
+ <html lang="ja">
11
+
12
+ <head>
13
+ <meta charset="UTF-8">
14
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
15
+ <title>Document</title>
16
+ <style>
17
+
18
+ body {
19
+ width: 100%;
20
+ height: 100vh;
21
+ margin: 0;
22
+ }
23
+
24
+ .modal {
25
+ display:none;
26
+ width:500px;
27
+ height:400px;
28
+ border:solid 1px black;
29
+ position: absolute;
30
+ z-index: 1;
31
+ background-color:white;
32
+ top: calc(50% - 200px);
33
+ left: calc(50% - 250px);
34
+ }
35
+
36
+ .modalWrap {
37
+ width:100%;
38
+ position: relative;
39
+ overflow: hidden;
40
+ top:0;
41
+ left:0;
42
+ }
43
+
44
+ .open {
45
+ z-index: 0;
46
+ }
47
+
48
+ .close {
49
+ float: right;
50
+ }
51
+
52
+ </style>
53
+ </head>
54
+
55
+ <body>
56
+ <div class="modalWrap">
57
+ <button class="open">open</button>
58
+ <div class="modal">
59
+ <button class="close">close</button>
60
+ </div>
61
+ </div>
62
+ <script>
63
+ const open = document.getElementsByClassName("open")[0];
64
+ const close = document.getElementsByClassName("close")[0];
65
+ const modal = document.getElementsByClassName("modal")[0];
66
+ const modalWrap = document.getElementsByClassName("modalWrap")[0];
67
+
68
+ modalWrap.style.height = window.innerHeight + "px";
69
+
70
+ open.addEventListener("click", () => {
71
+ modal.style.display = "block";
72
+ });
73
+
74
+ close.addEventListener("click", () => {
75
+ modal.style.display = "";
76
+ });
77
+
78
+ let mX;
79
+ let mY;
80
+ let dX;
81
+ let dY;
82
+
83
+ modal.onmousedown = (e) => {
84
+ // クリック時のマウスカーソルX座標
85
+ mX = e.pageX;
86
+ // クリック時のマウスカーソルY座標
87
+ mY = e.pageY;
88
+ // クリック時の要素のX位置
89
+ dX = window.pageXOffset + modal.getBoundingClientRect().left
90
+ // クリック時の要素のY座標
91
+ dY = window.pageYOffset + modal.getBoundingClientRect().top
92
+ document.addEventListener("mousemove", onMouseMove);
93
+ }
94
+
95
+
96
+ const onMouseMove = (e) =>{
97
+ const modalWidth = modal.clientWidth;
98
+ const modalHeight = modal.clientHeight;
99
+ const shiftX = -(mX - e.pageX);
100
+ const shiftY = -(mY - e.pageY);
101
+ if(dX + shiftX < 0){
102
+ modal.style.left = "0px";
103
+ } else if (dX + shiftX + modalWidth > window.innerWidth) {
104
+ modal.style.left = window.innerWidth - modalWidth + "px";
105
+ } else {
106
+ modal.style.left = dX + shiftX + "px";
107
+ }
108
+ if(dY + shiftY < 0){
109
+ modal.style.top = "0px";
110
+ } else if(dY + shiftY + modalHeight > window.innerHeight){
111
+ modal.style.top = window.innerHeight - modalHeight + "px";
112
+ } else {
113
+ modal.style.top = dY + shiftY + "px";
114
+ }
115
+ }
116
+
117
+ modal.onmouseup = () => {
118
+ document.removeEventListener("mousemove", onMouseMove);
119
+ }
120
+
121
+ </script>
122
+ </body>
123
+
124
+ </html>
125
+
126
+ ```