回答編集履歴

6

より伝わりやすいニュアンスの文言に変更

2016/03/23 13:48

投稿

flat
flat

スコア617

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  針が文字盤の外に出ると、**何を指しているのか分からなくなる事で機能を失い、その結果「時間を指し示す針」という構造的な意味も失われます**。
28
28
 
29
- このように考えると「**Elementはどこにあるべきか**」をイメージしやすくなるのではないでしょうか。
29
+ このように考えると「**何をElementとするべきか**」をイメージしやすくなるのではないでしょうか。
30
30
 
31
31
 
32
32
 

5

クラスを修正

2016/03/23 13:47

投稿

flat
flat

スコア617

test CHANGED
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
 
47
- ! **以前の回答で適切ではなかった箇所に修正を加えています**
47
+ ! **修正**
48
48
 
49
- 空の`span`は「ハンバーガーというタイプのアイコンの要素」なので、`.icon__hamburger_border_top`ではく`.icon_type_hamburger__border_top`に修正しました
49
+ 無駄BlockModifierが増えいようにElementのModifierで対応する形に修正しました
50
50
 
51
51
  ```HTML
52
52
 
@@ -54,17 +54,13 @@
54
54
 
55
55
  <div class="button button_type_modal">
56
56
 
57
- <a class="icon icon_type_hamburger animation-hover action-hover">
57
+ <a class="icon animation-hover action-hover">
58
58
 
59
- <span class="icon_type_hamburger__border_top"></span>
59
+ <span class="icon__shape icon__shape_type_hamburger-top"></span>
60
60
 
61
- <span class="icon_type_hamburger__border_middle"></span>
61
+ <span class="icon__shape icon__shape_type_hamburger-middle"></span>
62
62
 
63
- <span class="icon_type_hamburger__border_bottom"></span>
63
+ <span class="icon__shape icon__shape_type_hamburger-bottom"></span>Menu</a>
64
-
65
- Menu
66
-
67
- </a>
68
64
 
69
65
  </div>
70
66
 
@@ -80,13 +76,13 @@
80
76
 
81
77
  .icon {} /* Block */
82
78
 
83
- .icon_type_hamburger {} /* Modifier */
79
+ .icon__shape {} /* Element */
84
80
 
85
- .icon_type_hamburger__border_top {} /* Element */
81
+ .icon__shape_type_hamburger-top {} /* Modifier */
86
82
 
87
- .icon_type_hamburger__border_middle {} /* Element */
83
+ .icon__shape_type_hamburger-middle {} /* Modifier */
88
84
 
89
- .icon_type_hamburger__border_bottom {} /* Element */
85
+ .icon__shape_type_hamburger-bottom {} /* Modifier */
90
86
 
91
87
 
92
88
 

4

内容を整理した改訂版

2016/03/22 17:22

投稿

flat
flat

スコア617

test CHANGED
@@ -1,10 +1,52 @@
1
1
  ###ひとつのBlock内にあるすべての要素を、そのElementとする必要はありません。
2
2
 
3
- 「`.modal-button-wrap`の内容はすべてそのElementでなければいけない」と考える必要はありません。
3
+ 「`.modal-button-wrap`**の内容はすべてそのElementでなければいけない**」と考える必要は**ありません**
4
4
 
5
- 「ボタンとアイコンは別々の要素だ」と考えましょう。
5
+ **ボタンとアイコンは別々の部品(コンポーネント)**」と考えましょう。
6
6
 
7
+
8
+
9
+ ###細かい粒度でルールセットを分割する
10
+
11
+ まずBlockについてです。
12
+
7
- また、`modal-button-wrap`というクラス名だとボタンとにまた別の名前のBlockを作らなければいけなくなるので、ボタンのタModifierにすると良いです。
13
+ 質問にある内容だと**ボタンとアイコンを分離しても個別機能す**事が分かるので、ボタンとアコン別のコンポーネントとし、それぞれルールセットを分割する事がきます。
14
+
15
+ このように、**細かい粒度でルールセットを分割する事を意識する**と、設計する時に迷う事が少なくなるでしょう。
16
+
17
+ また「**同じ構造が3回出てきたらコンポーネント化する**」などのルールを決めておけば、何をBlockにすべきか判断しやすくなります。
18
+
19
+
20
+
21
+
22
+
23
+ 次にElementについては、**一般的なアナログ時計のデザイン**をイメージすると分かりやすいと思います。
24
+
25
+ この場合、文字盤がBlockで、時針・分針・秒針などの針がElementです。
26
+
27
+ 針が文字盤の外に出ると、**何を指しているのか分からなくなる事で機能を失い、その結果「時間を指し示す針」という構造的な意味も失われます**。
28
+
29
+ このように考えると「**Elementはどこにあるべきか**」をイメージしやすくなるのではないでしょうか。
30
+
31
+
32
+
33
+ なお、Blockは「Elementも含めたひとつの塊」でもあるので、針で時間を示す時計からわざわざ針を外す必要がないのと同じように、Elementが欠けても機能しなければならないと考える必要はありません。
34
+
35
+ Elementが欠けても機能するのであればそれに越したことはないですが、Elementが欠けて機能しなくなるのであれば、それはCSSのルールセットが問題なのではなく、HTMLのマークアップが適切ではないという事です。
36
+
37
+
38
+
39
+
40
+
41
+ これらを踏まえた上で、質問にあるHTMLのクラスを変更すると次のようになります。
42
+
43
+ ちなみに、質問にあるHTMLと比較しやすいように、複数の空の`span`でアイコンを構成するなどのマークアップについてはあえて手を加えていません。
44
+
45
+
46
+
47
+ ! **以前の回答で適切ではなかった箇所に修正を加えています**
48
+
49
+ 空の`span`は「ハンバーガーというタイプのアイコンの要素」なので、`.icon__hamburger_border_top`ではなく`.icon_type_hamburger__border_top`に修正しました
8
50
 
9
51
  ```HTML
10
52
 
@@ -12,13 +54,15 @@
12
54
 
13
55
  <div class="button button_type_modal">
14
56
 
15
- <a class="icon animation-hover action-hover">
57
+ <a class="icon icon_type_hamburger animation-hover action-hover">
16
58
 
17
- <span class="icon__hamburger_border_top"></span>
59
+ <span class="icon_type_hamburger__border_top"></span>
18
60
 
19
- <span class="icon__hamburger_border_middle"></span>
61
+ <span class="icon_type_hamburger__border_middle"></span>
20
62
 
21
- <span class="icon__hamburger_border_bottom"></span>
63
+ <span class="icon_type_hamburger__border_bottom"></span>
64
+
65
+ Menu
22
66
 
23
67
  </a>
24
68
 
@@ -26,218 +70,28 @@
26
70
 
27
71
  ```
28
72
 
29
- アイコンを擬似要素で作るともう少しシンプルに。
73
+ ```CSS
30
74
 
31
- 擬似要素でハンバーガーアイコンを作る方法は「css ハンバーガー アイコン 擬似要素」などで検索するとすぐ見つかります。
75
+ .button {} /* Block */
32
76
 
33
- ```HTML
34
-
35
- <!-- Drawermenu Button -->
36
-
37
- <button class="button button_type_modal animation-hover action-hover" type="button">
38
-
39
- <span class="icon icon_type_hamburger">Menu</span>
77
+ .button_type_modal {} /* Modifier */
40
-
41
- </button>
42
-
43
- ```
44
-
45
- アイコンをSVGなどの画像で表示するようにすると`span`なども不要。
46
-
47
- ```HTML
48
-
49
- <!-- Drawermenu Button -->
50
-
51
- <button class="button button_type_modal icon icon_type_hamburger animation-hover action-hover" type="button">Menu</button>
52
-
53
- ```
54
-
55
- Menuというテキストを表示したくない場合には`overflow: hidden;`と`text-indent: -999em;`または`line-height: 999em;`などで隠すようにしてください。
56
-
57
- とりあえず「このマークアップにBEMを当てはめよう」とか「BEMっぽくマークアップしよう」と考えずに、まずは基本的なHTMLでのマークアップを意識するのが良いと思います。
58
78
 
59
79
 
60
80
 
61
- ちなみに、tkandaさんは「英語のドキュメントだけど、イラストによる簡潔な図解があるから英語が読めなくても分かりやすいですよ」と仰っているのだと思います。
81
+ .icon {} /* Block */
62
82
 
63
- また、ブラウザでGoogle Chromeを利用していれば、ページの翻訳機能を利用して(やや不可解な訳になる事も多々ありますが)ある程度の内容を読み取る事も出来るので利用してみては如何でしょうか。
83
+ .icon_type_hamburger {} /* Modifier */
64
84
 
65
- 質問自体は既に解決済みのようですが、補足として参考になれば幸いです。
85
+ .icon_type_hamburger__border_top {} /* Element */
86
+
87
+ .icon_type_hamburger__border_middle {} /* Element */
88
+
89
+ .icon_type_hamburger__border_bottom {} /* Element */
66
90
 
67
91
 
68
92
 
69
- 追加補足
93
+ .animation-hover {} /* Block */
70
94
 
71
- > ラッパーやコンテイナーなどの大枠がある場合、中身も大枠もブロックなのか、
72
-
73
- > 大枠だけブロックで、中身はエレメントなのか悩みます。
74
-
75
- > どのように区別していますか?
76
-
77
-
78
-
79
- wrapperやcontainerの内容を外に出したとして、それがデザインも含めて単独で機能するものであれば、それはElementではなくBlockであると考えて良いと思います。
80
-
81
-
82
-
83
-
84
-
85
- コメントに対する追記
86
-
87
- 例えば次のようなスタイルにしておく事で、仮にハンバーガーの要素が消えても`.icon`というBlockは機能します。なお、これは即席で作ったものなので「これが正解なんだ」と思わずに「こういうアプローチもあるんだ」程度に見ておいて下さい。
88
-
89
- ```HTML
90
-
91
- <!DOCTYPE html>
92
-
93
- <html lang="ja">
94
-
95
- <head>
96
-
97
- <meta charset="utf-8">
98
-
99
- <title>Hamburger Icon</title>
100
-
101
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
102
-
103
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
104
-
105
- <style type="text/css">
106
-
107
- html {
108
-
109
- font-size: 62.5%;
110
-
111
- }
112
-
113
-
114
-
115
- p {
116
-
117
- font-size: 1.6rem;
118
-
119
- }
120
-
121
-
122
-
123
- .icon {
124
-
125
- display: inline-block;
126
-
127
- overflow: hidden;
128
-
129
- position: relative;
130
-
131
- width: 4.8rem;
132
-
133
- height: 4.8rem;
134
-
135
- border-radius: 999rem;
136
-
137
- background-color: #8d5;
138
-
139
- line-height: 4.8rem;
140
-
141
- text-align: center;
142
-
143
- }
144
-
145
-
146
-
147
- /* hamburger icon */
95
+ .action-hover {} /* Block */
148
-
149
- .icon__hamburger_border_top,
150
-
151
- .icon__hamburger_border_top:before,
152
-
153
- .icon__hamburger_border_middle,
154
-
155
- .icon__hamburger_border_bottom {
156
-
157
- display: inline-block;
158
-
159
- position: absolute;
160
-
161
- top: 0;
162
-
163
- right: 0;
164
-
165
- bottom: 0;
166
-
167
- left: 0;
168
-
169
- margin: auto;
170
-
171
- width: 2rem;
172
-
173
- height: .4rem;
174
-
175
- background-color: #333;
176
-
177
- }
178
-
179
-
180
-
181
- .icon__hamburger_border_top:before {
182
-
183
- bottom: 1.6rem;
184
-
185
- content: '';
186
-
187
- }
188
-
189
-
190
-
191
- .icon__hamburger_border_top {
192
-
193
- width: auto;
194
-
195
- height: auto;
196
-
197
- background-color: #8d5;
198
-
199
- }
200
-
201
-
202
-
203
- .icon__hamburger_border_bottom {
204
-
205
- top: 1.6rem;
206
-
207
- }
208
-
209
- </style>
210
-
211
- </head>
212
-
213
- <body>
214
-
215
-
216
-
217
- <p>ハンバーガーアイコンあり</p>
218
-
219
- <a class="icon animation-hover action-hover">
220
-
221
- <span class="icon__hamburger_border_top"></span>
222
-
223
- <span class="icon__hamburger_border_middle"></span>
224
-
225
- <span class="icon__hamburger_border_bottom"></span>
226
-
227
- Menu
228
-
229
- </a>
230
-
231
-
232
-
233
- <p>ハンバーガーアイコンなし</p>
234
-
235
- <a class="icon animation-hover action-hover">Menu</a>
236
-
237
-
238
-
239
- </body>
240
-
241
- </html>
242
96
 
243
97
  ```

3

CSS部分の修正

2016/03/22 16:14

投稿

flat
flat

スコア617

test CHANGED
@@ -148,6 +148,8 @@
148
148
 
149
149
  .icon__hamburger_border_top,
150
150
 
151
+ .icon__hamburger_border_top:before,
152
+
151
153
  .icon__hamburger_border_middle,
152
154
 
153
155
  .icon__hamburger_border_bottom {
@@ -178,26 +180,8 @@
178
180
 
179
181
  .icon__hamburger_border_top:before {
180
182
 
181
- display: inline-block;
182
-
183
- position: absolute;
184
-
185
- top: 0;
186
-
187
- right: 0;
188
-
189
183
  bottom: 1.6rem;
190
184
 
191
- left: 0;
192
-
193
- margin: auto;
194
-
195
- width: 2rem;
196
-
197
- height: .4rem;
198
-
199
- background-color: #333;
200
-
201
185
  content: '';
202
186
 
203
187
  }

2

コメントに対する追記

2016/03/20 12:40

投稿

flat
flat

スコア617

test CHANGED
@@ -77,3 +77,183 @@
77
77
 
78
78
 
79
79
  wrapperやcontainerの内容を外に出したとして、それがデザインも含めて単独で機能するものであれば、それはElementではなくBlockであると考えて良いと思います。
80
+
81
+
82
+
83
+
84
+
85
+ コメントに対する追記
86
+
87
+ 例えば次のようなスタイルにしておく事で、仮にハンバーガーの要素が消えても`.icon`というBlockは機能します。なお、これは即席で作ったものなので「これが正解なんだ」と思わずに「こういうアプローチもあるんだ」程度に見ておいて下さい。
88
+
89
+ ```HTML
90
+
91
+ <!DOCTYPE html>
92
+
93
+ <html lang="ja">
94
+
95
+ <head>
96
+
97
+ <meta charset="utf-8">
98
+
99
+ <title>Hamburger Icon</title>
100
+
101
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
102
+
103
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
104
+
105
+ <style type="text/css">
106
+
107
+ html {
108
+
109
+ font-size: 62.5%;
110
+
111
+ }
112
+
113
+
114
+
115
+ p {
116
+
117
+ font-size: 1.6rem;
118
+
119
+ }
120
+
121
+
122
+
123
+ .icon {
124
+
125
+ display: inline-block;
126
+
127
+ overflow: hidden;
128
+
129
+ position: relative;
130
+
131
+ width: 4.8rem;
132
+
133
+ height: 4.8rem;
134
+
135
+ border-radius: 999rem;
136
+
137
+ background-color: #8d5;
138
+
139
+ line-height: 4.8rem;
140
+
141
+ text-align: center;
142
+
143
+ }
144
+
145
+
146
+
147
+ /* hamburger icon */
148
+
149
+ .icon__hamburger_border_top,
150
+
151
+ .icon__hamburger_border_middle,
152
+
153
+ .icon__hamburger_border_bottom {
154
+
155
+ display: inline-block;
156
+
157
+ position: absolute;
158
+
159
+ top: 0;
160
+
161
+ right: 0;
162
+
163
+ bottom: 0;
164
+
165
+ left: 0;
166
+
167
+ margin: auto;
168
+
169
+ width: 2rem;
170
+
171
+ height: .4rem;
172
+
173
+ background-color: #333;
174
+
175
+ }
176
+
177
+
178
+
179
+ .icon__hamburger_border_top:before {
180
+
181
+ display: inline-block;
182
+
183
+ position: absolute;
184
+
185
+ top: 0;
186
+
187
+ right: 0;
188
+
189
+ bottom: 1.6rem;
190
+
191
+ left: 0;
192
+
193
+ margin: auto;
194
+
195
+ width: 2rem;
196
+
197
+ height: .4rem;
198
+
199
+ background-color: #333;
200
+
201
+ content: '';
202
+
203
+ }
204
+
205
+
206
+
207
+ .icon__hamburger_border_top {
208
+
209
+ width: auto;
210
+
211
+ height: auto;
212
+
213
+ background-color: #8d5;
214
+
215
+ }
216
+
217
+
218
+
219
+ .icon__hamburger_border_bottom {
220
+
221
+ top: 1.6rem;
222
+
223
+ }
224
+
225
+ </style>
226
+
227
+ </head>
228
+
229
+ <body>
230
+
231
+
232
+
233
+ <p>ハンバーガーアイコンあり</p>
234
+
235
+ <a class="icon animation-hover action-hover">
236
+
237
+ <span class="icon__hamburger_border_top"></span>
238
+
239
+ <span class="icon__hamburger_border_middle"></span>
240
+
241
+ <span class="icon__hamburger_border_bottom"></span>
242
+
243
+ Menu
244
+
245
+ </a>
246
+
247
+
248
+
249
+ <p>ハンバーガーアイコンなし</p>
250
+
251
+ <a class="icon animation-hover action-hover">Menu</a>
252
+
253
+
254
+
255
+ </body>
256
+
257
+ </html>
258
+
259
+ ```

1

補足の追加

2016/03/20 12:37

投稿

flat
flat

スコア617

test CHANGED
@@ -63,3 +63,17 @@
63
63
  また、ブラウザでGoogle Chromeを利用していれば、ページの翻訳機能を利用して(やや不可解な訳になる事も多々ありますが)ある程度の内容を読み取る事も出来るので利用してみては如何でしょうか。
64
64
 
65
65
  質問自体は既に解決済みのようですが、補足として参考になれば幸いです。
66
+
67
+
68
+
69
+ 追加補足
70
+
71
+ > ラッパーやコンテイナーなどの大枠がある場合、中身も大枠もブロックなのか、
72
+
73
+ > 大枠だけブロックで、中身はエレメントなのか悩みます。
74
+
75
+ > どのように区別していますか?
76
+
77
+
78
+
79
+ wrapperやcontainerの内容を外に出したとして、それがデザインも含めて単独で機能するものであれば、それはElementではなくBlockであると考えて良いと思います。