回答編集履歴

1

追記

2017/07/05 09:19

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,97 @@
1
+ 以下のプロパティを追加することで裏に回ったコンテンツのスクロールを停止させることは出来ます。
2
+
3
+ ``` css
4
+
5
+ .open {
6
+
7
+ overflow-y: hidden;
8
+
9
+ }
10
+
11
+ ```
12
+
13
+
14
+
15
+ ただし、メニューを開いた際、コンテンツの位置が一番上に移動してしまいます。
16
+
17
+ メニューを開いた際、及び閉じた際にコンテンツのスクロール位置も保持・復元したい場合、
18
+
19
+ 以下のようにして、スクロール位置を保持・復元して上げる必要があります。
20
+
21
+ ``` javascript
22
+
23
+ var $body = $('body');
24
+
25
+ var originWindowPageYOffset = 0;
26
+
27
+
28
+
29
+ $('#js_btn').on('click', function () {
30
+
31
+ if ($body.hasClass('open')) {
32
+
33
+ $body
34
+
35
+ .removeClass('open')
36
+
37
+ .css({ marginTop: '' });
38
+
39
+ // メニューを開く前のスクロール位置に戻す
40
+
41
+ window.scrollTo(0, originWindowPageYOffset);
42
+
43
+ }
44
+
45
+ else {
46
+
47
+ // スクロール量取得
48
+
49
+ originWindowPageYOffset = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;
50
+
51
+
52
+
53
+ $body
54
+
55
+ .css({ marginTop: originWindowPageYOffset * -1 }) // ネガティブマージンでスクロールしたように見せかける
56
+
57
+ .addClass('open');
58
+
59
+ }
60
+
61
+
62
+
63
+ return false;
64
+
65
+ });
66
+
67
+
68
+
69
+ $('#js_nav').on('click', function () {
70
+
71
+ $body
72
+
73
+ .removeClass('open')
74
+
75
+ .css({ marginTop: '' });
76
+
77
+ // メニューを開く前のスクロール位置に戻す
78
+
79
+ window.scrollTo(0, originWindowPageYOffset);
80
+
81
+
82
+
83
+ return false;
84
+
85
+ });
86
+
87
+ ```
88
+
89
+
90
+
91
+ ---
92
+
93
+
94
+
1
95
  **「メニューにスクロールが必用なデザイン」**というのが、画面の高さよりモーダル内のコンテンツの高さの方があるためスクロール表示させたいと言うのであれば、```#js_nav```に```overflow-y: auto;```を追加すれば対応可能です。
2
96
 
3
97
  [https://jsfiddle.net/takmatz/s08r48xf/](https://jsfiddle.net/takmatz/s08r48xf/)