CSS 배경 이미지에 해당하는 srcset이 있습니까?


89

imgsrcset반응 이미지를하는 좋은 방법 같은 속성 보인다. CSS background-image속성 에서 작동하는 동등한 구문이 있습니까?

HTML

<img src="small.jpg" srcset="medium.jpg 1000w, large.jpg 2000w" alt="yah">

CSS

.mycontainer {
    background: url(?something goes here?);
}

답변:


81

image-set동등한 CSS 기능입니다. 사양에 상응하는 srcset 기능 (크기에 따라 리소스 정의)을 추가해야합니다.

현재는 -webkit-접두사가 있는 Safari, Chrome 및 Opera에서만 구현되며 x설명 자만 지원합니다 .


1
우아한 대체가 알려져 있거나 이것을 지원하는 polyfill이 있습니까?
Rachel Cantor

5
@RachelCantor 대체가 필요합니까? 어쨌든 현대 장치에만 망막 화면이있을 것입니다.
James Kemp

3
x설명 자만 지원하는 것은 무의미 해 보입니다. 즉, 배경 이미지는 2x '레티 나'데스크톱 (5120w)에서 전체 너비가 될 수 있으며, 모바일에서는 2x (720w)로 모든 모바일 장치에서 웹 페이지로 간주 할 수있는 터무니없는 크기의 이미지입니다. 배경. 최대 너비 미디어 쿼리를 사용하여 몇 가지 다른 크기를 제공하는 것도 도움이되지 않습니다. 배경 컨테이너의 최대 너비가 아니라 화면의 최대 너비이기 때문입니다.
Chris Seufert 2016

1
그래서 브라우저가 이미지 세트를 지원하지 않는다면 대체 무엇입니까?
O.MeeKoh

22

확실히 :

background: -webkit-image-set( url('path/to/image') 1x, url('path/to/high-res-image') 2x );

같은 방식으로 작동합니다. 브라우저는 이미지를 검사하여 가장 적합한 이미지를 확인하고 해당 이미지를 사용합니다.


2
2018 년에도 모든 브라우저에서 지원되지는 않습니다. caniuse.com/#search=image-set
BadHorsie

14

솔직히 더 강력한 또 다른 접근 방식은 배경 이미지의 특성과 옵션을 srcset 속성이있는 이미지에 적용하는 것입니다.

이렇게하려면 이미지를 너비로 설정합니다. 100 %; 높이 : 100 %; 및 개체 맞춤 : 덮거나 포함합니다.

다음은 그 예입니다.

.pseudo-background-img-container {
  position: relative;
  width:400px;
  height: 200px;
}
.pseudo-background-img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
<div class="pseudo-background-img-container">

<img class="pseudo-background-img" src="https://cdn3.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep.jpg" srcset="https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep.jpg 640w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-280x175.jpg 280w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-432x270.jpg 432w, https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2016/12/Keep-216x135.jpg 216w" sizes="(max-width: 640px) 100vw, 640px">

</div>

이것은 모든 사람에게 최선의 방법은 아니지만 자바 스크립트 해결 방법 없이도 원하는 결과를 얻을 수 있다고 생각합니다.


1
src-set은 이미지 너비를 고려하지 않고 object-fit : cover의 컨테이너 너비 만 고려합니다. 즉, img 태그가 너비가 50px이지만 높이가 1000px이면 50px 너비를 충족하는 이미지가로드되고 확장되어 너비가 240w에서 1500px로 조정되어 50px 슬라이스 만 표시됩니다.
Chris Seufert 2018

10

polyfill의 경우 올바른 이미지 크기를 다운로드하기위한 메커니즘으로 srcset와 함께 img를 사용한 다음 JS를 사용하여이를 숨기고 상위 요소의 배경 이미지를 설정할 수 있습니다.

여기 바이올린이 있습니다 : http://jsbin.com/garetikubu/edit?html,output

onloadJS를 차단 스크립트로 사용 하고 넣는 <head>것이 중요합니다. 나중에 스크립트를 넣으면 (예 <body>:) 브라우저에서 img.currentSrc가 아직 설정되지 않은 경쟁 조건을 얻을 수 있습니다. 로드 될 때까지 기다리는 것이 가장 좋습니다.

이 예제에서는 다운로드중인 원본 이미지를 볼 수 있습니다. CSS로 쉽게 숨길 수 있습니다.


흥미 롭군. 이 작업을 수행 할 때 이미지가 두 번로드 될 것으로 예상했을 것입니다. 그러나 보이지 않습니다.
Perry

8

목적에 맞게 미디어 쿼리를 사용할 수 있습니다. 다음과 같이 쉽습니다.

.mycontainer {    
    background-image:url("img/image-big.jpg"); // big image   
}

@media(max-width: 768px){
   .mycontainer {
        background-image:url("img/image-sm.jpg"); // small image  
    }
}

그리고 미디어 쿼리를 지원하는 모든 브라우저에서 작동한다고 생각합니다.)


2
이미지가 컨테이너를 덮도록 설정되어 있으면 높이에 맞게 이미지가 늘어나는 것을 고려하지 않습니다. 상자는 기본 이미지 너비의 높이의 2 ~ 3 배가 될 수 있으므로 품질이 매우 나빠 보입니다.
Chris Seufert

3

<picture>요소를 사용한 유사한 솔루션 : 여기 튜토리얼

튜토리얼 사례 :

더 작은 화면 크기에 동일한 이미지를 사용하면 이미지의 주 피사체가 너무 작아 질 수 있습니다. 다른 화면 크기에 다른 이미지 (주 피사체에 더 초점을 맞춘)를 표시하고 싶지만 여전히 장치 픽셀 비율에 따라 동일한 이미지의 개별 자산을 표시하고 싶습니다. 뷰포트를 기반으로 한 이미지.

예제 코드 :

<picture>

<source media="(max-width: 20em)" srcset="images/small/space-needle.jpg 1x,
images/small/space-needle-2x.jpg 2x, images/small/space-needle-hd.jpg 3x">

<source media="(max-width: 40em)" srcset="images/medium/space-needle.jpg 1x,
images/medium/space-needle-2x.jpg 2x, images/medium/space-needle-hd.jpg 3x">

<img src="space-needle.jpg" alt="Space Needle">

</picture>

'<picture>'요소를 '절대'또는 '고정'으로 배치합니다. 정확한 집합 Z 색인 + 포지션 : 컨테이너에 대한 상대가 필요
표트르 Ścigała

gdaniel : 준비된 JS 솔루션 : github.com/code-mattclaffey/… 방금 테스트했고 훌륭하게 작동합니다!
Piotr Ścigała

JS 솔루션, <picture> 요소를 통해 이미지로드 및 배경 이미지로 표시 : github.com/code-mattclaffey/…
Piotr Ścigała

2

Foundation 프레임 워크 ( https://foundation.zurb.com/ )를 사용하는 경우 다음을 위해 Interchange 플러그인을 사용할 수 있습니다.

<div data-interchange="[assets/img/interchange/small.jpg, small], 
                       [assets/img/interchange/medium.jpg, medium], 
                       [assets/img/interchange/large.jpg, large]">
</div>

https://foundation.zurb.com/sites/docs/interchange.html#use-with-background-images


이 Martti에 감사드립니다. 나는 responsive-loader꽤 달콤한 솔루션을 위해 webpack과 함께 이것을 멋지게 연결했습니다 .
fredrivett

1

를 기반으로 @Weston 의 대답은, 내가 더 일반적인 jQuery를 솔루션을 구축했습니다 수행 할 수 있습니다 기본적으로 그냥 복사 및 JS와 HTML 부분에 CSS와 초점을 붙여 넣기)

TL; DR-바이올린 : https://jsfiddle.net/dpaa7oz6/

CSS

...로드하는 동안 이미지가 거의 보이지 않도록

.srcSet{
  position: fixed;
  z-index: 0;
  z-index: -1;
  z-index: -100;
  /* you could probably also add visibility: hidden; */
}

JS / jQuery

이 스크립트는 srcSet클래스 및 바인딩 load이벤트가 있는 모든 이미지를 통과합니다currentSrc (또는 src지원되지 않는 경우)background-image 하여 bgFromSrcSet클래스 가있는 가장 가까운 부모에 CSS로 배치합니다 .

그것만으로는 충분하지 않습니다! 따라서window load로드 이벤트가 완료되었는지 여부를 테스트하기 위해 이벤트에간격 검사기를 배치하고 그렇지 않은 경우 트리거합니다. (img load이벤트는 처음로드시에만 트리거 되는 경우가 매우 많으며다음로드시 이미지 소스가 캐시에서 검색 되어 img로드 이벤트가 발생 하지 않습니다. 가 발생 ! )

jQuery(function($){ //ON DOCUMENT READY
  var $window = $(window); //prepare window as jQuery object

  var $srcSets = $('.srcSet'); //get all images with srcSet clas
  $srcSets.each(function(){ //for each .srcSet do...
    var $currImg = $(this); //prepare current srcSet as jQuery object

    $currImg
      .load(function(){ //bind the load event
          var img = $currImg.get(0); //retrieve DOM element from $currImg

          //test currentSrc support, if not supported, use the old src
          var src = img.currentSrc ? img.currentSrc : img.src;

          //To the closest parent with bgFromSrcSet class,
          //set the final src as a background-image CSS
          $currImg.closest('.bgFromSrcSet').css('background-image', "url('"+src+"')");

          //remove processed image from the jQuery set
          //(to update $srcSets.length that is checked in the loadChecker)
          $srcSets = $srcSets.not($currImg);

          $currImg.remove(); //remove the <img ...> itself 
      })
    ;      

  });

  //window's load event is called even on following loads...
  $window.load(function(){    
    //prepare the checker
    var loadChecker = setInterval(function(){
        if( $srcSets.length > 0 ) //if there is still work to do...
            $srcSets.load(); //...do it!
        else
            clearInterval(loadChecker); //if there is nothing to do - stop the checker
    }, 150);  
  });

});

HTML

... 다음과 같이 보일 수 있습니다.

<div class="bgFromSrcSet">
  <img class="srcSet"
       alt=""
       src="http://example.com/something.jpeg" 
       srcset="http://example.com/something.jpeg 5760w, http://example.com/something-300x200.jpeg 300w, http://example.com/something-768x512.jpeg 768w, http://example.com/something-1024x683.jpeg 1024w, http://example.com/something-1000x667.jpeg 1000w"
       sizes="(max-width: 2000px) 100vw, 2000px"
  >
  Something else...
</div>

참고 : 클래스 bgFromSrcSet는 자체 로 설정 되지 않아야 img합니다! imgDOM 상위 트리 의 요소로만 설정할 수 있습니다 .

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