aboutsummaryrefslogtreecommitdiff
path: root/files/ja/learn/forms/advanced_form_styling/index.html
blob: 472758fd618e0f4c7d10138a86256aa055f4e128 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
---
title: HTML フォームへの高度なスタイル設定
slug: Learn/Forms/Advanced_form_styling
tags:
  - Advanced
  - CSS
  - Forms
  - HTML
  - Web
  - ガイド
  - 例
translation_of: Learn/Forms/Advanced_form_styling
original_slug: Learn/Forms/Advanced_styling_for_HTML_forms
---
<div>{{LearnSidebar}}</div>

<div>{{PreviousMenuNext("Learn/Forms/Styling_web_forms", "Learn/Forms/UI_pseudo-classes", "Learn/Forms")}}</div>

<p class="summary">本記事では、スタイル設定が難しい一部の(不良なものと劣悪なもの)フォームコントロールで CSS を使用する方法を見ていきます。<a href="/ja/docs/HTML/Forms/Styling_HTML_forms" title="HTML/Forms/Styling_HTML_forms">前の記事</a>で見たように、テキストフィールドやボタンでの CSS 使用はまったく問題がありません。ここからは、HTML フォームへのスタイル設定の闇の部分を見ていきます。</p>

<table class="learn-box standard-table">
 <tbody>
  <tr>
   <th scope="row">前提条件:</th>
   <td>基本的なコンピューターリテラシーと、<a href="/ja/docs/Learn/HTML/Introduction_to_HTML">HTML</a><a href="/ja/docs/Learn/CSS/First_steps">CSS</a> の基本的な理解。</td>
  </tr>
  <tr>
   <th scope="row">目的:</th>
   <td>フォームのどの部分をスタイル設定するのが難しいのか、またなぜなのかを理解する。そこをカスタマイズするのに何ができるかを学ぶ。</td>
  </tr>
 </tbody>
</table>

<p>始める前に、2 種類の HTML フォームウィジェットについておさらいしましょう:</p>

<p><strong>不良</strong>: スタイルの設定が難しく複雑なトリックが必要であり、時に CSS3 の高度な知識が必要である要素:</p>

<ul>
 <li>チェックボックスとラジオボタン</li>
 <li><code><a href="/ja/docs/Web/HTML/Element/input/search">&lt;input type="search"&gt;</a></code></li>
</ul>

<p><strong>劣悪</strong>: いくつかの要素は CSS でスタイル設定できません。これらが含まれます:</p>

<ul>
 <li>ドロップダウンウィジェットを作成する要素、{{HTMLElement("select")}}, {{HTMLElement("option")}}, {{HTMLElement("optgroup")}}, {{HTMLElement("datalist")}}を含む</li>
 <li><code><a href="/ja/docs/Web/HTML/Element/input/color">&lt;input type="color"&gt;</a></code></li>
 <li><code><a href="/ja/docs/Web/HTML/Element/input/datetime-local">&lt;input type="datetime-local"&gt;</a></code>のような日付関連コントロール</li>
 <li><code><a href="/ja/docs/Web/HTML/Element/input/range">&lt;input type="range"&gt;</a></code></li>
 <li><code><a href="/ja/docs/Web/HTML/Element/input/file">&lt;input type="file"&gt;</a></code></li>
 <li>{{HTMLElement("progress")}} and {{HTMLElement("meter")}}</li>
</ul>

<h2 id="appearance_controlling_OS-level_styling" name="appearance_controlling_OS-level_styling">見た目: OS レベルのスタイル制御</h2>

<p>前の記事では歴史的に、ウェブフォームのスタイル設定は OS で行われており、それがこのコントロールの見た目のカスタマイズの問題の一部となっていました。</p>

<p>{{cssxref("appearance")}} プロパティは OS やシステムレベルでウェブフォームのスタイル設定を制御する方法として作成されました。不運なことに、そのプロパティの元々の実装の動作はブラウザー間で大きく異なっており、そんなに便利ではありませんでした。最近の実装ではもっと動作が一貫してきており、十分興味深く、それは Chromium-ベースのブラウザー (Chrome, Opera, Edge), Safari, Firefox のいずれも <code>-webkit-</code>  のプレフィックスつきバージョン (<code>-webkit-appearance</code>)をサポートしています。Firefox は、ウェブ開発者の大半が <code>-webkit-</code> プレフィックスバージョンをサポート使っていて互換性が良いため、このように決めました。</p>

<p>リファレンスページを見ると <code>-webkit-appearance</code> の多くの値がありますが、最も便利で、おそらく唯一使うのは <code>none</code> です。これはあらゆるコントロールがシステムレベルのスタイル設定するのをできるだけ防止して、CSS を用いた独自のスタイル設定をできるようにします。</p>

<p>例えば、次のコントロールを見てみます:</p>

<pre class="brush: html notranslate">&lt;form&gt;
  &lt;p&gt;
    &lt;label for="search"&gt;search: &lt;/label&gt;
    &lt;input id="search" name="search" type="search"&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;label for="text"&gt;text: &lt;/label&gt;
    &lt;input id="text" name="text" type="text"&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;label for="date"&gt;date: &lt;/label&gt;
    &lt;input id="date" name="date" type="datetime-local"&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;label for="radio"&gt;radio: &lt;/label&gt;
    &lt;input id="radio" name="radio" type="radio"&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;label for="checkbox"&gt;checkbox: &lt;/label&gt;
    &lt;input id="checkbox" name="checkbox" type="checkbox"&gt;
  &lt;/p&gt;
  &lt;p&gt;&lt;input type="submit" value="submit"&gt;&lt;/p&gt;
  &lt;p&gt;&lt;input type="button" value="button"&gt;&lt;/p&gt;
&lt;/form&gt;</pre>

<p>次の CSS を適用してシステムレベルのスタイル設定を削除します。</p>

<pre class="brush: css notranslate">input {
  -webkit-appearance: none;
  appearance: none;
}</pre>

<div class="blockIndicator note">
<p><strong></strong>: プレフィックスつきのプロパティを使っているときでも、両方の定義を常に入れておくのが良いです — プレフィックス付きとなしと。プレフィックスつきのものは通常は"作業中"を意味するため、将来のブラウザーベンダーはプレフィックスを落とすよう合意することもあるでしょう。上記のコードではそのような結末となった将来でも耐用できます。</p>
</div>

<p>下記の例ではあなたのシステムでどのように見えるかを示します — デフォルトでは左で、上記の CSS が適用されると右です (その他のシステムでテストしたい場合は<a href="https://mdn.github.io/learning-area/html/forms/styling-examples/appearence-tester.html">ここも探してください</a>)。</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/appearence-tester.html", '100%', 400)}}</p>

<p>たいていの場合、効果は枠線を除去し、CSS でのスタイル設定を少し簡単にしますが、それは本質できありません。いくつかの場合 — 検索やラジオボタン/チェックボックスでは、もっと便利です。これを見ていきましょう。</p>

<h3 id="Taming_search_boxes" name="Taming_search_boxes">検索ボックスを変更する</h3>

<p><code><a href="/ja/docs/Web/HTML/Element/input/search">&lt;input type="search"&gt;</a></code> は基本的に単なるテキスト入力のため、なぜ <code>appearance: none;</code> が便利なのでしょうか? 答えは macOS での Chromium ベースのブラウザーでは、検索ボックスはスタイル設定の制限があります — 例えば <code>height</code><code>font-size</code> を自在に調整できません。この理由は macOS以外の <a href="https://www.wired.com/2013/04/blink/">Chrome ブラウザーはもう WebKit レンダリングエンジンを使っていません</a> 、これは既定では、いくつかのフォームコントロールで Aqua の見た目が有効です。Aqua が有効だと、いくつかのフォームコントロールは <a href="https://webkit.org/blog/28/buttons/">scalable</a> となりません。</p>

<p>これは デフォルトの Aqua を無効にする <code>appearance: none;</code>で修正できます:</p>

<pre class="brush: css notranslate">input[type="search"] {
    -webkit-appearance: none;
    appearance: none;
}</pre>

<p>下記の例では、2 つのスタイル設定された検索ボックスが見えます。右のものは <code>appearance: none;</code> が適用され、左はそうでありません。macOS Chrome で見ると左のものは正しいサイズでないように見えます。</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/search-appearence.html", '100%', 200)}}</p>

<p>興味深いことに、検索フィールドで border/background をセットしてもこの問題を解決できます、なぜならそれも Aqua を<a href="https://webkit.org/blog/28/buttons/">無効化</a>や "破壊する" からです。下記のスタイル設定された検索ボックスは <code>appearance: none;</code> が適用されていませんが、前の例と同じ macOS Chrome の問題に悩まされていません。</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/styled-search.html", '100%', 200)}}</p>

<div class="blockIndicator note">
<p><strong></strong>: 検索フィールドでは、Edge と Chrome で入力がフォーカスされないときに "x" の削除アイコンが消えるが、Safari では残ることに気づくこともあるでしょう。CSS で消すには、<code>input[type="search"]::-webkit-search-cancel-button { display: none; }</code>を使用できますが、フォーカス時のアイコンも取り除き、見た目が元に戻らないようです。</p>
</div>

<h3 id="Check_boxes_and_radio_buttons" name="Check_boxes_and_radio_buttons">チェックボックスとラジオボタン</h3>

<p>チェックボックスやラジオボタンのスタイリングは難しい場合があります。たとえば、チェックボックスやラジオボタンのサイズはデフォルトのデザインの変更が意図されておらず、ブラウザーで試してみると非常に異なる反応を示します。</p>

<p id="A_simple_test_case">例えば、シンプルなテストケースを考えてみます:</p>

<pre class="brush: html notranslate">&lt;span&gt;&lt;input type="checkbox"&gt;&lt;/span&gt;</pre>

<pre class="brush: css notranslate">span {
    display: inline-block;
    background: red;
}

input[type=checkbox] {
    width : 100px;
    height: 100px;
}</pre>

<p>さまざまなブラウザーでの処理方法は以下のとおりです:</p>

<table>
 <thead>
  <tr>
   <th scope="col">ブラウザー</th>
   <th scope="col">描画結果</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>Firefox 71 (macOS)</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15671/firefox-mac-checkbox.png" style="height: 118px; width: 120px;"></td>
  </tr>
  <tr>
   <td>Firefox 57 (Windows 10)</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15691/firefox-windows-checkbox.png" style="height: 115px; width: 113px;"></td>
  </tr>
  <tr>
   <td>Chrome 77 (macOS), Safari 13, Opera</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15676/chrome-mac-checkbox.png" style="height: 117px; width: 116px;"></td>
  </tr>
  <tr>
   <td>Chrome 63 (Windows 10)</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15681/chrome-windows-checkbox.png" style="height: 117px; width: 120px;"></td>
  </tr>
  <tr>
   <td>Internet Explorer 11 (Windows 10)</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15696/ie11-checkbox.png" style="height: 112px; width: 119px;"></td>
  </tr>
  <tr>
   <td>Edge 16 (Windows 10)</td>
   <td><img alt="" src="https://mdn.mozillademos.org/files/15686/edge-checkbox.png" style="height: 118px; width: 119px;"></td>
  </tr>
 </tbody>
</table>

<h4 id="Using_appearance_none_on_radioscheckboxes" name="Using_appearance_none_on_radioscheckboxes">ラジオボタン/チェックボックスで appearance: none を使う</h4>

<p>これまで見てきたように、チェックボックスやラジオボタンのデフォルトの見た目を {{cssxref('appearance')}}<code>:none;</code> で削除できます。この HTML の例を見てみましょう:</p>

<pre class="brush: html notranslate">&lt;form&gt;
  &lt;fieldset&gt;
    &lt;legend&gt;Fruit preferences&lt;/legend&gt;

    &lt;p&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="fruit-1" value="cherry"&gt;
        I like cherry
      &lt;/label&gt;
    &lt;/p&gt;
    &lt;p&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="fruit-2" value="banana" disabled&gt;
        I can't like banana
      &lt;/label&gt;
    &lt;/p&gt;
    &lt;p&gt;
      &lt;label&gt;
        &lt;input type="checkbox" name="fruit-3" value="strawberry"&gt;
        I like strawberry
      &lt;/label&gt;
    &lt;/p&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</pre>

<p>さて、カスタムチェックボックスデザインでこれらのスタイルを設定しましょう。元のチェックボックスを解除することから始めましょう:</p>

<pre class="brush: css notranslate">input[type=checkbox] {
  -webkit-appearance: none;
  appearance: none;
}</pre>

<p>{{cssxref(":checked")}}{{cssxref(":disabled")}} 擬似クラスを使用して、状態の変化に合わせてカスタムチェックボックスの外観を変更します:</p>

<pre class="brush: css notranslate">input[type=checkbox] {
  position: relative;
  width: 1em;
  height: 1em;
  border: 1px solid gray;
  /* Adjusts the position of the checkboxes on the text baseline */
  vertical-align: -2px;
  /* Set here so that Windows' High-Contrast Mode can override */
  color: green;
}

input[type=checkbox]::before {
  content: "✔";
  position: absolute;
  font-size: 1.2em;
  right: 0;
  top: -0.3em;
  visibility: hidden;
}

input[type=checkbox]:checked::before {
  /* Use `visibility` instead of `display` to avoid recalculating layout */
  visibility: visible;
}

input[type=checkbox]:disabled {
  border-color: black;
  background: #ddd;
  color: gray;
}</pre>

<p>こうした疑似クラスなどは、<a href="/ja/docs/Learn/Forms/UI_pseudo-classes">次の記事</a>で見つけられますが、上記は次のことをしています:</p>

<ul>
 <li><code>:checked</code> — チェックボックス (やラジオボタン) がチェックされた状態にあります — ユーザーがクリック/有効化しています。</li>
 <li><code>:disabled</code> — チェックボックス (やラジオボタン) が無効な状態にあります — 操作することができますせん.</li>
</ul>

<p>実際の結果が表示されます。</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/checkboxes-styled.html", '100%', 200)}}</p>

<p>もっと理解できるよう別の例もあります:</p>

<ul>
 <li><a href="https://mdn.github.io/learning-area/html/forms/styling-examples/radios-styled.html">Styled radio buttons</a>: カスタムラジオボタンスタイル設定。</li>
 <li><a href="https://mdn.github.io/learning-area/html/forms/toggle-switch-example/">Toggle switch example</a>: トグルスイッチのようなチェックボックス。</li>
</ul>

<p>{{cssxref("appearance")}} や をサポートしていないブラウザーでこれらのチェックボックスを表示できます。カスタムデザインは失われますが、チェックボックスのままに見えて使用できます。</p>

<div class="blockIndicator note">
<p><strong>注記</strong>: Internet Explorer はどのバージョンの <code>appearance</code> もサポートしませんが、<code>input[type=checkbox]::-ms-check</code> にて IE のみチェックボックスをターゲットにできます。この手法は、<code>-ms-<em><strong>check</strong></em></code> という名前にもかかわらず、ラジオボタンでも機能します。</p>
</div>

<h2 id="劣悪な要素に何ができるか">"劣悪な"要素に何ができるか?</h2>

<p>今度は"劣悪な"コントロールに注目しましょう — これは完全にスタイル設定するのが本当に難しいものです。簡単にいうと、これはドロップダウンボックス、<code><a href="/ja/docs/Web/HTML/Element/input/color">color</a></code><code><a href="/ja/docs/Web/HTML/Element/input/datetime-local">datetime-local</a></code> のような複合コントロールタイプ、フィードバック —  {{HTMLElement("progress")}}{{HTMLElement("meter")}}のような指向性コントロールです。</p>

<p>問題は、要素はブラウザー同士でいろいろな既定の見た目があって、それにスタイル設定できても、内部のいくつかはスタイル設定できないことです。</p>

<p>ルック&フィールの違いを受け入れる覚悟があれば、サイズ変更を一貫したものにするためのシンプルなスタイル設定や、background-colors のような単一スタイル設定、システムレベルのスタイル設定を除去できる appearance の使用などで逃げることもできます。</p>

<p>例を見てみましょう、たくさんの"劣悪な" フォーム機能をつぎつぎに表示しています:</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/ugly-controls.html", '100%', 750)}}</p>

<p>この例では下記の CSS を適用しています:</p>

<pre class="brush: css notranslate">body {
  font-family: 'Josefin Sans', sans-serif;
  margin: 20px auto;
  max-width: 400px;
}

form &gt; div {
  margin-bottom: 20px;
}

select {
  -webkit-appearance: none;
  appearance: none;
}

.select-wrapper {
  position: relative;
}

.select-wrapper::after {
  content: "▼";
  font-size: 1rem;
  top: 6px;
  right: 10px;
  position: absolute;
}

button, label, input, select, progress, meter {
  display: block;
  font-family: inherit;
  font-size: 100%;
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  width: 100%;
  padding: 5px;
  height: 30px;
}

input[type="text"], input[type="datetime-local"], input[type="color"], select {
  box-shadow: inset 1px 1px 3px #ccc;
  border-radius: 5px;
}

label {
  margin-bottom: 5px;
}

button {
  width: 60%;
  margin: 0 auto;
}</pre>

<div class="blockIndicator note">
<p><strong>注記</strong>: 多数のブラウザーで同時にこの例をテストしたい場合、<a href="https://mdn.github.io/learning-area/html/forms/styling-examples/ugly-controls.html">live版をここで見つけてください</a> (<a href="https://github.com/mdn/learning-area/blob/master/html/forms/styling-examples/ugly-controls.html">ソースコードも見てください</a>)。</p>

<p>また JavaScript をページに追加してコントロール自身の下にあるファイルピッカー自身で選択されたファイルを一覧しているのを心に留めておいてください。これは <code><a href="/ja/docs/Web/HTML/Element/input/file#Examples">&lt;input type="file"&gt;</a></code> リファレンスページの例を簡単にしたバージョンです。</p>
</div>

<p>ご覧のとおり、これらをモダンブラウザー全体で均一に見せることはかなりうまくいっています。</p>

<p>すべてのコントロールとそのラベルに対してグローバルな CSS の正規化を適用し、サイズを同様にして、親のフォントを適用するなどを行っています。これは前の記事で述べたようなことです:</p>

<pre class="brush: css notranslate">button, label, input, select, progress, meter {
  display: block;
  font-family: inherit;
  font-size: 100%;
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  width: 100%;
  padding: 5px;
  height: 30px;
}</pre>

<p>コントロールに統一した影と角丸も与えて、意味のあるようにします:</p>

<pre class="brush: css notranslate">input[type="text"], input[type="datetime-local"], input[type="color"], select {
  box-shadow: inset 1px 1px 3px #ccc;
  border-radius: 5px;
}</pre>

<p>範囲や、プログレスバーや、メーターはコントロールエリアの周りに美しくないボックスができるだけなので、意味はありません。</p>

<p>これらのコントロールタイプそれぞれの仕様と、ハイライトの難しさをこれからお話ししましょう。</p>

<h3 id="Selects_and_datalists" name="Selects_and_datalists">Select とデータリスト</h3>

<p>モダンブラウザーでは、select とデータリストは一般的に、デフォルトからルック&フィールを大きく変えたくないようにスタイル設定する場合、悪くないものです。</p>

<p>これまで、ボックスの基本的な見た目をかなり均一で一貫性のあるものにしてきました。とにかくデータリストコントロールは <code>&lt;input type="text"&gt;</code> なので、問題にならないことがわかっています。</p>

<p>2 つのものが多少問題をはらんでいます。まず最初に、select がドロップダウンであることを示す "矢印" アイコンは、ブラウザーによって異なります。また select ボックスのサイズを増やしたり、変更したりすると、醜くなりがちです。これを修正するため、例では最初に旧友の <code>appearance: none</code> を使ってアイコンを除去しています:</p>

<pre class="brush: css notranslate">select {
  -webkit-appearance: none;
  appearance: none;
}</pre>

<p>次に生成されたコンテンツを使って独自のアイコンを作成します。コントロールの周りに特別なラッパーを置いていて、その理由は<code><a href="/ja/docs/Web/CSS/::before">::before</a></code>/<code><a href="/ja/docs/Web/CSS/::after">::after</a></code><code>&lt;select&gt;</code> 要素では動作しなしためです (これは生成されたコンテンツが要素がフォーマットするボックスに対し相対的に配置されますが、フォーム入力は置換された要素 — 表示がブラウザーによって生成されて順番に配置されるもの — として動作するので、1 つもないためです):</p>

<pre class="brush: html notranslate">&lt;div class="select-wrapper"&gt;&lt;select id="select" name="select"&gt;
  &lt;option&gt;Banana&lt;/option&gt;
  &lt;option&gt;Cherry&lt;/option&gt;
  &lt;option&gt;Lemon&lt;/option&gt;
&lt;/select&gt;&lt;/div&gt;</pre>

<p>次に生成されたコンテンツを使って小さな下向き矢印を作り、正しい場所にポジショニングします:</p>

<pre class="brush: css notranslate">.select-wrapper {
  position: relative;
}

.select-wrapper::after {
  content: "▼";
  font-size: 1rem;
  top: 6px;
  right: 10px;
  position: absolute;
}</pre>

<p>2 つ目のもう少し有名な問題は、<code>&lt;select&gt;</code> ボックスをクリックして開いたときに出てくる、オプションを含んだボックスを制御できないことです。オプションが親でセットされたフォントを継承していないのに気づくでしょう。また余白スペースや色のようなものも一貫してセットできません。例えば、Firefox では<code><a href="/ja/docs/Web/HTML/Element/option">&lt;option&gt;</a></code> 要素に <code><a href="/ja/docs/Web/CSS/color">color</a></code><code><a href="/ja/docs/Web/CSS/background-color">background-color</a></code> を適用できますが、Chrome ではそうなりません。どちらも余白スペース (例 <code><a href="/ja/docs/Web/CSS/padding">padding</a></code>)を適用できません。同じことはデータリスト用に出てくるオートコンプリートのリストにも当てはまります。</p>

<p>本当にオプションをスタイル設定する必要がある場合、カスタムコントロールを生成するライブラリを使用するか、独自のカスタムコントロールを作成するかのどちらかが必要で、あるいは <code>multiple</code>属性を使う select の場合、これはページ上に出てくるすべてのオプションを作成し、この特殊な問題を避けることができます:</p>

<pre class="brush: html notranslate">&lt;select id="select" name="select" multiple&gt;
  ...
&lt;/select&gt;</pre>

<p>もちろんこれでも進めているデザインにはフィットしないこともありますが、注目に値します!</p>

<h3 id="Date_input_types" name="Date_input_types">日付入力タイプ</h3>

<p>日付/時間の入力タイプ (<code><a href="/ja/docs/Web/HTML/Element/input/datetime-local">datetime-local</a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/time">time</a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/week">week</a></code>, <code><a href="/ja/docs/Web/HTML/Element/input/month">month</a></code>) にはすべて同じ重大な関連した問題があります。実際のボックスはテキスト入力と同じくスタイル設定が容易であり、デモ内で得たものの見た目は良いです。</p>

<p>しかし、コントロールの内部パーツ (例 日付をピックアップするのに使うポップアップカレンダー、値を増減するスピナー) はまったくスタイル設定できず、<code>appearance: none;</code>を使ってスタイルを除去できません。スタイル設定に完全なコントロールが必要な場合、カスタムコントロールを生成するライブラリを使うか、自分で作らねばなりません。</p>

<div class="blockIndicator note">
<p><strong></strong>: ここでも<code><a href="/ja/docs/Web/HTML/Element/input/number">&lt;input type="number"&gt;</a></code> は触れる価値があります — これにも値を増減するスピナーがあるので、同じ問題に悩まさされます。しかし、<code>number</code> タイプを使った場合にデータは簡単に集められて、単に <code>text</code> 入力を (あるいはモバイルブラウザーで数字キーパッドを表示するのに <code>tel</code> を) 代わりに使うのも簡単です</p>
</div>

<h3 id="Range_input_types" name="Range_input_types">Range 入力タイプ</h3>

<p><code><a href="/ja/docs/Web/HTML/Element/input/range">&lt;input type="range"&gt;</a></code> はスタイル設定が煩わしいです。下記のようなものを使ってデフォルトのスライダートラックを完全に削除してカスタムスタイル (ここでは、薄い赤のトラック)に置き換えます:</p>

<pre class="brush: css notranslate">input[type="range"] {
  appearance: none;
  -webkit-appearance: none;
  background: red;
  height: 2px;
  padding: 0;
  outline: 1px solid transparent;
}</pre>

<p>しかし、range コントロールのドラッグハンドルをカスタマイズするのはとても難しいです — range のスタイル設定を完全完全にコントロールするには、その中に複数の非標準な、ブラウザー固有の疑似要素も含んだ、複雑な CSS コードが必要です。<a href="https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/">Styling Cross-Browser Compatible Range Inputs with CSS</a> で必要なものを細かく書くための CSS トリックを確認します。</p>

<h3 id="Color_input_types" name="Color_input_types">Color 入力タイプ</h3>

<p>color 入力タイプはそこまでひどくないです。サポートされたブラウザーでは、単に小さな枠のある単色のブロックを提供します。</p>

<p>枠を削除して、色のブロックだけにするには、次のようにします:</p>

<pre class="brush: css notranslate">input[type="color"] {
  border: 0;
  padding: 0;
}</pre>

<p>しかし、カスタムソリューションは大きく異るようにする唯一の方法です。</p>

<h3 id="File_input_types" name="File_input_types">ファイル入力タイプ</h3>

<p>ファイル入力タイプは通常は OK です — 例で見てきたように、ページの残りの部分に問題なくフィットする何かを作るのはとても簡単です — コントロールの一部分でもある出力行は、入力にそう指示している場合は親のフォントを継承して、カスタムリストに名前やサイズをお好みでスタイル設定できます; 結局は作っています。</p>

<p>ファイルピッカーの唯一の問題は、ファイルピッカーを開くボタンは完全にスタイル設定できないことです— サイズや色設定は不可能で、別のフォントすら指定できません。</p>

<p>この回避法は、フォームコントロールに関連するラベルがある場合、ラベルをクリックするとコントロールがアクティブになるという事実を利用します。つまり実際のフォーム入力を次のように隠します:</p>

<pre class="brush: css notranslate">input[type="file"] {
  height: 0;
  padding: 0;
  opacity: 0;
}</pre>

<p>次にボタンのように動作するラベルをスタイル設定し、そのラベルが押された時にファイルピッカーが期待通り開くようにします:</p>

<pre class="brush: css notranslate">label[for="file"] {
  box-shadow: 1px 1px 3px #ccc;
  background: linear-gradient(to bottom, #eee, #ccc);
  border: 1px solid rgb(169, 169, 169);
  border-radius: 5px;
  text-align: center;
  line-height: 1.5;
}

label[for="file"]:hover {
  background: linear-gradient(to bottom, #fff, #ddd);
}

label[for="file"]:active {
  box-shadow: inset 1px 1px 3px #ccc;
}</pre>

<p>上記の CSS スタイル設定の結果は、下記のライブ実行の例で見ることができます (<a href="https://mdn.github.io/learning-area/html/forms/styling-examples/styled-file-picker.html">styled-file-picker.html</a> のライブと、<a href="/enhttps://github.com/mdn/learning-area/blob/master/html/forms/styling-examples/styled-file-picker.html-US/docs/">ソースコード</a>も見てください)。</p>

<p>{{EmbedGHLiveSample("learning-area/html/forms/styling-examples/styled-file-picker.html", '100%', 200)}}</p>

<h3 id="Meters_and_progress_bars" name="Meters_and_progress_bars">メーターとプログレスバー</h3>

<p><code><a href="/ja/docs/Web/HTML/Element/meter">&lt;meter&gt;</a></code><code><a href="/ja/docs/Web/HTML/Element/progress">&lt;progress&gt;</a></code> は多くの中で最悪かもしれません。前の例で見たように、希望する幅にだいたい正確に設定できました。しかしそれを超えると、どんな方法でもスタイル設定が本当に難しいです。高さの設定をお互いに、ブラウザー間で一貫して処理できず、背景は色付けできるものの、前面のバーはできず、<code>appearance: none</code> を設定すると良くならず、より悪くなります。</p>

<p>スタイル設定を制御したい場合は、この機能のカスタムソリューションを作ったり、<a href="http://kimmobrunfeldt.github.io/progressbar.js/#examples">progressbar.js</a> のようなサードパーティのソリューションを使うのは簡単です。</p>

<h2 id="The_road_to_nicer_forms_useful_libraries_and_polyfills" name="The_road_to_nicer_forms_useful_libraries_and_polyfills">よりよいフォームへの道: 役に立つライブラリとポリフィル</h2>

<p>すでにいくつか見てきたように、"劣悪な"コントロールを完全にコントロールしたい場合は、JavaScript に頼るしかありません。<a href="/ja/docs/Learn/HTML/Forms/How_to_build_custom_form_widgets">カスタムフォームウィジェットをビルドする方法</a>の記事では、独自のフォームウィジェットを作成する方法を見ていきますが、そこには役に立つ便利なライブラリがいくつかあります。</p>

<ul>
 <li><a href="http://sprawsm.com/uni-form/" rel="external">Uni-form</a> はフォームマークアップを標準化し、CSS でスタイリングするフレームワークです。jQuery で使用すると、いくつかの追加機能も提供されますが、これはオプションです</li>
 <li><a href="http://formalize.me/" rel="external">Formalize</a> は、フォームの正規化とカスタマイズを支援する共通の JavaScript フレームワーク (jQuery、Dojo、YUI など) の拡張です</li>
 <li><a href="http://www.emblematiq.com/lab/niceforms/" rel="external">Niceforms</a> はスタンドアロンの JavaScript メソッドで、ウェブフォームを完全にカスタマイズできます。あなたは、組み込みのテーマのいくつかを使用することも、独自のテーマを作成することもできます</li>
</ul>

<p>次のライブラリはフォームだけではありませんが、HTML フォームを処理するための非常に興味深い機能を備えています:</p>

<ul>
 <li><a href="http://jqueryui.com/" rel="external">jQuery UI</a> には日付ピッカーなどのカスタマイズ可能なウィジェットが用意されています (アクセシビリティに特に注意してください)</li>
 <li><a href="http://twitter.github.com/bootstrap/base-css.html#forms" rel="external">Twitter Bootstrap</a> はフォームを正規化するのに役立ちます</li>
 <li><a href="https://afarkas.github.io/webshim/demos/" rel="external">WebShim</a> は、ブラウザーの HTML5 サポートに対処するのに役立つ巨大なツールです。ウェブフォームの部分は本当に役に立ちます</li>
</ul>

<p>CSS と JavaScript には副作用があることに注意してください。したがって、それらのライブラリのいずれかを使用することを選択した場合は、スクリプトが失敗した場合に備えて、堅牢なフォールバック HTML を用意する必要があります。スクリプトが失敗する理由はたくさんあります。特にモバイル環境では、これらのケースを可能な限り最善に処理するようにウェブサイトやアプリケーションを設計する必要があります。</p>

<h2 id="スキルをテストしましょう!">スキルをテストしましょう!</h2>

<p>この記事の最後に到達しましたが、重要な情報を覚えていますか?次に進む前に、この情報を保持しているか検証するテストがあります — <a href="/ja/docs/Learn/Forms/Test_your_skills:_Advanced_styling">Test your skills: Advanced styling</a> を見てください。心に留めておくこととして、この評価シリーズでの質問は、<a href="/ja/docs/Learn/Forms/UI_pseudo-classes">次の記事</a>の知識も前提していてるので、試す前にその記事に取り組むとよいかもしれません。</p>

<h2 id="Summary" name="Summary">まとめ</h2>

<p>HTML フォームで CSS を使用するのはまだ困難ですが、しばしばそれらを回避する方法があります。クリーンでユニバーサルな解決方法はありませんが、最新のブラウザーでは新しい可能性があります。今のところ、最良の解決策は、HTML フォームウィジェットに適用されたときに異なるブラウザーが CSS をサポートする方法の詳細を学ぶことです。</p>

<p>このガイドの次の記事では、モダンブラウザーでさまざまな状態のフォームをスタイル設定できるさまざまな <a href="/ja/docs/Learn/Forms/UI_pseudo-classes">UI 疑似クラス</a>を見ていきます。</p>

<p>{{PreviousMenuNext("Learn/Forms/Styling_web_forms", "Learn/Forms/UI_pseudo-classes", "Learn/Forms")}} </p>

<h2 id="In_this_module" name="In_this_module">このモジュール</h2>

<ul>
 <li><a href="/ja/docs/Learn/HTML/Forms/Your_first_HTML_form">初めての HTML フォーム</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/How_to_structure_an_HTML_form">HTML フォームの構築方法</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/The_native_form_widgets">ネイティブフォームウィジェット</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data">フォームデータの送信</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/Data_form_validation">フォームデータの検証</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/How_to_build_custom_form_widgets">カスタムフォームウィジェットの作成方法</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript">JavaScript によるフォームの送信</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/HTML_forms_in_legacy_browsers">古いブラウザーでの HTML フォーム</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/Styling_HTML_forms">HTML フォームへのスタイル設定</a></li>
 <li><a href="/ja/docs/Learn/HTML/Forms/Advanced_styling_for_HTML_forms">HTML フォームへの高度なスタイル設定</a></li>
 <li><a href="/ja/docs/Property_compatibility_table_for_form_widgets">フォームウィジェット向けプロパティ実装状況一覧</a></li>
</ul>

<h3 id="Advanced_Topics" name="Advanced_Topics">Advanced Topics</h3>

<ul>
 <li><a href="/ja/docs/Learn/Forms/How_to_build_custom_form_controls">How to build custom form controls</a></li>
 <li><a href="/ja/docs/Learn/Forms/Sending_forms_through_JavaScript">Sending forms through JavaScript</a></li>
 <li><a href="/ja/docs/Learn/Forms/Property_compatibility_table_for_form_widgets">Property compatibility table for form widgets</a></li>
</ul>