画像、メディア、フォーム要素

このレッスンでは、特定の要素が CSS でどのように扱われるかを見ていきます。画像・メディア・フォーム要素では、CSS でスタイルを設定するにあたって通常のボックスとは少し異なる動作をします。何が可能で何が不可能かを理解することで、フラストレーションを軽減することができます。このレッスンでは、知っておくべきことのをいくつかを取り上げます。

前提条件: 基本的なソフトウェアがインストールされていること、ファイルの扱い、HTML の基本(HTML 入門の学習)、CSS がどのように動作するかの考え(CSS の第一歩で学習)の基本的な知識を得ていること。
目的: CSS でスタイルを設定したときに一部の要素が異常に動作することを理解すること。

置換要素

画像とビデオは、**置換要素**呼ばれています。これは、 CSS がこれらの要素の内部レイアウトに影響を与えることはできず、他の要素の中でのページ上の位置のみに影響を与えることを意味します。ただし、後で説明するように、 CSS が画像に対して様々なことができます。

画像や動画などの特定の置換要素は、アスペクト比を持つものとしても記述されています。これは、水平方向 (x) と垂直方向 (y) の両方の寸法を持ち、既定ではファイルの内在サイズを使って表示されることを意味します。

画像サイズ

これらのレッスンを受けてすでにお分かりのように、CSS ではすべてのものがボックスを生成します。画像ファイルの固有の寸法よりも小さいか大きいサイズの画像をボックス内に配置すると、ボックスよりも小さく表示されるか、ボックスをオーバーフローさせてしまいます。オーバーフローで何が起こるかについて決定を下す必要があります。

以下の例では、2 つのボックスがあり、どちらもサイズは 200 ピクセルです。

  • 1 つは 200 ピクセル未満の画像を含んでいます。これはボックスよりも小さく、それを埋めるために引き伸ばしません。
  • もう 1 つは 200 ピクセルより大きく、ボックスをオーバーフローします。

では、オーバーフローの問題について何ができるでしょうか?

前のレッスンで学んだように、一般的な手法は、画像の max-width を 100%にすることです。これにより、画像のサイズはボックスよりも小さくなりますが、大きくはなりません。この手法は、<video><iframe> などの他の置換要素でも機能します。

上記の例 max-width: 100%<img> 要素に追加してみてください。小さい画像は変更されないままですが、大きい画像はボックスに収まるように小さくなります。

コンテナー内の画像について他の選択を行うことができます。例えば、ボックスを完全に覆うように画像のサイズを変更したい場合があります。

ここでは、 object-fit プロパティが役立ちます。置換要素に object-fit を使用する場合、さまざまな方法でボックスに合うようにサイズを変更できます。

次の例では、値 cover を使用して画像を縮小し、アスペクト比を維持してボックスをきれいに埋めます。アスペクト比が維持されているため、画像の一部がボックスで切り取られます。

contain を値として使用した場合、ボックス内に収まるまで画像が縮小されます。これは、ボックスと同じアスペクト比ではない場合、「レターボックス」になります。

fill を試すこともできます 。これは、ボックスを埋めますが、アスペクト比を維持しません。

レイアウト内の置換要素

置換要素にさまざまな CSS レイアウト手法を使用すると、他の要素とは動作が少し異なる場合があります。 たとえば、フレックスまたはグリッドレイアウトでは、要素は既定で領域全体に拡大されます。 画像は伸縮せず、代わりにグリッド領域またはフレックスコンテナーの始点に揃えられます。

下記の例では、 2 列 2 行のグリッドコンテナーがあり、その中に 4 つのアイテムがあります。すべての <div> 要素には背景色があり、行と列いっぱいに伸縮します。しかし、画像は伸縮しません。

これらのレッスンを順番に実行している場合は、まだレイアウトを確認していない可能性があります。置換要素は、グリッドまたはフレックスレイアウトの一部になると、基本的にレイアウトによって不自然に引き伸ばされないようにするために、既定の動作が異なることに注意してください。

画像を強制的に引き伸ばして、グリッドセルを埋めるには、次のような操作を行う必要があります。

css
img {
  width: 100%;
  height: 100%;
}

ただし、これは画像を引き伸ばすため、おそらく望んでいることではありません。

フォーム要素

CSS でのスタイル設定に関しては、フォーム要素はトリッキーな問題であり、HTML フォームモジュールには、フォーム要素のスタイル設定に関する詳細なガイドが含まれていますが、ここでは完全には再現しません。記事のこの節では、強調すべきいくつかの重要な点があります。

多くのフォームコントロールは <input> 要素によってページに追加されます。これは、テキスト入力などの単純なフォームフィールドから、色や日付の選択などのより複雑なフィールドまでを定義します。 <textarea> などの追加要素や、 <fieldset><legend> などのフォームの一部を格納したりラベルを貼ったりするために使われる要素もあります。

HTML には、ウェブ開発者が必須フィールド、さらには入力する必要があるコンテンツの種類を指定できるようにする属性も含まれています。ユーザーが予期しない何かを入力したり、必須フィールドを空白のままにしたりすると、ブラウザーにエラーメッセージが表示されることがあります。 ブラウザーによって、このようなアイテムのスタイル設定やカスタマイズがどの程度可能なのかについては一貫性がありません。

テキスト入力欄のスタイル

<input type="text"><input type="email"><textarea> 要素などのテキスト入力を可能にする要素は、スタイルを整えるのが非常に簡単で、ページ上の他のボックスと同じように振る舞う傾向があります。しかし、これらの要素の既定のスタイルは、ユーザーがサイトを訪問する際に使用するオペレーティングシステムやブラウザーによって異なります。

以下の例では、 CSS を使用していくつかのテキスト入力にスタイルを設定しています。境界線、マージン、パディングなどがすべて期待どおりに適用されていることがわかります。属性セレクターを使用して、さまざまな入力タイプをターゲットにしています。境界線を調整し、フィールドに背景色を追加し、フォントとパディングを変更して、このフォームの外観を変更してみてください。

警告: フォーム要素のスタイルを変更するときは、ユーザーがフォーム要素であることをユーザーに明確に伝えるように注意する必要があります。周囲のコンテンツとほとんど見分けがつかない境界線や背景のないフォーム入力を作成することもできますが、これにより認識や入力が非常に難しくなります。

ウェブフォームのスタイル設定に関するレッスンで説明したように、より複雑な入力タイプの多くはオペレーティングシステムによってレンダリングされ、スタイル設定にアクセスできません。そのため、フォームは訪問者によってかなり違って見えることを常に想定し、複雑なフォームをいくつかのブラウザーでテストする必要があります。

継承とフォーム要素

一部のブラウザーでは、フォーム要素は既定ではフォントのスタイルを継承しません。そのため、フォームのフィールドが body や親要素で定義されたフォントを使用するようにしたい場合は、CSS にこのルールを追加する必要があります。

css
button,
input,
select,
textarea {
  font-family: inherit;
  font-size: 100%;
}

フォーム要素と box-sizing

ブラウザー間で、フォーム要素は、さまざまなウィジェットに対してさまざまなボックスサイズ設定ルールを使用します。ボックスモデルのレッスンで box-sizing プロパティについて学習しました。フォームのスタイル設定時にこの知識を使用して、フォーム要素に幅と高さを設定するときに一貫したエクスペリエンスを確保できます。

一貫性を保つために、すべての要素でマージンとパディングに 0 を設定し、特定のコントロールをスタイル設定するときにこれらを追加することをお勧めします

css
button,
input,
select,
textarea {
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

その他の便利な設定

上記のルールに加えて、スクロールバーが不要な場合に IE がスクロールバーを表示しないよう overflow: auto<textarea>s を設定する必要があります。

css
textarea {
  overflow: auto;
}

リセット処理としてまとめる

最後のステップとして、上記で説明したさまざまなプロパティを次の「フォームリセット」にラップして、作業の一貫性のあるベースを提供できます。これには、最後の 3 つのセクションで言及したすべてのアイテムが含まれます。

css
button,
input,
select,
textarea {
  font-family: inherit;
  font-size: 100%;
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

textarea {
  overflow: auto;
}

メモ: 正規化スタイルシートは、すべてのプロジェクトで使用する一連のベースラインスタイルを作成するために、多くの開発者によって使用されています。通常、これらは上記で説明したものと同様のことを行います。 CSS で独自の作業を行う前に、ブラウザー間で異なるものがすべて一貫した既定に設定されていることを確認してください。ブラウザーは通常、以前より一貫性があるため、以前ほど重要ではありません。ただし、1 つの例を見てみたい場合は、 Normalize.css をチェックしてください。これは、多くのプロジェクトでベースとして使用されている非常に人気のあるスタイルシートです。

フォームのスタイル設定の詳細については、これらのガイドの HTML セクションにある 2 つの記事をご覧ください。

スキルテスト

この記事の終わりまで来ましたが、最も重要な情報を覚えていますか?次に進む前に、この情報を覚えているかどうかを確認するためのテストがいくつかあります。スキルテスト: 画像とフォーム要素を見てください。

まとめ

このレッスンでは、 CSS で画像、メディア、およびその他の異常な要素を操作するときに発生するいくつかの違いを強調しました。次の記事では、 HTML テーブルをスタイルする必要がある場合に役立ついくつかのヒントについて説明します。

次の記事では、 HTML 表のスタイル設定の方法を学びます。