画像を自動的にトリミングして中央に配置する方法


158

任意の画像が与えられた場合、画像の中心から正方形を切り取り、特定の正方形内に表示します。

この質問はこれに似ています:CSSで画像のサイズを変更してトリミングした画像を表示しますが、画像のサイズがわからないため、余白を設定できません。


1
要素は画像タグである必要がありますか、それともbackground-imageプロパティを持つdivにすることができますか?
ラスフェリ

テンプレートシステムを使用して画像を設定できる限り、問題はありません。ちょっと見苦しいですが、インラインスタイルでうまくいくと思います。
Jonathan Ong

回答:


318

1つの解決策は、トリミングされた寸法に合わせてサイズ調整された要素内で中央揃えされた背景画像を使用することです。


基本的な例

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
</div>


の例 imgタグの

このバージョンはimgタグを保持するため、画像を保存するためにドラッグまたは右クリックする機能を失うことはありません。不透明度のトリックについては、パーカーベネットの功績です。

.center-cropped {
  width: 100px;
  height: 100px;
  background-position: center center;
  background-repeat: no-repeat;
  overflow: hidden;
}

/* Set the image to fill its parent and make transparent */
.center-cropped img {
  min-height: 100%;
  min-width: 100%;
  /* IE 8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  /* IE 5-7 */
  filter: alpha(opacity=0);
  /* modern browsers */
  opacity: 0;
}
<div class="center-cropped" 
     style="background-image: url('http://placehold.it/200x200');">
  <img src="http://placehold.it/200x200" />
</div>


object-fit/-position

サポートされているブラウザを見る

CSS3画像仕様は定義object-fitobject-position一緒の画像コンテンツのスケールと位置をより細かく制御を可能にするプロパティimg要素。これらを使用すると、目的の効果を得ることができます。

.center-cropped {
  object-fit: none; /* Do not scale the image */
  object-position: center; /* Center the image within the element */
  height: 100px;
  width: 100px;
}
<img class="center-cropped" src="http://placehold.it/200x200" />


45
を使用background-size: cover;して、元のアスペクト比を維持しながら、divを適切に縮小または塗りつぶすことができます。
ニック

7
background-imageを使用するときは、background-size:coverを追加して、トリミングされた画像のサイズを適切に設定する必要があります。 。jsfiddle.net/ bw6ctを
Kris Erickson

2
最近、Googleは透明な画像と隠された画像について知っているので、 img、SEO のaltant title属性は失われるます。
Victor Sergienko、2014

6
Webkitでも使用できます object-fit: cover;、もう少しセマンティックに感じられるimgタグを直接する。
ベン

2
Object-Fit:Coverを使用して、アスペクト比を失わない、正方形をカバーする、必要に応じてトリミングするという希望の効果を得ました
Cover Daniel Handojo

79

私は純粋なCSSソリューションを探していました imgタグ(背景画像の方法ではない)。

はCSS作物のサムネイルの目標を達成するためのこの素晴らしい方法を見つけました:

.thumbnail {
  position: relative;
  width: 200px;
  height: 200px;
  overflow: hidden;
}
.thumbnail img {
  position: absolute;
  left: 50%;
  top: 50%;
  height: 100%;
  width: auto;
  -webkit-transform: translate(-50%,-50%);
      -ms-transform: translate(-50%,-50%);
          transform: translate(-50%,-50%);
}
.thumbnail img.portrait {
  width: 100%;
  height: auto;
}

@Nathan Redblurの回答に似ていますが、縦向きの画像も使用できます。

私にとっては魅力のように機能します。画像について知っておく必要があるのは、.portraitクラスを設定するために画像が縦長か横長かだけです。そのため、この部分には少しJavascriptを使用する必要がありました。


3
CSS変換はIE 9以降でのみ使用できることに注意してください。
Simon East

5
これが答えです。
ウェスモード

OPは「任意の画像」と言ったので、画像が横よりも高かった場合、事前にはわかりません。
2016年

11
min-height:100%; min-width:100%;とすると 高さの代わりに:100%;幅:自動; img.portraitクラスは必要ありません。
user570605 2016年

1
@ user570605提案と組み合わせた最良のソリューション
albanx 2017

45

これを試してください:画像の切り取り寸法を設定し、CSSで次の行を使用します。

object-fit: cover;

3
あまりサポートされていません:caniuse.com/#feat=object-fit EDIT:実際には、いつものように、MSブラウザーだけがこれに失敗します...しかし、それはかなりの使用量を表しています:/
Brian H.

1
これはまさに私が必要とするものを実行します:)
hcarreras

1
これをサポートしていない広く使用されているブラウザは、Internet Explorer 11とEdgeだけです。視聴者にもよりますが、現在のサポートはおそらく85〜90%であり、これが一部のシナリオでこれを実現できる可能性があります。
ハスキー

キング!素晴らしいソリューション!!
itzhar

1
:THERは、そのことについての良いチュートリアルだmedium.com/@chrisnager/...
ピエトロ・ラ・グロッタ

23

imgタグあり、なしの例background-image

このソリューションはimgタグを保持するため、ドラッグまたは右クリックして画像を保存する機能を失うことなくbackground-image、CSSで中央揃えとトリミングを行う必要がありません。

非常に高い画像を除いて、アスペクト比を細かく維持します。(リンクを確認してください)

(動作中のビュー)

マークアップ

<div class="center-cropped">
    <img src="http://placehold.it/200x150" alt="" />
</div>

CSS

div.center-cropped {
  width: 100px;
  height: 100px;
  overflow:hidden;
}
div.center-cropped img {
  height: 100%;
  min-width: 100%;
  left: 50%;
  position: relative;
  transform: translateX(-50%);
}

これを試してください...画像が中央に配置されるコンテナよりも小さい場合、それ以外の場合はjsfiddle.net/3ts4rm24/1
KnF

8

@Russと@Alexの回答を使用してangularjsディレクティブを作成しました

2014年以降は興味深いかもしれません:P

html

<div ng-app="croppy">
  <cropped-image src="http://placehold.it/200x200" width="100" height="100"></cropped-image>
</div>

js

angular.module('croppy', [])
  .directive('croppedImage', function () {
      return {
          restrict: "E",
          replace: true,
          template: "<div class='center-cropped'></div>",
          link: function(scope, element, attrs) {
              var width = attrs.width;
              var height = attrs.height;
              element.css('width', width + "px");
              element.css('height', height + "px");
              element.css('backgroundPosition', 'center center');
              element.css('backgroundRepeat', 'no-repeat');
              element.css('backgroundImage', "url('" + attrs.src + "')");
          }
      }
  });

フィドルリンク


3
Hiya反対投票者。間違いがあれば回答を更新できるように、コメントを残してください。虚偽の情報を提供するのは好きではありません。乾杯。
mraaroncruz

反対投票ではありませんが、これはAngularの質問ではなく、あなたの回答は無関係です。@pferdefleisch
mawburn

1
意味のある@mburn。それは3年になります、そしてこれはおそらく少し場違いであるか、今や不快に見えます。私のコメントへの賛成投票は、少なくとも数人の人がそれが便利だと思うかもしれないと私に言っているので、私はそれを残しておきます(または彼らはコメントなしで反対投票を好まないだけです)。
mraaroncruz 2017年

2

これを試して:

#yourElementId
{
    background: url(yourImageLocation.jpg) no-repeat center center;
    width: 100px;
    height: 100px;
}

ことを覚えておいてくださいwidthheightあなたのDOM要素は、(ブロックのように、要素を表示されたレイアウトを持っている場合にのみ動作しますdivimg)。そうでない場合(スパンなど)、display: block;CSSルールに追加します。CSSファイルにアクセスできない場合は、要素にインラインでスタイルをドロップします。


ほとんどの場合、このCSSはさまざまな画像で繰り返し使用されます。したがって、背景画像をインラインで設定することは避けられません。
ラプター2013年

0

画像を中央にトリミングできる別の方法があります。

.thumbnail{position: relative; overflow: hidden; width: 320px; height: 640px;}
.thumbnail img{
    position: absolute; top: -999px; bottom: -999px; left: -999px; right: -999px;
    width: auto !important; height: 100% !important; margin: auto;
}
.thumbnail img.vertical{width: 100% !important; height: auto !important;}

必要なのは、垂直画像に「vertical」クラスを追加することだけです。次のコードで実行できます。

jQuery(function($) {
    $('img').one('load', function () {
        var $img = $(this);
        var tempImage1 = new Image();
        tempImage1.src = $img.attr('src');
        tempImage1.onload = function() {
            var ratio = tempImage1.width / tempImage1.height;
            if(!isNaN(ratio) && ratio < 1) $img.addClass('vertical');
        }
    }).each(function () {
        if (this.complete) $(this).load();
    });
});

注:「!important」は、imgタグの可能な幅、高さの属性を上書きするために使用されます。

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