क्या सीएसएस बैकग्राउंड छवि के लिए एक श्रुसेट समतुल्य है


89

imgsrcsetविशेषता के साथ उत्तरदायी छवियों को करने का एक शानदार तरीका दिखता है। क्या कोई समान सिंटैक्स है जो सीएसएस background-imageसंपत्ति में काम करता है ?

एचटीएमएल

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

सीएसएस

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

जवाबों:


81

image-setबराबर सीएसएस सुविधा है। हमें युक्ति के समतुल्य समरूप कार्यक्षमता (उनके आयामों के अनुसार संसाधनों को परिभाषित करना) को जोड़ना चाहिए।

वर्तमान में यह केवल -webkit-उपसर्ग के साथ सफारी, क्रोम और ओपेरा में लागू किया गया है , और यह केवल xवर्णनकर्ताओं का समर्थन करता है ।


1
वहाँ किसी भी सुंदर कमबैक ज्ञात है या एक polyfill इस का समर्थन कर रहा है?
राहेल कैंटर

5
@ RachelCantor क्या कमबैक जरूरी होगा? वैसे भी केवल आधुनिक उपकरणों में रेटिना स्क्रीन होते हैं, मैंने सोचा होगा?
जेम्स केम्प

3
केवल xडिस्क्रिप्टर का समर्थन करना व्यर्थ लगता है, मेरा मतलब है कि एक बैकग्राउंड इमेज 2x 'रेटिना' डेस्कटॉप (5120w) पर पूरी चौड़ाई की हो सकती है, जो कि 2x (720 w) मोबाइल पर किसी भी मोबाइल डिवाइस के लिए एक हास्यास्पद आकार की छवि को यहां तक ​​कि एक वेब पेज के रूप में भी माना जा सकता है। पृष्ठभूमि। यहां तक ​​कि कुछ अलग-अलग आकारों की सेवा के लिए अधिकतम-चौड़ाई वाले मीडिया प्रश्नों का उपयोग करना भी उतना उपयोगी नहीं है, क्योंकि इसकी पृष्ठभूमि की अधिकतम चौड़ाई, स्क्रीन की अधिकतम-चौड़ाई नहीं है।
क्रिस सेफ़र्ट

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

एक और दृष्टिकोण, जो काफी स्पष्ट रूप से अधिक मजबूत है, पृष्ठभूमि छवियों की विशेषताओं और विकल्पों को श्रीस्कूल विशेषता के साथ एक छवि के लिए अनुकूल बनाना होगा।

ऐसा करने के लिए, छवि को चौड़ाई निर्धारित करें: 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- सेट छवि की चौड़ाई को ध्यान में नहीं रखता है, ऑब्जेक्ट-फिट के लिए केवल कंटेनर की चौड़ाई: कवर। इसका मतलब यह है कि यदि आपका img टैग समाप्त होता है तो 50px चौड़ी लेकिन 1000px ऊँची, जो छवि 50px चौड़ाई को संतुष्ट करती है उसे फिट करने के लिए लोड और स्ट्रेच किया जाता है, हो सकता है कि इसे केवल 50px स्लाइस प्रदर्शित करने के लिए 240w से 1500px चौड़ाई तक बढ़ाया जाए।
क्रिस Seufert

10

पॉलीफ़िल के लिए, आप सही छवि आकार डाउनलोड करने के लिए एक तंत्र के रूप में srcset के साथ एक img का उपयोग कर सकते हैं, फिर इसे छिपाने के लिए JS का उपयोग करें और मूल तत्व की पृष्ठभूमि-छवि सेट करें।

यहाँ एक पहेली है: http://jsbin.com/garetikubu/edit?html,output

onloadजेएस को एक अवरुद्ध स्क्रिप्ट के रूप में उपयोग करना और रखना <head>महत्वपूर्ण है। यदि आप बाद में स्क्रिप्ट डालते हैं (अंत में कहते हैं <body>), तो आप एक दौड़ की स्थिति प्राप्त कर सकते हैं जहां img.currentSrc ब्राउज़र द्वारा अभी तक सेट नहीं किया गया है। इसे लोड होने के लिए इंतजार करना सबसे अच्छा है।

उदाहरण आपको मूल img को डाउनलोड करने की अनुमति देता है। आप इसे कुछ CSS के साथ आसानी से छिपा सकते हैं।


दिलचस्प। मुझे उम्मीद है कि ऐसा करते समय छवि दो बार लोड होगी। हालाँकि, यह प्रकट नहीं होता है।
पेरी

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 गुना अधिक हो सकता है, इसलिए गुणवत्ता में बहुत खराब दिखता है।
क्रिस सेफ़र्ट

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>

स्थिति '<चित्र>' तत्व 'निरपेक्ष' या 'निश्चित' के रूप में। सही z-index + स्थिति सेट करें: यदि आवश्यक हो तो इसके कंटेनर के लिए सापेक्ष
Piotr łcigała

gdaniel: Ready JS solution: github.com/code-mattclaffey/… मैंने अभी इसका परीक्षण किया है और यह बहुत अच्छा काम कर रहा है!
पियोट łcigała

जेएस समाधान, <चित्र> तत्व के माध्यम से छवि लोड कर रहा है और इसे पृष्ठभूमि-छवि के रूप में प्रदर्शित कर रहा है: github.com/code-mattclaffey/…
Piotr igacigała

2

यदि आप फाउंडेशन फ्रेमवर्क ( https://foundation.zurb.com/ ) का उपयोग कर रहे हैं , तो आप उसके लिए इंटरचेंज प्लगइन का उपयोग कर सकते हैं:

<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


इस मार्टी के लिए धन्यवाद। मैंने इसे बहुत अच्छे responsive-loaderसमाधान के लिए वेबपैक के साथ अच्छी तरह से तार-तार कर दिया है ।
fredrivett

1

@Weston के उत्तर के आधार पर , मैंने एक और सामान्य jQuery समाधान बनाया है, आप मूल रूप से JS और CSS को कॉपी और पेस्ट कर सकते हैं और HTML भाग पर ध्यान केंद्रित कर सकते हैं;)

टीएल; डीआर - फिडल: https://jsfiddle.net/dpaa7oz6/

सीएसएस

... छवियों को सुनिश्चित करने के लिए लोड करते समय शायद ही दिखाई देगा

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

जेएस / jQuery

यह स्क्रिप्ट उन सभी छवियों से गुजरेगी, जिनमें srcSetक्लास और बाइंड loadइवेंट है, जो currentSrc(या srcयदि समर्थित नहीं है) और क्लास के background-imageसाथ निकटतम माता-पिता के लिए इसे सीएसएस के रूप में रखता है bgFromSrcSet

इतना ही काफी नहीं होगा! इसलिए यह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);  
  });

});

एचटीएमएल

... इस तरह देख सकते हैं:

<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 पैरेंट ट्री में तत्वों के लिए सेट किया जा सकता है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.