「自動」の高さの100%幅の背景画像


89

私は現在、会社のモバイルランディングページに取り組んでいます。これは本当に基本的なレイアウトですが、ヘッダーの下には常に100%の幅になる製品の画像があります(デザインは常に端から端まで行くことを示しています)。画面の幅に応じて、画像の高さは明らかにそれに応じて調整されます。私はもともとimg(CSS幅100%)でこれを行いましたが、うまく機能しましたが、メディアクエリを使用して、さまざまな解像度に基づいてさまざまな画像を提供したいと思いました。たとえば、同じ画像の大きなバージョン。CSSでimgsrcを変更できないことはわかっているので、HTMLのimgタグではなく、画像にCSSの背景を使用する必要があると考えました。

背景画像のdivは背景を表示するために幅と高さの両方を必要とするため、これを適切に機能させることができないようです。明らかに「幅:100%」を使用できますが、高さには何を使用しますか?150pxのようなランダムな固定高さを設定すると、画像の上部150pxが表示されますが、固定高さがないため、これは解決策ではありません。私は遊びをして、高さがあれば(150pxでテスト)、「background-size:100%」を使用して画像をdivに正しく合わせることができることを発見しました。このプロジェクトはモバイルのみを対象としているため、最新のCSS3を使用できます。

以下に大まかな例を追加しました。インラインスタイルを失礼しますが、質問をもう少し明確にするための基本的な例を示したいと思いました。

<div id="image-container">
    <div id="image" style="background: url(image.jpg) no-repeat; width: 100%; height: 150px; background-size: 100%;"></div>
</div>

コンテナdivにページ全体に基づいてパーセンテージの高さを指定する必要があるのでしょうか、それともこれを完全に間違って見ているのでしょうか。

また、CSSの背景がこれを行うための最良の方法だと思いますか?たぶん、デバイス/画面の幅に基づいて異なるimgタグを提供する手法があります。一般的な考え方は、ランディングページテンプレートはさまざまな製品画像で何度も使用されるため、これを可能な限り最善の方法で開発する必要があります。

申し訳ありませんが、これは少し時間がかかりますが、このプロジェクトから次のプロジェクトへと行ったり来たりしているので、この小さなことをやりたいと思います。よろしくお願いします。よろしく


ブラウザは、表示がある場合、画像リソースをダウンロードしないことを選択する場合があります:なし。したがって、JSなしでメディアクエリを使用して常に異なる画像を表示できます
Ben Taliadoros 2018年

回答:


17

を使用background-imageする代わりに、をimg直接使用して、ビューポートの幅全体に画像を広げることができます。使用してみてmax-width:100%;ください。メインのコンテナdivにパディングやマージンを適用しないでください。コンテナの合計幅が大きくなります。このルールを使用すると、画像の幅をブラウザの幅と同じにすることができ、高さもアスペクト比に応じて変化します。ありがとう。

編集:ウィンドウの異なるサイズで画像を変更する

$(window).resize(function(){
  var windowWidth = $(window).width();
  var imgSrc = $('#image');
  if(windowWidth <= 400){			
    imgSrc.attr('src','http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a');
  }
  else if(windowWidth > 400){
    imgSrc.attr('src','http://i.stack.imgur.com/oURrw.png');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="image-container">
  <img id="image" src="http://cdn.sstatic.net/Sites/stackoverflow/company/img/logos/so/so-icon.png?v=c78bd457575a" alt=""/>
</div>

このようにして、ブラウザのさまざまなサイズで画像を変更します。


私のためにこれをするために時間を割いてくれてありがとう、それは大いに感謝されます。ちょっと試してみたところ、うまくいっているようです。
ダリルヤング

2
この古い答えは魅力的に見えました...しかし、モバイルブラウザがHTMLで最初にsrcとして設定された画像をダウンロードする(表示しない)というのは本当ではありませんか?もしそうなら、ポイントはモバイルデバイスのリソースを節約することなので、それは初心者ではありません。
Tim Gallant 2013

1
Tim Gallantはこれに正解だと思います。この場合、ブラウザは両方の画像をリソースとしてロードし、低解像度の画像を表示するだけです。したがって、これは魅力的に見えますが、モバイルでは、高解像度のものだけをロードするよりも実際には遅く、その犠牲を払うと、低解像度の画像しか表示されません...両方の世界で最悪です。
小さな小さな男

1
悪い答え。反対票を投じた。単に肥大化した古いコード。
TheBlackBenzKid 2015

メディアクエリを挿入し、追加の表示があること:あなたが表示したくない画像にどれも-ほとんどのブラウザは、それらをダウンロードしないだろう
ベンTaliadoros

215

ティムS.は、現在受け入れられている答えよりも「正しい」答えにはるかに近かった。cover(画像を側面から伸ばすことができる)またはcontain(画像をまったく伸ばすことができない)を使用する代わりに、CSSで100%幅、可変高さの背景画像を作成したい場合は、次のようにCSSを設定します。

body {
    background-image: url(img.jpg);
    background-position: center top;
    background-size: 100% auto;
}

これにより、背景画像の幅が100%に設定され、高さがオーバーフローします。JavaScriptに依存する代わりに、メディアクエリを使用してその画像を交換できるようになりました。

編集:私はちょうど(3か月後)あなたがおそらく画像をオーバーフローさせたくないことに気づきました。コンテナ要素のサイズを背景画像に基づいて変更したいようです(アスペクト比を維持するため)。これは、私が知る限り、CSSでは不可能です。

うまくいけば、すぐに要素で新しいsrcset属性を使用できるようになりますimgimg今すぐ要素を使用したい場合は、現在受け入れられている答えがおそらく最善です。

ただし、純粋にCSSを使用して、一定のアスペクト比でレスポンシブな背景画像要素を作成できます。これを行うには、次のように、heightを0に設定し、padding-bottomを要素自体の幅のパーセンテージに設定します。

.foo {
    height: 0;
    padding: 0; /* remove any pre-existing padding, just in case */
    padding-bottom: 75%; /* for a 4:3 aspect ratio */
    background-image: url(foo.png);
    background-position: center center;
    background-size: 100%;
    background-repeat: no-repeat;
}

さまざまなアスペクト比を使用するには、元の画像の高さをそれ自体の幅で割り、100を掛けてパーセンテージ値を取得します。これが機能するのは、垂直方向のパディングであっても、パディングの割合は常に幅に基づいて計算されるためです。


4
完璧で迅速なグーグル検索が私をここに連れてきて、問題は解決しました!
J・キング

6
このような答えは受け入れられるべきです、彼らは質問に答えます。確かに「最善の解決策」を与えるだけでなく、質問に答えてください。そうすれば、人々がそれを見つけたときに、彼らは彼らが望む答えを得るでしょう!
tim.baker 2013

これは私には機能しません。私はGoogleChrome47.0を使用しています。答えが古くなっているからでしょうか?
MeVの

どの部分が機能していないかについて、より具体的に教えてください。私はいくつかの可能な答えを与えたので、一部が機能しない場合は、より良い、より最新の答えを与えるためにさらに詳しく説明することができます。
cr0ybot 2016年

いくつかの不明確な理由で、設定background-size: autoはすべてのデバイスの向きで私の問題を解決しました。
n__o 2016年

17

これを試して

html { 
  background: url(image.jpg) no-repeat center center fixed; 
  -webkit-background-size: cover;
     -moz-background-size: cover;
       -o-background-size: cover;
          background-size: cover;
}

簡易版

html {
  background: url(image.jpg) center center / cover no-repeat fixed;
}

16

CSSプロパティbackground-sizeを使用して、好みに応じてcoverまたはcontainに設定できます。カバーはウィンドウ全体をカバーしますが、コンテインは片側がウィンドウにフィットするため、ページ全体をカバーしません(画面のアスペクト比が画像と等しい場合を除く)。

これはCSS3プロパティであることに注意してください。古いブラウザでは、このプロパティは無視されます。または、javascriptを使用して、ウィンドウサイズに応じてCSS設定を変更することもできますが、これはお勧めできません。

body {
    background-image: url(image.jpg); /* image */
    background-position: center;      /* center the image */
    background-size: cover;           /* cover the entire window */
}

4

2色の背景画像を使用するだけです。

<div style="width:100%; background:url('images/bkgmid.png');
       background-size: cover;">
content
</div>



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