srcset-loader icon indicating copy to clipboard operation
srcset-loader copied to clipboard

Support for CSS `image-set` ?

Open ephys opened this issue 7 years ago • 5 comments

This is more a discussion on how feasible it would be than a feature request

Some browser support defining responsive images in CSS, it would be nice if there was a way to write them as easily as it currently is in JS.

Unfortunately, CSS is a little less flexible when it comes to processing data at runtime. So anything the loader returns should be a string in this case.

Currently, the only way I would see it work is by declaring every size manually

background: image-set(
  url('foo.png?sizes=200w') 1x,
  url('foo.png?sizes=400w') 2x,
  // ...
);

It isn't as short and simple as the JS version, but it would work and would at least automate the resizing part.

The main problem I have with it is that currently, this query would return an object containing exactly one size instead of a string. Changing the behavior to return a string when there is only one size and no placeholder would mean another breaking change and an inconsistent API, which I'm not sure I like.

Any ideas ? Should image-sets be supported by this loader ?

ephys avatar Apr 03 '17 21:04 ephys

we could have a sub loader that just returns a string as required/expected for the css?

Not sure best to do that with webpack 2, need to check but should be possible.

timse avatar Apr 04 '17 10:04 timse

Not sure either, a PostCSS plugin might be a better alternative

ephys avatar Apr 05 '17 18:04 ephys

never worked with that, but this code wouldnt be usable in a postcss plugin i reckon?

a sub loader like const cssImageSetLoader = require('srcset-loader/css-image-set.js) could work. and then just use that loader if a certain option is set in the srcset-loader

if(loaderQuery.cssImageSet) {
   //use cssImageSetLoader
   ... 
}

timse avatar Apr 07 '17 23:04 timse

I created a postcss plugin to do this job for background images https://github.com/niceagency/postcss-srcset

PaulKiddle avatar May 18 '17 10:05 PaulKiddle

I suggest adding a toString method to the exported object

module.exports = obj = {/* exported data */};
obj.toString = function() { return obj.sources[Object.keys(obj.sources)[0]]; }; // returns the first source URL

That results in CSS referencing the correct URL when using something like background-image: url(cover.png?sizes=200w) instead of outputing background-image: url([object Object]); like it does right now. Also from my experience it continues to play nicely with other loaders.

Not really an image-set support, but that might be supported in a similar way.

Briareos avatar Nov 25 '17 21:11 Briareos