이미지를 자동으로 자르고 가운데 맞추는 방법


158

임의의 이미지가 주어지면 이미지 중앙에서 정사각형을 자르고 주어진 정사각형 내에 표시하려고합니다.

이 질문은 다음과 유사합니다. CSS 이미지 크기 조정 및 자른 이미지 표시 하지만 이미지의 크기를 모르므로 설정된 여백을 사용할 수 없습니다.


1
요소가 이미지 태그 여야하거나 배경 이미지 속성이있는 div 일 수 있습니까?
Russ Ferri

템플릿 시스템을 통해 이미지를 설정할 수있는 한 중요하지 않습니다. 추악하지만 인라인 스타일이 효과가 있다고 생각합니다.
Jonathan Ong

답변:


318

한 가지 해결책은 자른 치수에 맞게 크기가 지정된 요소 내에 중심이있는 배경 이미지를 사용하는 것입니다.


기본 예

.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태그를 유지 하므로 이미지를 저장하기 위해 드래그하거나 마우스 오른쪽 버튼을 클릭하는 기능을 잃지 않습니다. 불투명도 트릭 으로 Parker Bennett 에게 감사의 뜻을 전합니다.

.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 이미지 사양 define 명령 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를 채우는 데 사용할 수 있습니다 .
Nick

7
배경 이미지를 사용하는 경우 당신은 배경 사이즈를 추가해야합니다 : 덮개를 제대로 크기로 자른 이미지를 : 참조가 jsfiddle.net/bw6ct
크리스 에릭슨에게

2
나는 nowdays 구글이 때문에, 투명하고 숨겨진 이미지에 대해 알고 있다고 들었다 imgalt개미 title속성이 당신의 SEO에 대한 손실됩니다.
Victor Sergienko

6
웹킷 object-fit: cover;에서는 좀 더 의미가있는 img 태그에서 직접 사용할 수도 있습니다 .
Ben

2
가로 세로 비율을 잃지 않고 사각형을 덮고 필요한 경우 자르기의 원하는 효과를 얻기 위해 object-fit : cover를 사용했습니다.
Daniel Handojo

79

img배경 이미지 방식이 아닌 태그를 사용하여 순수한 CSS 솔루션을 찾고있었습니다 .

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는 "임의 이미지"라고 말 했으므로 이미지가 너비보다 큰 경우에는 미리 알 수 없습니다.
opyate

11
최소 높이 : 100 %; 최소 너비 : 100 %; 높이 대신 : 100 %; 너비 : 자동; img.portrait 클래스가 필요하지 않습니다.
user570605

1
@ user570605 제안과 결합 된 최상의 솔루션
albanx

45

이것을 시도하십시오 : 이미지 자르기 치수를 설정하고 CSS 에서이 선을 사용하십시오 :

object-fit: cover;

3
잘 지원되지 않음 : caniuse.com/#feat=object-fit 편집 : 실제로, 평소와 같이 MS 브라우저 만 실패합니다 ... :
Brian H.

1
이것은 내가 :) 필요 정확히 수행
hcarreras

1
이를 지원하지 않는 유일하게 널리 사용되는 브라우저는 Internet Explorer 11 및 Edge입니다. 청중에 따라 현재 지원 수준은 85-90 % 정도이며 일부 시나리오에서는이 기능을 사용할 수 있습니다.
Husky

왕! 멋진 솔루션 !!
itzhar


23

img태그가 있지만없는 예제background-image

이 솔루션은 img태그를 유지 하므로 이미지를 저장하기 위해 드래그하거나 마우스 오른쪽 버튼을 클릭하는 기능을 잃지 않고 background-imageCSS로 중앙 및 자르기 작업을 수행 할 수 있습니다.

매우 높은 이미지를 제외하고 종횡비를 양호하게 유지하십시오. (링크 확인)

(실제로보기)

마크 업

<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%);
}

이미지를 컨테이너보다 작은 경우 이미지를 가운데에 놓으
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
히야 downvoters. 실수가 있으면 답변을 업데이트 할 수 있도록 의견을 남겨주세요. 허위 정보를 제공하는 것을 좋아하지 않습니다. 건배.
mraaroncruz

downvoter는 아니지만 이것은 각도 질문이 아니며 귀하의 답변은 관련이 없습니다. @pferdefleisch
mawburn

1
@mburn 말이 되네요. 3 년이 지났으며 아마도 지금은 조금 벗어 났거나 눈에 띄지 않습니다. 내 의견에 대한 공감대가 적어도 두 사람이 유용하다고 생각할 수도 있다고 말했기 때문에 (또는 의견이없는 공감대를 좋아하지 않기 때문에) 그것을 남겨 두겠습니다.
mraaroncruz

2

이 시도:

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

있다는 사실을 숙지 width하고 height당신의 DOM 요소 (블록은 같은 요소를 표시 레이아웃이있는 경우에만 작동합니다 div또는 img). 그렇지 않은 경우 (예를 들어 범위) display: block;CSS 규칙에 추가하십시오 . CSS 파일에 액세스 할 수 없으면 요소에 스타일을 인라인으로 놓으십시오.


대부분의 경우이 CSS는 다른 이미지와 함께 반복적으로 사용됩니다. 따라서 배경 이미지를 인라인으로 설정하는 것은 불가피합니다.
랩터

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;}

필요한 것은 수직 이미지에 "수직"클래스를 추가하는 것입니다.이 코드를 사용하면됩니다.

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.