CSSのオブジェクトフィットと背景サイズの詳細
公開: 2022-03-10object-fit
とbackground-size
がどのように機能するか、いつ使用できるか、その理由、およびいくつかの実用的な使用例と推奨事項について説明します。 飛び込みましょう。 HTML要素のさまざまなサイズの画像を常に読み込むことができるとは限りません。 画像のアスペクト比に比例しない幅と高さを使用すると、画像が圧縮または拡大される可能性があります。 これは良くありませんimg
要素のobject-fit
を使用するか、 background-size
を使用して解決できます。
まず、問題を定義しましょう。 次の図を検討してください。
なぜこうなった?
画像にはアスペクト比があり、ブラウザはその画像を含むボックスに入力します。 画像のアスペクト比が指定された幅と高さと異なる場合、結果は絞り込まれた画像または引き伸ばされた画像になります。
これを次の図に示します。
ソリューション
画像のアスペクト比が含まれている要素の幅と高さに合わない場合は、必ずしも異なるサイズの画像を追加する必要はありません。 CSSソリューションに飛び込む前に、写真編集アプリでこれをどのように行っていたかをお見せしたいと思います。
これがどのように機能するかを理解したので、ブラウザでこれがどのように機能するかを見てみましょう。 (ネタバレ注意:簡単です! )
CSS object-fit
object-fit
プロパティは、 img
やvideo
などの置き換えられた要素のコンテンツを、そのコンテナに合わせてサイズ変更する方法を定義します。 object-fit
のデフォルト値はfill
です。これにより、画像が圧縮または引き伸ばされる可能性があります。
可能な値を調べてみましょう。
object-fit
可能な値
object-fit: contain
この場合、画像はコンテナのアスペクト比に合うようにサイズ変更されます。 画像のアスペクト比がコンテナのアスペクト比と一致しない場合は、レターボックス化されます。
object-fit: cover
ここでは、画像もコンテナのアスペクト比に合わせてサイズ変更され、画像のアスペクト比がコンテナのアスペクト比と一致しない場合は、クリップされて収まります。
object-fit: fill
これにより、画像はコンテナのアスペクト比に合わせてサイズ変更され、画像のアスペクト比がコンテナのアスペクト比と一致しない場合は、圧縮または引き伸ばされます。 私たちはそれを望んでいません。
object-fit: none
この場合、画像のサイズはまったく変更されず、引き伸ばされたり、絞り込まれたりすることはありません。 cover
値のように機能しますが、コンテナのアスペクト比を尊重しません。
object-fit
の他に、 object-position
プロパティもあります。このプロパティは、コンテナ内に画像を配置する役割を果たします。
object-position
可能な値
object-position
プロパティは、CSSのbackground-position
プロパティと同様に機能します。
top
キーワードとbottom
キーワードは、包含ボックスのアスペクト比が垂直方向に大きい場合にも機能します。
CSS background-size
background-size
の場合、最初の違いは、HTML( img
)要素ではなく、背景を処理することです。
background-size
可能な値
background-size
に指定できる値は、 auto
、 contain
、 cover
です。
background-size: auto
auto
を使用すると、画像はデフォルトのサイズのままになります。
background-size: cover
ここでは、コンテナに収まるように画像のサイズが変更されます。 アスペクト比が同じでない場合、画像はフィットするようにマスクされます。
background-size: contain
この場合、画像はコンテナに収まるようにサイズ変更されます。 アスペクト比がオフの場合、次の例に示すように、画像はレターボックス化されます。
background-position
に関しては、 object-position
の動作と似ています。 唯一の違いは、 object-position
のデフォルトの位置がbackground-position
のデフォルトの位置と異なることです。
object-fit
またはbackground-size
を使用しない場合
要素または画像に固定の高さが与えられ、 background-size: cover
またはobject-fit: cover
が適用されている場合、画像が広すぎるポイントが存在するため、方法に影響を与える可能性のある重要な詳細が失われます。ユーザーは画像を認識します。
画像に固定の高さが与えられている次の例を考えてみましょう。
.card__thumb { height: 220px; }
カードのコンテナが広すぎると、右側に表示される結果になります(画像が広すぎます)。 これは、アスペクト比を指定していないためです。
これに対する2つの修正のうちの1つだけがあります。 1つ目は、パディングハックを使用して固有の比率を作成することです。
.card__thumb { position: relative; padding-bottom: 75%; height: 0; } .card__thumb img { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }
2番目の修正は、新しいaspect-ratio
CSSプロパティを使用することです。 これを使用して、次のことができます。
.card__thumb img { aspect-ratio: 4 / 3; }
注:アスペクト比について知りたい場合に備えて、 aspect-ratio
のプロパティについてはすでに詳しく説明しました。「CSSのアスペクト比について学びましょう」。
ユースケースと例
ユーザーアバター
object-fit: cover
はユーザーアバターです。 アバターに許可されるアスペクト比は、多くの場合正方形です。 正方形のコンテナに画像を配置すると、画像が歪む可能性があります。
.c-avatar { object-fit: cover; }
ロゴリスト
ビジネスのクライアントをリストすることは重要です。 この目的でロゴを使用することがよくあります。 ロゴのサイズは異なるため、歪ませずにサイズを変更する方法が必要です。
ありがたいことに、 object-fit: contain
はそのための優れたソリューションです。
.logo__img { width: 150px; height: 80px; object-fit: contain; }
記事のサムネイル
これは非常に一般的なユースケースです。 記事のサムネイルのコンテナには、常に同じアスペクト比の画像が含まれているとは限りません。 この問題は、そもそもコンテンツ管理システム(CMS)によって修正される必要がありますが、常にそうであるとは限りません。
.article__thumb { object-fit: cover; }
ヒーローの背景
このユースケースでは、 img
要素を使用するかCSS背景を使用するかの決定は、以下に依存します。
- 画像は重要ですか? 何らかの理由でCSSが無効になっている場合、ユーザーに画像を表示してもらいたいですか?
- それとも、画像の目的は単に装飾的なものですか?
私たちの答えに基づいて、使用する機能を決定できます。 画像が重要な場合:
<section class="hero"> <img class="hero__thumb" src="thumb.jpg" alt="" /> </section>
.hero { position: relative; } .hero__thumb { position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; }
画像が装飾的である場合は、 background-image
を使用できます:
.hero { position: relative; background-image: linear-gradient(to top, #a34242, rgba(0,0,0,0), url("thumb.jpg"); background-repeat: no-repeat; background-size: cover; }
この場合、CSSは短くなります。 画像の上に配置されたテキストが読みやすく、アクセス可能であることを確認してください。
object-fit: contain
img
に背景色を追加できることをご存知ですか? object-fit: contain
を使用する場合にも、このメリットがあります。
以下の例では、画像のグリッドがあります。 画像とコンテナのアスペクト比が異なる場合、背景色が表示されます。
img { object-fit: contain; background-color: #def4fd; }
ビデオ要素
背景としてvideo
が必要になったことがありますか? もしそうなら、あなたはおそらくそれがその親の全幅と高さを占めることを望んだでしょう。
.hero { position: relative; background-color: #def4fd; } .hero__video { position: aboslute; left: 0; top: 0; width: 100%; height: 100%; }
親の幅と高さを完全にカバーするには、デフォルトのobject-fit
値をオーバーライドする必要があります。
.hero__video { /* other styles */ object-fit: cover; }
結論
これまで見てきたように、 object-fit
とbackground-size
の両方が、さまざまな画像のアスペクト比を処理するのに非常に役立ちます。 各画像の完璧なサイズの設定を常に制御できるとは限りません。そのため、これら2つのCSS機能が優れています。
img
要素とCSS背景のどちらかを選択することのアクセシビリティへの影響についてのわかりやすい注意:画像が純粋に装飾的である場合は、CSS背景を選択してください。 それ以外の場合は、 img
の方が適しています。
この記事がお役に立てば幸いです。 読んでくれてありがとう。