div内の画像をレスポンシブな高さに垂直に配置します


135

(正方形のアスペクト比を維持するために)ブラウザのサイズを変更すると、幅に応じて高さが変わるコンテナを設定する次のコードがあります。

HTML

<div class="responsive-container">
    <div class="dummy"></div>
    <div class="img-container">
        <IMG HERE>
    </div>
</div>

CSS

.responsive-container {
    position: relative;
    width: 100%;
    border: 1px solid black;
}

.dummy {
    padding-top: 100%; /* forces 1:1 aspect ratio */
}

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
}

コンテナ内でIMGを垂直に配置するにはどうすればよいですか?すべての画像の高さは可変で、応答性が高いため、コンテナの高さ/行の高さを固定できません...助けてください!


1
ここでは簡単なフレキシボックスソリューションは、次のとおりです。stackoverflow.com/a/31977476/3597276
マイケル・ベンジャミン

回答:


381

これは、親の内部のインライン要素を水平方向と垂直方向に同時に整列させる方法です。

垂直方向の配置

1)このアプローチでは、我々は、作成inline-blockの)最初(または最後の子として(擬似)要素の親をし、その設定heightするプロパティを100%そのすべての高さが取る親を

2)また、追加するとvertical-align: middle、inline(-block)要素が行スペースの中央に保持されます。したがって、そのCSS宣言をfirst-child要素画像)の両方に追加します。

3)最後に、inline(-block)要素間の空白文字を削除するために、によって親のフォントサイズをゼロに設定できますfont-size: 0;

注:以下では、Nicolas Gallagherの画像置換手法を使用しました。

メリットは何ですか?

  • コンテナー()は動的な次元を持つことができます。
  • 画像要素のサイズを明示的に指定する必要はありません。

  • このアプローチを簡単に使用して<div>要素を垂直方向整列させることもできます。動的コンテンツ(高さおよび/または幅)を持つ可能性があります。ただし、内部テキストを表示するにfont-sizeは、のプロパティを再設定する必要があることに注意してくださいdivオンラインデモ

<div class="container">
    <div id="element"> ... </div>
</div>
.container {
    height: 300px;
    text-align: center;  /* align the inline(-block) elements horizontally */
    font: 0/0 a;         /* remove the gap between inline(-block) elements */
}

.container:before {    /* create a full-height inline block pseudo=element */
    content: ' ';
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    height: 100%;
}

#element {
    display: inline-block;
    vertical-align: middle;  /* vertical alignment of the inline element */
    font: 16px/1 Arial sans-serif;        /* <-- reset the font property */
}

出力

コンテナー内の要素を垂直方向に配置する

レスポンシブコンテナ

OPはレスポンシブコンテナーの作成方法をすでに知っているので、このセクションでは質問に答えません。ただし、そのしくみについて説明します。

するために高さのとのコンテナ要素の変化の(アスペクト比を尊重する)、我々は、トップ/ボトムのパーセント値を使用することができるpaddingプロパティ。

上部/下部のパディングまたはマージンのパーセンテージ値は、包含ブロックの幅を基準にしています。

例えば:

.responsive-container {
  width: 60%;

  padding-top: 60%;    /* 1:1 Height is the same as the width */
  padding-top: 100%;   /* width:height = 60:100 or 3:5        */
  padding-top: 45%;    /* = 60% * 3/4 , width:height =  4:3   */
  padding-top: 33.75%; /* = 60% * 9/16, width:height = 16:9   */
}

こちらがオンラインデモです。下から行をコメント化し、パネルのサイズを変更して効果を確認します。

また、このpaddingプロパティをダミーの子または:before/ :after疑似要素に適用して、同じ結果を得ることができます。ただし、この場合、パーセンテージの値はそれ自体のを基準にしていることに注意しくださいpadding.responsive-container

<div class="responsive-container">
  <div class="dummy"></div>
</div>
.responsive-container { width: 60%; }

.responsive-container .dummy {
  padding-top: 100%;    /*  1:1 square */
  padding-top: 75%;     /*  w:h =  4:3 */
  padding-top: 56.25%;  /*  w:h = 16:9 */
}

デモ#1
デモ#2 :after疑似要素の使用)

コンテンツを追加する

padding-topプロパティ使用する、コンテンツの上部または下部、コンテナ内に大きなスペースが生じます。

それを固定するために、我々は、ラッパー要素でコンテンツをラップ使用して文書通常の流れからその要素を削除する必要があり、絶対配置を(BUは、使用してラッパーを拡大し、最終的、およびtoprightbottomおよびleftプロパティ)は、親の空間全体を埋めるために、コンテナ

さあ行こう:

.responsive-container {
  width: 60%;
  position: relative;
}

.responsive-container .wrapper {
  position: absolute;
  top: 0; right: 0; bottom: 0; left: 0;
}

こちらがオンラインデモです。


すべてをまとめる

<div class="responsive-container">
  <div class="dummy"></div>

  <div class="img-container">
    <img src="http://placehold.it/150x150" alt="">
  </div>
</div>
.img-container {
  text-align:center; /* Align center inline elements */
  font: 0/0 a;       /* Hide the characters like spaces */
}

.img-container:before {
  content: ' ';
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

.img-container img {
  vertical-align: middle;
  display: inline-block;
}

こちらがWORKING DEMOです。

明らかに、ブラウザーの互換性の::beforeために疑似要素を使用することを避け、の最初の子として要素を作成することができます。.img-container

<div class="img-container">
    <div class="centerer"></div>
    <img src="http://placehold.it/150x150" alt="">
</div>
.img-container .centerer {
  display: inline-block;
  vertical-align: middle;
  height: 100%;
}

更新されたデモ

max-*プロパティの使用

下の幅のボックスの画像内部を保つために、あなたが設定することができmax-height、およびmax-width画像のプロパティ:

.img-container img {
    vertical-align: middle;
    display: inline-block;
    max-height: 100%;  /* <-- Set maximum height to 100% of its parent */
    max-width: 100%;   /* <-- Set maximum width to 100% of its parent */
}

こちらが更新されたデモです。


1
こんにちはHashemはあなたの答えに感謝します-これは、幅を小さくするようにサイズ変更した場合でも、デスクトップブラウザの魔法のように機能しました。しかし残念ながら、モバイル(Android v2.3.5)では、コンテナーdivの下に画像が表示されません。これを修正するためのアイデアはありますか?
user1794295 2013

3
@ user1794295 browserstack.comを介してAndroid v2.3(Galaxy S II、Galaxy Note、Motorola Droid 4)を搭載した3つのAndroidデバイスでこのフィドルをテストしましたが、すべて期待どおりに機能します。 /…。スクリーンショットまたは問題の具体的なテストを提供してください。できる限りお手伝いします。
Hashem Qolami 2013

1
こんにちはここにいくつかのスクリーンショットがあります:browserstack.com/screenshots/…-小さいデバイス(Xperia、LG Nexus 4など)で確認できるように、画像はコンテナーの下に表示されます...何が起こっているのですか?
user1794295 2013

3
@HashemQolamiウェブサイトの構築を開始して以来、これは最も驚くべきCSSです。
Alexander Solonik、2015

1
ありがとうfont-size: 0;
Johannes Liebermann

47

フレックスボックスを使用すると、これは簡単です。

FIDDLE

以下を画像コンテナに追加するだけです:

.img-container {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex; /* add */
    justify-content: center; /* add to align horizontal */
    align-items: center; /* add to align vertical */
}

2
このソリューションは機能し、私の場合ははるかにエレガントです。CSS3 Flexは素晴らしいです!
ダニエルボンネル、

2
Safariでは機能しません:(問題はflexだと思います
JPYnefer、2015

1
サファリの@yenneferは-webkit-接頭辞を使用するか、prefixfree.jsなどのライブラリを試してください:)
QUB3X

コンテナの高さが反応している場合(パーセント単位)、これは機能しません。
jenlampton、2015年

1
完璧なソリューション!
Nirus、2016

16

すでにマークアップがあるので、このcssを使用します

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
}

.img-container > img {
  margin-top:-50%;
  margin-left:-50%;  
}

これが動作するJsBinです:http ://jsbin.com/ihilUnI/1/edit

このソリューションは、正方形の画像に対してのみ機能します(マージンの上部のパーセント値は、高さではなく、コンテナーの幅に依存するため)。ランダムサイズの画像の場合、次の操作を実行できます。

.img-container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%); /* add browser-prefixes */
}

実用的なJsBinソリューション:http ://jsbin.com/ihilUnI/2/edit


申し訳ありませんが、機能しません。これは、画像のサイズをコンテナの幅の半分に縮小するだけです。
user1794295 2013

2
私が言及したCSSからそれがどのように発生するかはわかりません。回答を改善できるように、私が確認できる実用的なサンプルを提供してください。PS:私は別のソリューションも提供しました:)
Tibos 2013

11

margin: auto絶対配置を使用して、画像を水平方向と垂直方向の両方で中央に配置できます。また:

  1. 疑似要素を使用することにより、余分なマークアップを破棄できます。
  2. 負の左、上、右、および下の値を使用して、大画像の中央部分を表示することができます。

.responsive-container {
  margin: 1em auto;
  min-width: 200px;       /* cap container min width */
  max-width: 500px;       /* cap container max width */
  position: relative;     
  overflow: hidden;       /* crop if image is larger than container */
  background-color: #CCC; 
}
.responsive-container:before {
  content: "";            /* using pseudo element for 1:1 ratio */
  display: block;
  padding-top: 100%;
}
.responsive-container img {
  position: absolute;
  top: -999px;            /* use sufficiently large number */
  bottom: -999px;
  left: -999px;
  right: -999px;
  margin: auto;           /* center horizontally and vertically */
}
<p>Note: images are center-cropped on &lt;400px screen width.
  <br>Open full page demo and resize browser.</p>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/400/sports/9/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/400/200/sports/8/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/400/sports/7/">
</div>
<div class="responsive-container">
  <img src="http://lorempixel.com/200/200/sports/6/">
</div>


ありがとう!あなたの.responsive-container img cssが私のために働いた唯一のものでした。
ディオゴガルシア

4

これをお試しください

  .responsive-container{
          display:table;
  }
  .img-container{
          display:table-cell;
          vertical-align: middle;
   }

申し訳ありませんが、これは機能しません。私.img-containerが絶対に配置されているためと思います。これは、正方形のアスペクト比/動的な高さを維持するために必要です。
user1794295 2013

2

ここでは、垂直方向と水平方向の両方で任意のコンテンツを中央に配置できるようにする手法を示します。

基本的には、2つのコンテナーが必要であり、要素が次の基準を満たしていることを確認します。

外側のコンテナ:

  • すべきだった display: table;

内部コンテナ:

  • すべきだった display: table-cell;
  • すべきだった vertical-align: middle;
  • すべきだった text-align: center;

コンテンツボックス:

  • すべきだった display: inline-block;

この手法を使用する場合は、コンテンツボックスに画像を(他のコンテンツと一緒に)追加します。

デモ :

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%;
    height: 100%;
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    background: #fff;
    padding : 12px;
    border : 1px solid #000;
}

img {
   max-width : 120px;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        <img src="https://i.stack.imgur.com/mRsBv.png" />
     </div>
   </div>
</div>

このフィドルも参照してください!


2

私は次のような解決策を探してこのスレッドに出くわしました:

  • 指定された画像の幅の100%を使用します
  • 画像のアスペクト比を維持します
  • 画像を中央に垂直に配置したままにします
  • フレックスを完全にサポートしていないブラウザで動作します

上記のソリューションのいくつかをテストしたところ、この基準をすべて満たすソリューションが見つからなかったため、同じことを行う必要のある他の人に役立つ可能性がある、このシンプルなソリューションをまとめました。

.container {
  width: 30%;
  float: left;
  border: 1px solid turquoise;
  margin-right: 3px;
  margin-top: 3px;
}

.container:last-of-kind {
  margin-right: 0px;
}

.image-container {
  position: relative;
  overflow: hidden;
  padding-bottom: 70%;
  /* this is the desired aspect ratio */
  width: 100%;
}

.image-container img {
  position: absolute;
  /* the following 3 properties center the image on the vertical axis */
  top: 0;
  bottom: 0;
  margin: auto;
  /* uses image at 100% width (also meaning it's horizontally center) */
  width: 100%;
}
<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

<div class="container">
  <div class="image-container">
    <img src="http://placehold.it/800x800" class="img-responsive">
  </div>
</div>

JSFiddleの作業例


0

試す

HTML

<div class="responsive-container">
     <div class="img-container">
         <IMG HERE>
     </div>
</div>

CSS

.img-container {
    position: absolute;
    top: 0;
    left: 0;
height:0;
padding-bottom:100%;
}
.img-container img {
width:100%;
}

0

HTMLコード

<div class="image-container"> <img src=""/> </div>

CSSコード

img
{
  position: relative;
  top: 50%;
  transform: translateY(-50%);
 }

このコードスニペットは歓迎されており、多少の助けになるかもしれませんが、質問への対処方法の説明含まれていれば大幅に改善されます。それがなければ、あなたの答えは教育的価値がはるかに低くなります-あなたが今尋ねている人だけでなく、将来的に読者のための質問に答えていることを忘れないでください!回答を編集して説明を追加し、適用される制限と前提を示してください。
Toby Speight 2017年

0

別のdivを作成し、div内に「dummy」と「img-container」の両方を追加します

次のようにHTMLとCSSを実行します

html , body {height:100%;}
.responsive-container { height:100%; display:table; text-align:center; width:100%;}
.inner-container {display:table-cell; vertical-align:middle;}
<div class="responsive-container">
    <div class="inner-container">
		<div class="dummy">Sample</div>
		<div class="img-container">
			Image tag
		</div>
	</div>	
</div>

「レスポンシブコンテナ」の100%の代わりに、必要な高さを指定できます。、

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