background-sizeに相当するものはありますか:画像要素をカバーして含みますか?


240

私は多くのページとさまざまな背景画像のあるサイトを持っていて、CSSから次のように表示します。

body.page-8 {
    background: url("../img/pic.jpg") no-repeat scroll center top #000;
    background-size: cover;
}

ただし、<img>要素を使用して1つのページに異なる(フルスクリーン)画像を表示し、上記のbackground-image: cover;プロパティと同じプロパティを設定し ます(画像はCSSから表示できません。HTMLドキュメントから表示する必要があります)。

通常私は使用します:

div.mydiv img {
    width: 100%;
}

または:

div.mydiv img {
    width: auto;
}

画像を完全で応答性の高いものにします。ただし、width: 100%画面が狭くなりすぎると画像が縮小しすぎ()、下部の画面にボディの背景色が表示されます。もう1つの方法width: auto;は、画像をフルサイズにするだけで、画面サイズに応答しません。

同じように画像を表示する方法はありbackground-size: coverますか?


すばらしい質問です。
wonsuc

回答:


380

解決策#1- オブジェクトフィットプロパティIEサポートが欠けている

object-fit: cover;imgに設定するだけです。

body {
  margin: 0;
}
img {
  display: block;
  width: 100vw;
  height: 100vh;
  object-fit: cover;
}
<img src="http://lorempixel.com/1500/1000" />

MDNを参照-についてobject-fit: cover

置き換えられたコンテンツは、要素のコンテンツボックス全体を埋める間、アスペクト比を維持するようにサイズ変更されます。オブジェクトのアスペクト比がそのボックスのアスペクト比と一致しない場合、オブジェクトは切り取られて収まります。

また、画像に適用されたものと背景画像に適用されたものを比較するこのCodepenデモを参照してください。object-fit: coverbackground-size: cover


解決策#2-imgをcssで背景画像に置き換える

body {
  margin: 0;
}
img {
  position: fixed;
  width: 0;
  height: 0;
  padding: 50vh 50vw;
  background: url(http://lorempixel.com/1500/1000/city/Dummy-Text) no-repeat;
  background-size: cover;
}
<img src="http://placehold.it/1500x1000" />


3
このコメントの時点では、オブジェクトフィットはまだInternet Explorerのどのバージョン(Edgeも含む)でサポートされていません。ただし、検討中です。
マイクコルメンディ2016年

3
IEではオブジェクトフィットはまだサポートされていません。私が本番サイトにいて、IEユーザーのことを気にかけているのなら、私は立ち入りません。
トラヴィスマイケル・ヘラー

2
IEと古いSafariの#1にポリフィルを追加することもできます:github.com/bfred-it/object-fit-images
Valera

1
2番目のソリューションに注意してください。:ベストモバイルブラウザでVHに依存しないnicolas-hoizey.com/2015/02/...
sudokai

1
@RoCkあなたはcaniuseでそのようなものを見つけることができます:caniuse.com/#search=background-att :) PS私はすべてIEがこの機能のサポートを得ることはなく、ポリフィルもないので、私たちは皆安心できると思います:WindowsからIEを削除してIEを(最終的に) "殺害"するときであるとMSが判断するまで、JS / CSSハックでねじ込みまたはスタックします。
SidOfc 2018

31

実際、IE8でも機能する非常にシンプルなcssソリューションがあります。

.container {
  position: relative;
  overflow: hidden;
  /* Width and height can be anything. */
  width: 50vw;
  height: 50vh;
}

img {
  position: absolute;
  /* Position the image in the middle of its container. */
  top: -9999px;
  right: -9999px;
  bottom: -9999px;
  left: -9999px;
  margin: auto;
  /* The following values determine the exact image behaviour. */
  /* You can simulate background-size: cover/contain/etc.
     by changing between min/max/standard width/height values.
     These values simulate background-size: cover
  */
  min-width: 100%;
  min-height: 100%;
}
<div class="container">
    <img src="http://placehold.it/200x200" alt="" />
</div>


9
これはカバーの動作を複製しませんが、代わりにsrc imgから中央のセクションをトリミングします。jsfiddle.net/sjt71j99/4を参照してください-最初のimgは作物で、次はbackground-size:coverを使用します。つまり、カバー、つまり3番目は元のimgです。横向きの画像でimgがmin-heightとmin-widthをmax-height:100%に置き換えます。縦向きの場合、最大幅は100%です。横向きまたは縦向きのどちらかで機能する解決策が1つあればよいでしょう。何か案は?これは、これまでに見た中で最高のクロスブラウザソリューションです。
15

1
そうです、まったく同じことはしません。いくつか試してみましたが、実際にカバー100%を複製することはできません。画像が1次元のコンテナーよりも小さい限り、機能しますでも。
Simon、

@terraling、私はそれが古いコメントであることを知っていますが、私の答えを確認してください。変換を使用して、imgを中央に配置します。
チアゴバルカラ2018

30

埋めたいコンテナ要素を用意できると仮定すると、これは機能するように見えますが、少しハックに感じられます。本質的に、私min/max-width/heightはより広い領域で使用し、その領域を元のサイズにスケーリングします。

.container {
  width: 800px;
  height: 300px;
  border: 1px solid black;
  overflow:hidden;
  position:relative;
}
.container.contain img {
  position: absolute;
  left:-10000%; right: -10000%; 
  top: -10000%; bottom: -10000%;
  margin: auto auto;
  max-width: 10%;
  max-height: 10%;
  -webkit-transform:scale(10);
  transform: scale(10);
}
.container.cover img {
  position: absolute;
  left:-10000%; right: -10000%; 
  top: -10000%; bottom: -10000%;
  margin: auto auto;
  min-width: 1000%;
  min-height: 1000%;
  -webkit-transform:scale(0.1);
  transform: scale(0.1);
}
<h1>contain</h1>
  <div class="container contain">
    <img 
       src="https://www.google.de/logos/doodles/2014/european-parliament-election-2014-day-4-5483168891142144-hp.jpg" 
       />
    <!-- 366x200 -->
  </div>
  <h1>cover</h1>
  <div class="container cover">
    <img 
       src="https://www.google.de/logos/doodles/2014/european-parliament-election-2014-day-4-5483168891142144-hp.jpg" 
       />
    <!-- 366x200 -->
  </div>


1
完全に同意します。これは、上記すべての一般的な使用に最適なソリューションです。
VarisVītols19年

それは素晴らしい。それは私を助けました。ありがとう
Raman Nikitsenka

14

純粋なCSSである、カバーとコンテインの両方をエミュレートする単純なソリューションを見つけました。動的なサイズのコンテナーで機能し、画像の比率に制限を設けていません。

IEまたは16より前のEdgeをサポートする必要がない場合は、object-fitを使用することをお勧めします。

背景サイズ:カバー

.img-container {
  position: relative;
  overflow: hidden;
}

.background-image {
  position: absolute;
  min-width: 1000%;
  min-height: 1000%;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%) scale(0.1);
  z-index: -1;
}
<div class="img-container">
  <img class="background-image" src="https://picsum.photos/1024/768/?random">
  <p style="padding: 20px; color: white; text-shadow: 0 0 10px black">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>
</div>

画像の自然なサイズが表示されているサイズよりも大きい場合は、ここで1000%が使用されます。たとえば、画像が500x500であるのに、コンテナが200x200しかない場合。このソリューションでは、画像のサイズが2000x2000(最小幅/最小高さにより)に変更され、200x200に縮小されます(transform: scale(0.1))にます。

x10係数はx100またはx1000で置き換えることができますが、通常、20x20 divでレンダリングされる2000x2000画像を使用することは理想的ではありません。:)

背景サイズ:含む

同じ原則に従って、それを使用してエミュレートすることもできますbackground-size: contain

.img-container {
  position: relative;
  overflow: hidden;
  z-index: 0;
}

.background-image {
  position: absolute;
  max-width: 10%;
  max-height: 10%;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%) scale(10);
  z-index: -1;
}
<div style="background-color: black">
  <div class="img-container">
    <img class="background-image" src="https://picsum.photos/1024/768/?random">
    <p style="padding: 20px; color: white; text-shadow: 0 0 10px black">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
  </div>
</div>


スケールトリックはすでにここhttps://stackoverflow.com/a/28771894/2827823に記載されているので、もう1つ投稿の要点を確認できません。そのためtransform、多くの回答がそうです
Ason

あなたが説明を展開したい場合は、同じ溶液で2の必要がないように、代わりにその答えを更新
朝臣

1
コメント@LGSonをありがとう。その答えを見たことがありませんでしたが、私の答えはここでも価値があると思います。アプローチはほとんど同じですが、私の意見では、私の見た目は少しわかりやすく表示されています。ここで他の多くの答えが同じ解決策を示しており、それらすべてが不完全です(リンクしたものを除く)。だから私の答えがここにあってはいけないなら、他の答えもそうであってはならない。
チアゴバルカラ2018

1
AndroidのChromeモバイルブラウザー(LG G3とSamsung S9でテスト済み)で画像を縮小することがわかりました。iOSのChromeではテストしていません。AndroidのFirefoxモバイルでは正しく表示されました。
Jecko

10

いいえ、あなたはそれをかなり得ることはできませんbackground-size:cover が..

このアプローチは非常に近いです。JavaScriptを使用して画像が横向きか縦向きかを判断し、それに応じてスタイルを適用します。

JS

 $('.myImages img').load(function(){
        var height = $(this).height();
        var width = $(this).width();
        console.log('widthandheight:',width,height);
        if(width>height){
            $(this).addClass('wide-img');
        }else{
            $(this).addClass('tall-img');
        }
    });

CSS

.tall-img{
    margin-top:-50%;
    width:100%;
}
.wide-img{
    margin-left:-50%;
    height:100%;
}

http://jsfiddle.net/b3PbT/


3

をエミュレートする必要background-size: containがありobject-fitましたが、サポートが不足しているため使用できませんでした。私の画像には定義された寸法のコンテナがあり、これは私にとってはうまくいきました:

.image-container {
  height: 200px;
  width: 200px;
  overflow: hidden;
  background-color: rebeccapurple;
  border: 1px solid yellow;
  position: relative;
}

.image {
  max-height: 100%;
  max-width: 100%;
  margin: auto;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
}
<!-- wide -->
<div class="image-container">
  <img class="image" src="http://placehold.it/300x100">
</div>

<!-- tall -->
<div class="image-container">
  <img class="image" src="http://placehold.it/100x300">
</div>


min-height: 100%; max-height:100%;background-size:coverを使用して、それと同等のものを取得できます。
Chris Seufert、2017

min-height: 100%; max-height:100%;アスペクト比を保持しないため、完全に同等ではありません。
Reedyn

2

設定してみてください両方を min-heightしてmin-width、とdisplay:block

img {
    display:block;
    min-height:100%;
    min-width:100%;
}

フィドル

画像の包含要素がposition:relativeまたはposition:absolute、画像はコンテナをカバーします。ただし、中央に配置されません。

水平方向にオーバーフローするか(set margin-left:-50%)、垂直方向にオーバーフローするか(set )がわかっている場合は、画像を簡単に中央に配置できますmargin-top:-50%。CSSメディアクエリ(およびいくつかの数学)を使用してそれを理解することが可能かもしれません。


2

CSSを使用してシミュレートできますobject-fit: [cover|contain];。使用transform[max|min]-[width|height]です。 それは完璧ではありません。これは1つのケースでは機能しません。画像がコンテナよりも広くて短い場合。

.img-ctr{
  background: red;/*visible only in contain mode*/
  border: 1px solid black;
  height: 300px;
  width: 600px;
  overflow: hidden;
  position: relative;
  display: block;
}
.img{
  display: block;

  /*contain:*/
  /*max-height: 100%;
  max-width: 100%;*/
  /*--*/

  /*cover (not work for images wider and shorter than the container):*/
  min-height: 100%;
  width: 100%;
  /*--*/

  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<p>Large square:
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x1000"></span>
</p>
<p>Small square:
<span class="img-ctr"><img class="img" src="http://placehold.it/100x100"></span>
</p>
<p>Large landscape:
<span class="img-ctr"><img class="img" src="http://placehold.it/2000x1000"></span>
</p>
<p>Small landscape:
<span class="img-ctr"><img class="img" src="http://placehold.it/200x100"></span>
</p>
<p>Large portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x2000"></span>
</p>
<p>Small portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/100x200"></span>
</p>
<p>Ultra thin portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/200x1000"></span>
</p>
<p>Ultra wide landscape (images wider and shorter than the container):
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x200"></span>
</p>


2

あなたができることは、要素に背景画像を追加するために 'style'属性を使用することです。これにより、HTMLで画像を呼び出すことができますが、background-size:cover css behaviourを引き続き使用できます。

HTML:

    <div class="image-div" style="background-image:url(yourimage.jpg)">
    </div>

CSS:

    .image-div{
    background-size: cover;
    }

これは、HTMLに動的にロードする必要がある要素にbackground-size:cover動作を追加する方法です。その後、background-position:centerのような素晴らしいcssクラスを使用できます。ブーム


1
主に懸念事項の分離ですが、他にいくつかあります:programmers.stackexchange.com/a/271338
Daan

0

IEの場合は、2行目も含める必要があります-幅:100%;

.mydiv img {
    max-width: 100%;
    width: 100%;
}

0

私は「コメントを追加する」ことを許可されていないのでこれを行うが、ええええええええええええええええええええええええええええええええ、それは背景カバーのようにそれを取得するためにあなたがする必要があるすべては変更です

.tall-img{
    margin-top:-50%;
    width:100%;
}
.wide-img{
    margin-left:-50%;
    height:100%;
}

.wide-img{
    margin-left:-42%;
    height:100%;
}
.tall-img{
    margin-top:-42%;
    width:100%;
}


0

私はこれが古いことを知っていますが、上記で見た多くの解決策は、画像/動画がコンテナには大きすぎるため、実際には背景サイズのカバーのように機能しないという問題があります。ただし、画像や動画で機能するように「ユーティリティクラス」を作成することにしました。単にコンテナーに.media-cover-wrapperクラスを与え、メディアアイテム自体に.media-coverクラスを与えます

次に、次のjQueryがあります。

function adjustDimensions(item, minW, minH, maxW, maxH) {
  item.css({
  minWidth: minW,
  minHeight: minH,
  maxWidth: maxW,
  maxHeight: maxH
  });
} // end function adjustDimensions

function mediaCoverBounds() {
  var mediaCover = $('.media-cover');

  mediaCover.each(function() {
   adjustDimensions($(this), '', '', '', '');
   var mediaWrapper = $(this).parent();
   var mediaWrapperWidth = mediaWrapper.width();
   var mediaWrapperHeight = mediaWrapper.height();
   var mediaCoverWidth = $(this).width();
   var mediaCoverHeight = $(this).height();
   var maxCoverWidth;
   var maxCoverHeight;

   if (mediaCoverWidth > mediaWrapperWidth && mediaCoverHeight > mediaWrapperHeight) {

     if (mediaWrapperHeight/mediaWrapperWidth > mediaCoverHeight/mediaCoverWidth) {
       maxCoverWidth = '';
       maxCoverHeight = '100%';
     } else {
       maxCoverWidth = '100%';
       maxCoverHeight = '';
     } // end if

     adjustDimensions($(this), '', '', maxCoverWidth, maxCoverHeight);
   } else {
     adjustDimensions($(this), '100%', '100%', '', '');
   } // end if
 }); // end mediaCover.each
} // end function mediaCoverBounds

それを呼び出すときは、ページのサイズ変更に注意してください:

mediaCoverBounds();

$(window).on('resize', function(){
  mediaCoverBounds();
});

次に、次のCSS:

.media-cover-wrapper {
  position: relative;
  overflow: hidden;
}

.media-cover-wrapper .media-cover {
  position: absolute;
  z-index: -1;
  top: 50%;
  left: 50%;
  -ms-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

ええ、それはjQueryを必要とするかもしれませんが、非常によく応答し、background-size:coverとまったく同じように機能します。画像やビデオでそれを使用して、追加のSEO値を取得できます。


0

ZOOMアプローチをとることができます。アスペクト画像の高さまたは幅が希望の高さまたは幅よりも小さい場合、最大30%(または最大100%)がズーム効果になると想定できます。残りの不要な領域は、overflow:hiddenで非表示にできます。

.image-container {
  width: 200px;
  height: 150px;
  overflow: hidden;
}
.stage-image-gallery a img {
  max-height: 130%;
  max-width: 130%;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translateX(-50%) translateY(-50%);
}

これにより、幅または高さが異なる画像が調整されます。


-1
background:url('/image/url/') right top scroll; 
background-size: auto 100%; 
min-height:100%;

同じ正確なsymptopsが発生しました。上記は私のために働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.