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

回答編集履歴

2

コードコメント修正

2019/04/05 12:42

投稿

liveasnotes
liveasnotes

スコア1284

answer CHANGED
@@ -103,7 +103,7 @@
103
103
  // https://spyweb.media/2018/01/10/css-media-queries-in-js-matchmedia/
104
104
 
105
105
  // cssはPCファーストで書いてたけど,
106
- // jsはSPファーストで書いてるので,'MAX-width: 768.0001px'にしている
106
+ // jsはSPファーストで書いてるので,MAX-width: 768px」ではなく,「MIN-width: 768.0001px
107
107
  const mediaQuery = matchMedia('(min-width: 768.0001px)');
108
108
 
109
109
  function handle(mq) {

1

コードの追記

2019/04/05 12:42

投稿

liveasnotes
liveasnotes

スコア1284

answer CHANGED
@@ -5,6 +5,121 @@
5
5
  [https://jsfiddle.net/liveasnotes/w3p08qym/](https://jsfiddle.net/liveasnotes/w3p08qym/)
6
6
  ![jsFiddleのgif](22eea58423ce45e574dec52006160116.gif)
7
7
 
8
+ ```html
9
+ <input type="checkbox" id="menu_tgl">
10
+ <label for="menu_tgl" data-ui>menu</label>
11
+ <header>
12
+ <nav>
13
+ <ul id="menu_list">
14
+ <li><a href="#">AAA</a></li>
15
+ <li><a href="#">BBB</a></li>
16
+ <li><a href="#">CCC</a></li>
17
+ </ul>
18
+ </nav>
19
+ </header>
20
+ ```
21
+
22
+ ```css
23
+ *,*::before,*::after {
24
+ padding: 0;
25
+ margin: 0;
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ [data-ui] {
30
+ -webkit-user-select: none;
31
+ -moz-user-select: none;
32
+ -ms-user-select: none;
33
+ user-select: none;
34
+ }
35
+
36
+ #menu_tgl,
37
+ [for="menu_tgl"] {/* toggle */
38
+ position: fixed;
39
+ top: 0;
40
+ right: 0;
41
+ z-index: 0; /* @SP, for make UNtouchable */
42
+ display: none;
43
+ width: 50px;
44
+ height: 50px;
45
+ background: palegreen;
46
+ opacity: 0.5;
47
+ }
48
+
49
+ #menu_list {
50
+ display: flex;
51
+ list-style: none;
52
+ text-align: center;
53
+ background: palegreen;
54
+ transition: 0s;
55
+ }
56
+
57
+ #menu_list > li {
58
+ border: 1px solid gray;
59
+ padding: 1em;
60
+ margin: 1em;
61
+ }
62
+
63
+ /* at transition PC -> SP, to prevent show animation of menu, wrapper of menu need to change own position with no transition time */
64
+ nav {
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ }
70
+
71
+ nav a {
72
+ display: block;
73
+ }
74
+
75
+ /* @SP */
76
+ @media screen and (max-width: 768px) {
77
+ #menu_tgl,
78
+ [for="menu_tgl"] {
79
+ display: block;
80
+ z-index: 100; /* @SP, for make touchable */
81
+ }
82
+
83
+ nav {
84
+ top: auto;
85
+ bottom: 100%;
86
+ }
87
+
88
+ #menu_list {
89
+ flex-direction: column;
90
+ opacity: 0;
91
+ transition: 0.5s;
92
+ }
93
+
94
+ #menu_tgl:checked ~ header #menu_list {
95
+ transform: translateY(100%);
96
+ opacity: 1;
97
+ }
98
+ }
99
+ ```
100
+
101
+ ```js
102
+ // cf. .matchMedia()でJSでもメディアクエリを使って条件分岐する | SPYWEB
103
+ // https://spyweb.media/2018/01/10/css-media-queries-in-js-matchmedia/
104
+
105
+ // cssはPCファーストで書いてたけど,
106
+ // jsはSPファーストで書いてるので,'MAX-width: 768.0001px'にしている
107
+ const mediaQuery = matchMedia('(min-width: 768.0001px)');
108
+
109
+ function handle(mq) {
110
+ if (mq.matches) {
111
+ document.getElementById("menu_tgl").checked = false;
112
+ }
113
+ }
114
+
115
+ // ページが読み込まれた時に実行
116
+ handle(mediaQuery);
117
+
118
+ // ウィンドウサイズが変更されても実行されるように
119
+ mediaQuery.addListener(handle);
120
+
121
+ ```
122
+
8
123
  そのほか,ひとこと(複数):
9
124
 
10
125
  - css:同じプロパティはまとめて書いた方が良い,スタイルがぶつかっているところが見つかる.