background-size와 같은 것이 있습니까? 이미지 요소에 대해 포함하고 포함합니까?


240

페이지가 많고 배경 그림이 다른 사이트가 있으며 CSS에서 다음과 같이 표시합니다.

body.page-8 {
    background: url("../img/pic.jpg") no-repeat scroll center top #000;
    background-size: cover;
}

그러나 <img>요소를 사용하여 한 페이지에 다른 (전체 화면) 그림을 표시 하고 위의 background-image: cover;속성 과 동일한 속성을 갖기를 원합니다 (CSS에서 이미지를 표시 할 수 없으며 HTML 문서에서 이미지를 표시해야 함).

일반적으로 사용합니다 :

div.mydiv img {
    width: 100%;
}

또는:

div.mydiv img {
    width: auto;
}

사진을 전체적이고 반응 적으로 만듭니다. 그러나 width: 100%화면이 너무 좁아지면 사진이 너무 많이 줄어들고 ( ) 하단 화면에 신체의 배경색이 표시됩니다. 다른 방법 width: auto;은 이미지를 전체 크기로만 만들고 화면 크기에 응답하지 않습니다.

이미지를 표시하는 것과 같은 방법으로 이미지를 표시 할 background-size: cover수 있습니까?


좋은 질문입니다.
wonsuc

답변:


380

솔루션 # 1- 객체 맞춤 속성 ( IE 부족 지원 )

object-fit: cover;img에 설정 하십시오.

body {
  margin: 0;
}
img {
  display: block;
  width: 100vw;
  height: 100vh;
  object-fit: cover;
}
<img src="http://lorempixel.com/1500/1000" />

참조 MDN을 -에 관한 object-fit: cover:

대체 된 컨텐츠는 요소의 전체 컨텐츠 상자를 채우면서 종횡비를 유지하도록 크기가 조정됩니다. 객체의 종횡비가 상자의 종횡비와 일치하지 않으면 객체가 맞게 잘립니다.

또한 이미지에 적용된 것과 배경 이미지에 적용된 것을 비교하는 이 Codepen 데모 를 참조하십시오object-fit: coverbackground-size: cover


해결 방법 # 2-img를 CSS가있는 배경 이미지로 교체

body {
  margin: 0;
}
img {
  position: fixed;
  width: 0;
  height: 0;
  padding: 50vh 50vw;
  background: url(http://lorempixel.com/1500/1000/city/Dummy-Text) no-repeat;
  background-size: cover;
}
<img src="http://placehold.it/1500x1000" />


3
이 의견을 제출할 당시, Object-fit은 아직 Internet Explorer 버전 (Edge)에서도 지원되지 않습니다. 그러나 현재 고려 중이다 .
Mike Kormendy

3
개체 맞춤은 여전히 ​​IE에서 지원되지 않습니다. 프로덕션 사이트에 있으면 IE 사용자에 관심이 있습니다.
Travis Michael Heller

2
또한 IE와 오래된 사파리 # 1 polyfill을 추가 할 수 있습니다 github.com/bfred-it/object-fit-images
발레라 Tumash

1
두 번째 솔루션에주의하십시오. 모바일 브라우저에서 vh에 의존하지 않는 것이 가장 좋습니다
sudokai

1
@RoCk caniuse에서 이와 같은 것을 찾을 수 있습니다 : caniuse.com/#search=background-att :) PS IE는이 기능에 대한 지원을 결코 얻지 못할 것이라고 확신 할 수 있다고 생각합니다. 폴리 필도 없기 때문에 우리는 MS가 Windows에서 IE를 제거하여 "완전히 죽일"때가되기 전까지 JS / CSS 해킹으로 인해 문제가 발생했습니다.
SidOfc

31

실제로 IE8에서도 작동하는 매우 간단한 CSS 솔루션 이 있습니다.

.container {
  position: relative;
  overflow: hidden;
  /* Width and height can be anything. */
  width: 50vw;
  height: 50vh;
}

img {
  position: absolute;
  /* Position the image in the middle of its container. */
  top: -9999px;
  right: -9999px;
  bottom: -9999px;
  left: -9999px;
  margin: auto;
  /* The following values determine the exact image behaviour. */
  /* You can simulate background-size: cover/contain/etc.
     by changing between min/max/standard width/height values.
     These values simulate background-size: cover
  */
  min-width: 100%;
  min-height: 100%;
}
<div class="container">
    <img src="http://placehold.it/200x200" alt="" />
</div>


9
이것은 커버 동작을 복제하지 않지만 대신 src img에서 중앙 섹션을 자릅니다. jsfiddle.net/sjt71j99/4 참조 -첫 번째 img는 자르기이고, 다음은 background-size를 통한 것입니다 : 표지, 즉 우리가 원하는 것, 세 번째는 원래 img입니다. 가로 imgs의 경우 최소 높이 및 최소 너비를 최대 높이로 대체합니다. 100 %; 세로 사용의 경우 최대 너비 : 100 %. 가로 또는 세로로 작동하는 솔루션이 하나 있으면 좋을 것입니다. 어떤 아이디어? 이것이 지금까지 본 최고의 크로스 브라우저 솔루션입니다.
terraling

1
당신 말이 맞아요, 똑같은 일을하지는 못했지만 몇 가지 시도를했지만 실제로 100 % 커버를 복제 할 수없는 것 같습니다. 이미지가 1 차원의 컨테이너보다 작은 한 작동합니다 그러나.
Simon

@ terraling, 나는 그것이 오래된 의견임을 알고 있지만 내 대답을 확인하십시오 . 변환을 사용하여 img를 중앙에 배치합니다.
Thiago Barcala

30

채우려는 컨테이너 요소를 가질 수 있다고 가정하면 이것이 작동하는 것처럼 보이지만 약간의 해킹을 느낍니다. 본질적으로, 나는 min/max-width/height더 큰 영역에서 사용하고 그 영역을 원래 크기로 다시 스케일링합니다.

.container {
  width: 800px;
  height: 300px;
  border: 1px solid black;
  overflow:hidden;
  position:relative;
}
.container.contain img {
  position: absolute;
  left:-10000%; right: -10000%; 
  top: -10000%; bottom: -10000%;
  margin: auto auto;
  max-width: 10%;
  max-height: 10%;
  -webkit-transform:scale(10);
  transform: scale(10);
}
.container.cover img {
  position: absolute;
  left:-10000%; right: -10000%; 
  top: -10000%; bottom: -10000%;
  margin: auto auto;
  min-width: 1000%;
  min-height: 1000%;
  -webkit-transform:scale(0.1);
  transform: scale(0.1);
}
<h1>contain</h1>
  <div class="container contain">
    <img 
       src="https://www.google.de/logos/doodles/2014/european-parliament-election-2014-day-4-5483168891142144-hp.jpg" 
       />
    <!-- 366x200 -->
  </div>
  <h1>cover</h1>
  <div class="container cover">
    <img 
       src="https://www.google.de/logos/doodles/2014/european-parliament-election-2014-day-4-5483168891142144-hp.jpg" 
       />
    <!-- 366x200 -->
  </div>


1
완전히 동의하십시오. 이것은 일반적인 용도로 사용할 수있는 최고의 솔루션입니다.
Varis Vītols

훌륭합니다. 그것은 나를 도왔다. 감사합니다
Raman Nikitsenka

14

커버와 포함을 에뮬레이트하는 간단한 솔루션을 찾았습니다. 순수한 CSS이며 동적 크기의 컨테이너에서 작동하며 이미지 비율을 제한하지 않습니다.

IE 또는 16 이전의 Edge를 지원할 필요가 없으면 객체 맞춤을 사용하는 것이 좋습니다.

배경 크기 : 덮개

.img-container {
  position: relative;
  overflow: hidden;
}

.background-image {
  position: absolute;
  min-width: 1000%;
  min-height: 1000%;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%) scale(0.1);
  z-index: -1;
}
<div class="img-container">
  <img class="background-image" src="https://picsum.photos/1024/768/?random">
  <p style="padding: 20px; color: white; text-shadow: 0 0 10px black">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </p>
</div>

이미지의 자연 크기가 표시되는 크기보다 큰 경우 1000 %가 사용됩니다. 예를 들어 이미지가 500x500이지만 컨테이너가 200x200 인 경우입니다. 이 솔루션을 사용하면 이미지가 최소 너비 / 최소 높이로 인해 2000x2000으로 크기가 조정 된 다음 200x200으로 축소됩니다 (으로 인해 transform: scale(0.1)).

x10 요소는 x100 또는 x1000으로 대체 될 수 있지만 일반적으로 20x20 div에서 2000x2000 이미지를 렌더링하는 것은 바람직하지 않습니다. :)

배경 크기 : 포함

동일한 원칙에 따라이 규칙을 사용하여 에뮬레이션 할 수도 있습니다 background-size: contain.

.img-container {
  position: relative;
  overflow: hidden;
  z-index: 0;
}

.background-image {
  position: absolute;
  max-width: 10%;
  max-height: 10%;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%) scale(10);
  z-index: -1;
}
<div style="background-color: black">
  <div class="img-container">
    <img class="background-image" src="https://picsum.photos/1024/768/?random">
    <p style="padding: 20px; color: white; text-shadow: 0 0 10px black">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
  </div>
</div>


스케일 트릭은 이미 https://stackoverflow.com/a/28771894/2827823에 주어 졌으므로 아직 게시 지점을 볼 수 없으며 transform많은 답변에 있습니다.
Ason

설명을 사용하여 확장하려면 동일한 솔루션으로 2가 필요하지 않으므로 대신 해당 답변을 업데이트하십시오.
Ason

1
귀하의 의견에 감사드립니다 @LGSon. 나는 그 대답을 전에 보지 못했지만 여전히 내 대답이 여기에 가치가 있다고 생각합니다. 접근 방식은 거의 동일하지만 제 의견으로는 광산이 약간 더 깔끔하게 제시됩니다. 여기에있는 다른 많은 대답은 동일한 해결책을 제시하며 모두 불완전합니다 (연결 한 것을 제외하고). 따라서 내 대답이 여기에 없으면 다른 답변도 없어야합니다.
Thiago Barcala

1
Android의 Chrome 모바일 브라우저 (LG G3 및 Samsung S9에서 테스트 됨)에서 이미지가 축소되어 iOS의 Chrome에서는 테스트하지 않았으며 Android의 Firefox 모바일은 올바르게 표시되었습니다.
Jecko

10

아니 , 당신은 그것을 꽤 좋아할 수는 background-size:cover 없지만 ..

이 접근 방식은 아주 가깝습니다. JavaScript를 사용하여 이미지가 가로 또는 세로인지 확인하고 스타일을 적절하게 적용합니다.

JS

 $('.myImages img').load(function(){
        var height = $(this).height();
        var width = $(this).width();
        console.log('widthandheight:',width,height);
        if(width>height){
            $(this).addClass('wide-img');
        }else{
            $(this).addClass('tall-img');
        }
    });

CSS

.tall-img{
    margin-top:-50%;
    width:100%;
}
.wide-img{
    margin-left:-50%;
    height:100%;
}

http://jsfiddle.net/b3PbT/


3

에뮬레이션해야 background-size: contain했지만 object-fit지원 부족으로 사용할 수 없었습니다 . 내 이미지에는 정의 된 크기의 컨테이너가 있었고 결국 나를 위해 일했습니다.

.image-container {
  height: 200px;
  width: 200px;
  overflow: hidden;
  background-color: rebeccapurple;
  border: 1px solid yellow;
  position: relative;
}

.image {
  max-height: 100%;
  max-width: 100%;
  margin: auto;
  position: absolute;
  transform: translate(-50%, -50%);
  top: 50%;
  left: 50%;
}
<!-- wide -->
<div class="image-container">
  <img class="image" src="http://placehold.it/300x100">
</div>

<!-- tall -->
<div class="image-container">
  <img class="image" src="http://placehold.it/100x300">
</div>


min-height: 100%; max-height:100%;background-size : cover;와 동일하게 사용할 수 있습니다 .
Chris Seufert

min-height: 100%; max-height:100%;가로 세로 비율을 유지하지 않으므로 정확히 동등한 것은 아닙니다.
Reedyn

2

설정 시도 모두 min-heightmin-width함께 display:block:

img {
    display:block;
    min-height:100%;
    min-width:100%;
}

( 바이올린 )

이미지의 포함 요소가 position:relative또는 position:absolute인 경우 이미지가 컨테이너를 덮습니다. 그러나 중앙에 있지 않습니다.

이미지가 가로 (설정 margin-left:-50%) 또는 세로 (설정 margin-top:-50%)로 오버플로되는지 여부를 알고 있으면 이미지를 쉽게 가운데에 맞출 수 있습니다 . CSS 미디어 쿼리 (및 일부 수학)를 사용하여이를 파악할 수 있습니다.


2

CSS를 사용하면 시뮬레이션 할 수 있습니다 object-fit: [cover|contain];. 사용 transform하고 [max|min]-[width|height]있습니다. 완벽하지 않습니다. 이미지가 컨테이너보다 넓고 짧은 경우에는 효과가 없습니다.

.img-ctr{
  background: red;/*visible only in contain mode*/
  border: 1px solid black;
  height: 300px;
  width: 600px;
  overflow: hidden;
  position: relative;
  display: block;
}
.img{
  display: block;

  /*contain:*/
  /*max-height: 100%;
  max-width: 100%;*/
  /*--*/

  /*cover (not work for images wider and shorter than the container):*/
  min-height: 100%;
  width: 100%;
  /*--*/

  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<p>Large square:
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x1000"></span>
</p>
<p>Small square:
<span class="img-ctr"><img class="img" src="http://placehold.it/100x100"></span>
</p>
<p>Large landscape:
<span class="img-ctr"><img class="img" src="http://placehold.it/2000x1000"></span>
</p>
<p>Small landscape:
<span class="img-ctr"><img class="img" src="http://placehold.it/200x100"></span>
</p>
<p>Large portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x2000"></span>
</p>
<p>Small portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/100x200"></span>
</p>
<p>Ultra thin portrait:
<span class="img-ctr"><img class="img" src="http://placehold.it/200x1000"></span>
</p>
<p>Ultra wide landscape (images wider and shorter than the container):
<span class="img-ctr"><img class="img" src="http://placehold.it/1000x200"></span>
</p>


2

할 수있는 일은 'style'속성을 사용하여 요소에 배경 이미지를 추가하는 것입니다.이 방법으로 HTML에서 이미지를 계속 호출하지만 여전히 background-size를 사용할 수 있습니다 : cover css behaviour :

HTML :

    <div class="image-div" style="background-image:url(yourimage.jpg)">
    </div>

CSS :

    .image-div{
    background-size: cover;
    }

HTML에 동적으로로드해야하는 요소에 background-size : cover 동작을 추가하는 방법입니다. 그런 다음 background-position : center와 같은 멋진 CSS 클래스를 사용할 수 있습니다. 팔


1
대부분의 관심사 분리, 여기에 몇 가지 다른 것들이 있습니다 : programmers.stackexchange.com/a/271338
Daan

0

IE의 경우 두 번째 줄을 포함해야합니다-너비 : 100 %;

.mydiv img {
    max-width: 100%;
    width: 100%;
}

0

메신저는 '댓글 추가'를 허용하지 않았지만 Eru Penkman이 한 일은 꽤 많은 자리에 있습니다. 배경 커버와 같이 변경하면됩니다.

.tall-img{
    margin-top:-50%;
    width:100%;
}
.wide-img{
    margin-left:-50%;
    height:100%;
}

.wide-img{
    margin-left:-42%;
    height:100%;
}
.tall-img{
    margin-top:-42%;
    width:100%;
}


0

나는 이것이 오래되었다는 것을 알고 있지만, 위에서 본 많은 솔루션은 이미지 / 비디오가 컨테이너에 비해 너무 커서 실제로 배경 크기의 덮개처럼 행동하지 않는 문제가 있습니다. 그러나 나는 이미지와 비디오에서 작동하도록 "유틸리티 클래스"를 만들기로 결정했다. 컨테이너에 .media-cover-wrapper 클래스를 제공하고 미디어 항목 자체에 .media-cover 클래스를 제공하십시오.

그런 다음 jQuery가 있습니다.

function adjustDimensions(item, minW, minH, maxW, maxH) {
  item.css({
  minWidth: minW,
  minHeight: minH,
  maxWidth: maxW,
  maxHeight: maxH
  });
} // end function adjustDimensions

function mediaCoverBounds() {
  var mediaCover = $('.media-cover');

  mediaCover.each(function() {
   adjustDimensions($(this), '', '', '', '');
   var mediaWrapper = $(this).parent();
   var mediaWrapperWidth = mediaWrapper.width();
   var mediaWrapperHeight = mediaWrapper.height();
   var mediaCoverWidth = $(this).width();
   var mediaCoverHeight = $(this).height();
   var maxCoverWidth;
   var maxCoverHeight;

   if (mediaCoverWidth > mediaWrapperWidth && mediaCoverHeight > mediaWrapperHeight) {

     if (mediaWrapperHeight/mediaWrapperWidth > mediaCoverHeight/mediaCoverWidth) {
       maxCoverWidth = '';
       maxCoverHeight = '100%';
     } else {
       maxCoverWidth = '100%';
       maxCoverHeight = '';
     } // end if

     adjustDimensions($(this), '', '', maxCoverWidth, maxCoverHeight);
   } else {
     adjustDimensions($(this), '100%', '100%', '', '');
   } // end if
 }); // end mediaCover.each
} // end function mediaCoverBounds

전화를 걸 때 페이지 크기를 조정해야합니다.

mediaCoverBounds();

$(window).on('resize', function(){
  mediaCoverBounds();
});

그런 다음 다음 CSS :

.media-cover-wrapper {
  position: relative;
  overflow: hidden;
}

.media-cover-wrapper .media-cover {
  position: absolute;
  z-index: -1;
  top: 50%;
  left: 50%;
  -ms-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
}

예, jQuery가 필요할 수 있지만 꽤 잘 응답하고 background-size : cover와 똑같이 작동하며 이미지 및 / 또는 비디오에서이를 사용하여 추가 SEO 가치를 얻을 수 있습니다.


0

ZOOM 접근을 할 수 있습니다. 가로 세로 이미지 높이 또는 너비가 원하는 높이 또는 너비보다 작 으면 최대 30 % (또는 최대 100 %)가 확대 / 축소 효과가 될 수 있다고 가정 할 수 있습니다. overflow : hidden으로 필요하지 않은 나머지 영역을 숨길 수 있습니다.

.image-container {
  width: 200px;
  height: 150px;
  overflow: hidden;
}
.stage-image-gallery a img {
  max-height: 130%;
  max-width: 130%;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translateX(-50%) translateY(-50%);
}

너비 나 높이가 다른 이미지를 조정합니다.


-1
background:url('/image/url/') right top scroll; 
background-size: auto 100%; 
min-height:100%;

동일한 정확한 증상이 발생했습니다. 위의 나를 위해 일했다.

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