이미지의 종횡비를 유지하면서 <div>를 채우기 위해 이미지를 어떻게 늘립니까?


201

이 이미지를 넘치 <div>거나 이미지를 기울이지 않고 가능한 최대 크기로 늘려야합니다.

이미지의 종횡비를 예측할 수 없으므로 사용할지 여부를 알 수있는 방법이 없습니다.

<img src="url" style="width: 100%;">

또는

<img src="url" style="height: 100%;">

style = "width : 100 %; height : 100 %;")를 모두 사용할 수 없으므로 이미지에 맞게 이미지가 늘어나 기 때문입니다 <div>.

<div>화면 크기에 따라 크기가 설정되어 있으며 예측할 수 없습니다.


2
이미지를 높이 또는 너비를 div의 해당 치수로 채우려면 javascript 만 사용할 수 있습니다. 그게 당신이 탐구하고 싶어하는 것입니까?
okw December

답변:


189

2016 업데이트 :

최신 브라우저는 훨씬 더 잘 작동합니다. 이미지 너비를 100 % ( 데모 ) 로 설정하기 만하면 됩니다.

.container img {
   width: 100%;
}

종횡비를 모르기 때문에 일부 스크립팅을 사용해야합니다. 다음은 jQuery ( demo )로 수행하는 방법입니다 .

CSS

.container {
    width: 40%;
    height: 40%;
    background: #444;
    margin: 0 auto;
}
.container img.wide {
    max-width: 100%;
    max-height: 100%;
    height: auto;
}
.container img.tall {
    max-height: 100%;
    max-width: 100%;
    width: auto;
}​

HTML

<div class="container">
 <img src="http://i48.tinypic.com/wrltuc.jpg" />
</div>
<br />
<br />
<div class="container">
 <img src="http://i47.tinypic.com/i1bek8.jpg" />
</div>

스크립트

$(window).load(function(){
 $('.container').find('img').each(function(){
  var imgClass = (this.width/this.height > 1) ? 'wide' : 'tall';
  $(this).addClass(imgClass);
 })
})

크기를 조정하기 전에 이미지를 볼 수 있습니까? 아무도 이것을 테스트 했습니까?
RayLoveless

해결책은 거의 옳습니다 .CSS의 높이와 너비를 뒤집어 야합니다. 이미지가 '높은'경우 너비가 높이가 아닌 100 %가되어야합니다 (각각 더 크고 넘칠 것입니다). 넓은 사진을위한 다른 방법.
mbritto

@ mbritto : 당신 말이 맞아요, CSS를 최대 너비 / 높이로 변경하고 데모를
Mottie

@Mottie는 이미지 품질을 잃지 않고 크기 930px의 이미지를 960px의 컨테이너에 맞추는 방법이 있습니다
Vivek Dragon

15
이것이 왜 받아 들여 지는가? 문제는 이미지가 컨테이너에 비해 너무 작다는 것입니다. 즉, 이미지의 가로 세로 비율을 높이 지 않고 이미지를 컨테이너의 너비 나 높이에 맞게 확대 할 수 있습니다. 또한 데모에서 width:auto또는 height:auto속성을 제거해도 이미지 표시에 영향을 미치지 않습니다. 실제로 이미지에 적용하는 모든 속성 max-width: 100%중 효과는 전혀 없으며 풍경 이미지에만 영향을 미칩니다. 그러나 가장 중요한 것은 귀하의 답변이 작은 이미지를 늘려 큰 컨테이너를 채우는 데 도움이되지 않습니다.
matty

78

CSSand 만 사용 하여이 작업을 수행하는 훨씬 쉬운 방법이 있습니다 HTML.

HTML :

<div class="fill"></div>

CSS :

.fill {
    overflow: hidden;
    background-size: cover;
    background-position: center;
    background-image: url('path/to/image.jpg');
}

이미지를 배경으로 배치하고 div왜곡없이 크기 에 맞게 이미지를 늘립니다 .


정의되지 않은 수의 이미지로 가능합니까?
TrtG

background-size: cover;여기에 진정한 마법이자 CSS3이지만 최신 버전에서 합리적인 브라우저 지원을 제공합니다 ( w3schools.com/cssref/css3_pr_background-size.asp 참조 )
Jon Kloske

1
스타일과 내용을 분리하기 위해 HTML에 이미지 URL을 포함시키는 것이 <div style="background-image: url('path/to/image.jpg');" class="fill"></div>
좋습니다.

background-size: cover 가로 세로 비율을 유지 하지 않으면 요소에 비례하지 않는 이미지 부분이 잘립니다. 여기를
Alex_Zhong

@Alex_Zhong, 종횡비를 오해합니다. 종횡비는 이미지가 어떤 방향으로도 늘어나지 않음을 의미합니다 (따라서 완벽한 원은 너비 나 높이에서 타원형이되지 않습니다). 자르기는 종횡비를 유지하는 데 필요한 부분 일 수 있습니다 (OP 사용 사례와 동일).
Jeremy Moritz

70

완벽한 솔루션은 아니지만이 CSS가 도움이 될 수 있습니다. 줌은이 코드를 작동시키는 원인이며, 이론적으로 작은 이미지에 이상적으로 작동하려면 요소가 무한해야합니다. 그러나 대부분의 경우 2, 4 또는 8이 잘 작동합니다.

#myImage {
    zoom: 2;  //increase if you have very small images

    display: block;
    margin: auto;

    height: auto;
    max-height: 100%;

    width: auto;
    max-width: 100%;
}

1
이것이 Firefox에서 작동하기를 바랍니다. 왜 zoomFirefox를 좋아하지 않습니까!?
matty

1
Firefox는 아직 zoom구현 되지 않았지만 다음은 나중에 참조 할 수있는 버그 링크입니다. bugzilla.mozilla.org/show_bug.cgi?id=390936
Adam Taylor

31

가능하면 배경 이미지를 사용하고을 설정하십시오 background-size: cover. 그러면 배경이 전체 요소를 덮게됩니다.

CSS

div {
  background-image: url(path/to/your/image.png);
  background-repeat: no-repeat;
  background-position: 50% 50%;
  background-size: cover;
}

인라인 이미지를 사용하는 데 어려움이 있다면 몇 가지 옵션이 있습니다. 먼저

객체 적합

이 속성은 이미지, 비디오 및와 유사한 다른 개체에 적용됩니다 background-size: cover.

CSS

img {
  object-fit: cover;
}

슬프게도 브라우저 지원 은 IE 11 버전까지는 전혀 지원하지 않습니다. 다음 옵션은 jQuery를 사용합니다.

CSS + jQuery

HTML

<div>
  <img src="image.png" class="cover-image">
</div>

CSS

div {
  height: 8em;
  width: 15em;
}

커스텀 jQuery 플러그인

(function ($) {
  $.fn.coverImage = function(contain) {
    this.each(function() {
      var $this = $(this),
        src = $this.get(0).src,
        $wrapper = $this.parent();

      if (contain) {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/contain no-repeat'
        });
      } else {
        $wrapper.css({
          'background': 'url(' + src + ') 50% 50%/cover no-repeat'
        });
      }

      $this.remove();
    });

    return this;
  };
})(jQuery);

이 플러그인을 사용하십시오

jQuery('.cover-image').coverImage();

이미지를 가져 와서 이미지의 래퍼 요소에 배경 이미지로 설정 img하고 문서 에서 태그를 제거합니다 . 마지막으로 당신은 사용할 수 있습니다

순수한 CSS

이를 폴백으로 사용할 수 있습니다. 이미지는 컨테이너를 덮도록 확대되지만 축소되지는 않습니다.

CSS

div {
  height: 8em;
  width: 15em;
  overflow: hidden;
}

div img {
  min-height: 100%;
  min-width: 100%;
  width: auto;
  height: auto;
  max-width: none;
  max-height: none;
  display: block;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

이것이 행복한 코딩을 도울 수 있기를 바랍니다!


배경 이미지 및 배경 크기를 사용하지 않고 이미지가 주어진 컨테이너채우 도록 순수한 CSS 솔루션을 찾고 있었고 CSS 코드는> = IE9 및 최신 브라우저에서 훌륭하게 작동합니다. CodePen 데모보기
FLOQ Design

에서 순수 CSS , 나는 제거 min-및 변화에 대한 width: 100%; height: 100%;작업! 멋진 솔루션! +1 감사합니다!
Guilherme Nascimento

1
background-size: contain이미지를 클리핑하지 않으려는 경우에도 유용합니다.
Ponkadoodle

zoom:0.001Pure CSS 솔루션에 추가 하여 축소 할 수 있습니다 .
Ivor Zhou


12

2019 년 업데이트

이제 object-fit다음 값을 허용하는 css 특성을 사용할 수 있습니다 .fill | contain | cover | none | scale-down

https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

예를 들어 이미지가 들어있는 컨테이너가있을 수 있습니다.

<div class="container">
    <img src="" class="container_img" />
</div>

.container {
    height: 50px;
    width: 50%;

.container_img {
    height: 100%;
    width: 100%;
    object-fit: cover;

7

HTML과 CSS만으로는 불가능하거나 최소한 이국적이고 복잡합니다. 자바 스크립트를 기꺼이 던져 넣으려면 jQuery를 사용하는 솔루션이 있습니다.

$(function() {
    $(window).resize(function() {
        var $i = $('img#image_to_resize');
        var $c = $img.parent();
        var i_ar = $i.width() / $i.height(), c_ar = $c.width() / $c.height();            
        $i.width(i_ar > c_ar ? $c.width() : $c.height() * (i_ar));
    });
    $(window).resize();
});

크기에 관계없이 항상 부모 요소 안에 맞도록 이미지 크기가 조정됩니다. 그리고 $(window).resize()이벤트에 바인딩 되면 사용자가 창 크기를 조정하면 이미지가 조정됩니다.

이것은 컨테이너의 이미지를 중앙에 배치하려고 시도하지는 않지만 가능할 것입니다.


4
나는 $ img.parent (); 정말로 $ i.parent () 여야합니다.
Jimbo Jonny

5

외부 containerdiv 의 너비와 높이를 설정하십시오 . 그런 다음 img에서 아래 스타일을 사용하십시오.

.container img{
    width:100%;
    height:auto;
    max-height:100%;
}

이것은 img의 가로 세로 비율을 유지하는 데 도움이됩니다


6
div를 채우지 않습니다.
스벤 반 덴 부가 르트

5

이미지의 가로 세로 비율을 유지하면서 최대 너비 또는 높이를 설정하려면 (너무 크지 않도록) 다음과 같이하십시오.

img{
   object-fit: contain;
   max-height: 70px;
}

4

나는이 문제를 발견하여 단순한 문제를 찾고있었습니다. 반응 형 디자인의 웹 페이지를 만들고 있는데 페이지에 배치 된 요소의 너비가 화면 너비의 백분율로 설정되어 있습니다. 높이는 vw 값으로 설정됩니다.

PHP와 데이터베이스 백엔드로 게시물을 추가하고 있기 때문에 순수 CSS는 문제가되지 않았습니다. 그러나 jQuery / javascript 솔루션이 약간 까다 롭다는 것을 알았으므로 깔끔한 솔루션을 생각해 냈습니다.

HTML (또는 PHP)

div.imgfill {
  float: left;
  position: relative;
  background-repeat: no-repeat;
  background-position: 50%  50%;
  background-size: cover;
  width: 33.333%;
  height: 18vw;
  border: 1px solid black; /*frame of the image*/
  margin: -1px;
}
<div class="imgfill" style="background-image:url(source/image.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image2.jpg);">
  This might be some info
</div>
<div class="imgfill" style="background-image:url(source/image3.jpg);">
  This might be some info
</div>

style = ""을 사용하면 PHP가 내 페이지를 동적으로 업데이트 할 수 있으며 style = ""과 함께 CSS 스타일링은 동적으로 div 태그를 포함하도록 확장 된 이미지로 완성됩니다.



4

이 이미지 를 넘치 거나 왜곡 시키지 않고 가능한 최대 크기까지 늘릴 수 있습니다.

대다...

img {
  object-fit: cover;
  height: -webkit-fill-available;
}

이미지 스타일.


3

이 방법을 사용하면 div와 이미지의 이미지 변화 비율로 div를 채울 수 있습니다.

jQuery :

$(window).load(function(){
   $('body').find(.fillme).each(function(){
      var fillmeval = $(this).width()/$(this).height();
      var imgval = $this.children('img').width()/$this.children('img').height();
      var imgClass;
      if(imgval > fillmeval){
          imgClass = "stretchy";
      }else{
          imgClass = "stretchx";
      }
      $(this).children('img').addClass(imgClass);
   });
});

HTML :

<div class="fillme">
   <img src="../images/myimg.jpg" />
</div>

CSS :

.fillme{
  overflow:hidden;
}
.fillme img.stretchx{
  height:auto;
  width:100%;
}
.fillme img.stretchy{
  height:100%;
  width:auto;
}

3

이것은 나를 위해 속임수를했다

div img {
    width: 100%;
    min-height: 500px;
    width: 100vw;
    height: 100vh;
    object-fit: cover;
}

2

IMG 태그를 사용하면 쉽습니다.

내가 이걸 만들었 어:

<style>
        #pic{
            height: 400px;
            width: 400px;
        }
        #pic img{
            height: 225px;               
            position: relative;
            margin: 0 auto;
        }
</style>

<div id="pic"><img src="images/menu.png"></div>

$(document).ready(function(){
            $('#pic img').attr({ 'style':'height:25%; display:none; left:100px; top:100px;' })
)}

하지만 #pic {background : url (img / menu.png)} Enyone으로 작동시키는 방법을 찾지 못했습니다. 감사


변경하고 내 문제에 대한 답변을 찾았습니다! 아니 누군가에게 도움이 될 것입니다. 배경 이미지 : url (images / menu.png); 배경 반복 : 반복 없음; 위치 : 절대; 배경 크기 : 300px; 높이 : 100 %; 폭 : 100 %; javascript 또는 jquery를 사용하여 background-size 값을 변경할 수 있습니다 (.attr ({ 'style': 'background-size : 150px auto; left : 50px; top : 50px;'}))
aleXela

2

비슷한 문제가있었습니다. CSS로 해결했습니다 .

기본적으로 Object-fit: coverdiv 안에 이미지를 배치하면서 종횡비를 유지하는 작업을 수행하는 데 도움이됩니다.

그러나 문제는 Object-fit: coverIE에서 작동하지 않았으며 100 % 너비와 100 % 높이를 취하고 가로 세로 비율이 왜곡되었습니다. 즉, 크롬에서 보았던 이미지 확대 / 축소 효과가 없었습니다.

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

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/

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


1

HTML :

<style>
#foo, #bar{
    width: 50px; /* use any width or height */
    height: 50px;
    background-position: center center;
    background-repeat: no-repeat;
    background-size: cover;
}
</style>

<div id="foo" style="background-image: url('path/to/image1.png');">
<div id="bar" style="background-image: url('path/to/image2.png');">

JSFiddle

... 그리고 이미지를 설정하거나 변경하려면 (#foo를 예로 사용하십시오) :

jQuery :

$("#foo").css("background-image", "url('path/to/image.png')");

자바 스크립트 :

document.getElementById("foo").style.backgroundImage = "url('path/to/image.png')";

1

여기에있는 많은 솔루션에는 몇 가지 제한 사항이 있습니다. 일부는 IE (object-fit) 또는 구형 브라우저에서 작동하지 않으며, 다른 솔루션은 이미지를 확장하지 않고 (축소 만), 많은 솔루션은 창 크기 조정을 지원하지 않으며 많은 것은 일반적이 아닌 수정 해상도 또는 레이아웃 (세로 또는 가로)

자바 스크립트와 jquery를 사용하는 것이 문제가되지 않으면 @Tatu Ulmanen 코드를 기반으로 한이 솔루션이 있습니다. 일부 문제를 수정하고 이미지가 동적으로로드되고 처음에는 사용할 수없는 경우를 대비하여 코드를 추가했습니다. 기본적으로 아이디어는 두 개의 서로 다른 CSS 규칙을 가지고 필요할 때 적용하는 것입니다. 하나는 제한이 높이 일 때 측면에 검은 막대를 표시해야하고 다른 하나는 제한이 너비 일 때 CSS 규칙을 표시해야하므로 제한해야합니다. 상단 / 하단에 검은 색 막대가 표시됩니다.

function applyResizeCSS(){
    var $i = $('img#imageToResize');
    var $c = $i.parent();
    var i_ar = Oriwidth / Oriheight, c_ar = $c.width() / $c.height();  
    if(i_ar > c_ar){
        $i.css( "width","100%");
        $i.css( "height","auto");          
    }else{
        $i.css( "height","100%");
        $i.css( "width","auto");
    }
}   
var Oriwidth,Oriheight;
$(function() {
    $(window).resize(function() {
        applyResizeCSS();
    });

    $("#slide").load(function(){
        Oriwidth  = this.width,
        Oriheight = this.height; 
        applyResizeCSS();
    }); 

    $(window).resize();
}); 

다음과 같은 HTML 요소의 경우 :

<img src="images/loading.gif" name="imageToResize" id="imageToResize"/> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.