CSS로 사각형 이미지를 사각형으로“자르는”방법은 무엇입니까?


170

CSS로 이미지를 실제로 수정하는 것은 불가능하다는 것을 알고 있으므로 자르기를 따옴표로 묶습니다.

내가하고 싶은 것은 직사각형 이미지를 가져 와서 CSS를 사용하여 이미지를 전혀 왜곡하지 않고 사각형으로 보이게하는 것입니다.

기본적으로 이것을 돌리고 싶습니다.

여기에 이미지 설명을 입력하십시오

이것으로 :

여기에 이미지 설명을 입력하십시오


4
이 이미지가 div의 배경 이미지입니까, SEO에서 <img> 태그로 유지해야합니까?
Michael

2
아직 아무것도 시도하지 않았습니까? 이것은 CSS3 background-position또는 overflow:hidden상대 위치가있는 이미지와 이미지가 있는 오래된 래퍼 div에서 다소 간단합니다 .
Fabrício Matté

그들은 확실히 배경 이미지가 될 수 있습니다
novicePrgrmr

내 대답을 참조하십시오. 이것이 귀하의 전반적인 최선의 선택이라고 생각합니다. 위치 요소를 피합니다.
Michael

답변:


78

그들이 IMG 태그에있을 필요가 없다고 가정하면 ...

HTML :

<div class="thumb1">
</div>

CSS :

.thumb1 { 
  background: url(blah.jpg) 50% 50% no-repeat; /* 50% 50% centers image in div */
  width: 250px;
  height: 250px;
}

.thumb1:hover { YOUR HOVER STYLES HERE }

편집 : div를 어딘가에 연결 해야하는 경우 HTML과 스타일을 다음과 같이 조정하십시오.

HTML :

<div class="thumb1">
<a href="#">Link</a>
</div>

CSS :

.thumb1 { 
  background: url(blah.jpg) 50% 50% no-repeat; /* 50% 50% centers image in div */
  width: 250px;
  height: 250px;
}

.thumb1 a {
  display: block;
  width: 250px;
  height: 250px;
}

.thumb1 a:hover { YOUR HOVER STYLES HERE }

예를 들어 % 너비 및 높이 등과 같이 반응 형으로 수정 될 수도 있습니다.


1
이것은 하나의 태그로 위치를 지정하고 자르는 좋은 방법입니다.
rlemon

8
인쇄 할 때 마스트 브라우저는 배경 이미지를 비활성화하여 표시되지 않습니다.
j08691

호버 상태도 처리 할 수 ​​있습니다. div를 어딘가에 연결 해야하는 경우 태그를 추가하십시오. 인쇄에 관해서는 print.css로 고칠 수 있습니까? 틀 렸으면 말해줘?
Michael

사실, 솔직히 말하면,이 경우 A 태그를 사용하면 인쇄물이 대체되고 어쨌든 CSS 스타일을 추가하여 인쇄를 위해이 문제를 해결하려고합니다.
Michael

1
신경 height: 460px; width: 100%;
쓰지

417

래퍼 div나 다른 쓸모없는 코드가없는 순수한 CSS 솔루션 :

img {
  object-fit: cover;
  width:230px;
  height:230px;
}

12
불행히도 IE 및 Edge atm에서는 작동하지 않습니다. 이에 대한 자세한 내용은 여기를 참조하십시오 : stackoverflow.com/a/37792830/1398056
baoutch

2
무엇을 우리가 자동 폭 광장을 만들고 싶어 높이 몰라입니다
아 라빈 드 레디

3
2018 년 6 월 현재 IE11 (2.71 %) 만 객체 적합을 지원하지 않는 것 같습니다.
Ray

1
2019 년에는 지원이 꽤 좋습니다. 여전히 2.3 %만이 IE 11을 사용하고 있습니다.이 솔루션은 너무 쉬워서 다른 솔루션은 백엔드 코드를 사용하기 위해 많은 시간을 낭비했기 때문에 도움이 될 수는 없습니다.
Paul Morris

3
IE에 대해 잊어 버릴 시간입니다
iji

55
  1. div에 이미지를 배치하십시오.
  2. div에 정사각형 치수를 지정하십시오.
  3. div의 CSS overflow 속성을 hidden ( overflow:hidden)으로 설정하십시오.
  4. 당신의 상상력을 div 안에 넣으십시오.
  5. 이익.

예를 들면 다음과 같습니다.

<div style="width:200px;height:200px;overflow:hidden">
    <img src="foo.png" />
</div>

5
안에 이미지의 위치를 ​​중앙에 두거나 최소한으로 재생해야합니다. OP 샘플은 중심에 나타납니다 (단지 언급하고 답변을 전혀 변경하지 않을 것으로 기대하지만 : P).
rlemon

1
@rlemon-OP는 div의 위치를 ​​relative로 설정하고 이미지의 위치를 ​​절대로 설정하고 top 및 left 속성을 조정할 수 있습니다.
j08691

6
나는 누군가가되기 전에 그것을 언급하고 있습니다. "하지만 이제 모든 것이 정렬되었습니다!" -: P
rlemon

1
그렇습니다. 그것은 중심에 두는 것이 중요합니다.
초보자 Prgrmr

32

background-size : cover 사용 -http : //codepen.io/anon/pen/RNyKzB

CSS :

.image-container {
  background-image: url('http://i.stack.imgur.com/GA6bB.png');
  background-size:cover;
  background-repeat:no-repeat;
  width:250px;
  height:250px;
}  

마크 업 :

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

1
mtronics 답변의 중심 기능을 결합하면 IE9에서도 잘 작동합니다.
Faker

14

실제로 최근 에이 같은 문제가 발생하여 약간 다른 접근법으로 끝났습니다 (배경 이미지를 사용할 수 없었습니다). 이미지의 방향을 결정하기 위해 약간의 jQuery가 필요합니다 (하지만 대신 일반 JS를 사용할 수 있다고 확신합니다).

더 많은 설명에 관심이 있지만 코드가 매우 간단하다면 블로그 게시물을 작성했습니다 .

HTML :

<ul class="cropped-images">
  <li><img src="http://fredparke.com/sites/default/files/cat-portrait.jpg" /></li>
  <li><img src="http://fredparke.com/sites/default/files/cat-landscape.jpg" /></li>
</ul>

CSS :

li {
  width: 150px; // Or whatever you want.
  height: 150px; // Or whatever you want.
  overflow: hidden;
  margin: 10px;
  display: inline-block;
  vertical-align: top;
}
li img {
  max-width: 100%;
  height: auto;
  width: auto;
}
li img.landscape {
  max-width: none;
  max-height: 100%;
}

jQuery :

$( document ).ready(function() {

    $('.cropped-images img').each(function() {
      if ($(this).width() > $(this).height()) {
        $(this).addClass('landscape');        
      }
    });

});

이미지가 "스타일"이 아닌 콘텐츠이므로 HTML 레이어에 보관해야하기 때문에 이것이 CSS 배경 대안보다 우수하다고 생각합니다. 또한 HTML 대신 CSS에 포함 시키면 웹 페이지의 SEO에 영향을 미칩니다. 감사!
Jose Florido

이것을 개선하는 좋은 아이디어 $(this).load(function(){...는 각 루프 내부 에 추가 하는 것이므로 jQuery는 이미지가로드되고 실제 이미지 크기를 얻을 때까지 조금 기다립니다.
Jose Florido

14

이미지가 반응 너비 가있는 컨테이너에있는 경우 :

HTML

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

CSS

.img-container {
  position: relative;

  &::after {
    content: "";
    display: block;
    padding-bottom: 100%;
  }

  img {
    position: absolute;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
}

정말 좋습니다. 이미지가 정사각형이되면 원을 그리며 다른 멋진 작업을 수행 할 수 있기 때문에 매우 유연합니다.
Rocky Kev

3

비슷한 문제가 발생하여 배경 이미지가 "손상되지"않았습니다. 나는 이것을 생각해 냈습니다.

<div class="container">
    <img src="http://lorempixel.com/800x600/nature">
</div>

.container {
    position: relative;
    width: 25%; /* whatever width you want. I was implementing this in a 4 tile grid pattern. I used javascript to set height equal to width */
    border: 2px solid #fff; /* just to separate the images */
    overflow: hidden; /* "crop" the image */
    background: #000; /* incase the image is wider than tall/taller than wide */
}

.container img {
    position: absolute;
    display: block;
    height: 100%; /* all images at least fill the height */
    top: 50%; /* top, left, transform trick to vertically and horizontally center image */
    left: 50%;
    transform: translate3d(-50%,-50%,0);
}

//assuming you're using jQuery
var h = $('.container').outerWidth();
$('.container').css({height: h + 'px'});

도움이 되었기를 바랍니다!

예 : https://jsfiddle.net/cfbuwxmr/1/



1

.testimg 클래스 안에 이미지가있는 정사각형 크기의 div를 사용하십시오.

.test {
width: 307px;
height: 307px;
overflow:hidden
}

.testimg {
    margin-left: -76px

}

또는 이미지의 배경이있는 정사각형 div.

.test2 {
width: 307px;
height: 307px;
    background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}

몇 가지 예는 다음과 같습니다. http://jsfiddle.net/QqCLC/1/

이미지 센터 업데이트

.test {
  width: 307px;
  height: 307px;
  overflow: hidden
}

.testimg {
  margin-left: -76px
}

.test2 {
  width: 307px;
  height: 307px;
  background: url(http://i.stack.imgur.com/GA6bB.png) 50% 50%
}
<div class="test"><img src="http://i.stack.imgur.com/GA6bB.png" width="460" height="307" class="testimg" /></div>

<div class="test2"></div>


0

object-fit: cover 필요한 것을 정확하게 수행합니다.

그러나 IE / Edge에서는 작동하지 않을 수 있습니다. 모든 브라우저 에서 작동하도록 CSS 로 수정하려면 아래 표시된대로 수행하십시오. .

내가 취한 접근법은 이미지를 컨테이너 내부에 절대 위치배치 한 다음 조합을 사용하여 중앙에 배치 하는 것입니다.

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

중앙에 있으면 이미지를 제공합니다.

// For vertical blocks (i.e., where height is greater than width)
height: 100%;
width: auto;

// For Horizontal blocks (i.e., where width is greater than height)
height: auto;
width: 100%;

이것은 이미지가 Object-fit : cover의 효과를 얻도록합니다.


위의 논리에 대한 데모입니다.

https://jsfiddle.net/furqan_694/s3xLe1gp/

이 논리는 모든 브라우저에서 작동합니다.


원본 이미지
원본 이미지

세로 자르기
세로 자른 이미지

가로 자르기
가로로 자른 이미지


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.