I have a set of image sizes for WordPress that look like this:
add_image_size('1039', 1039, 697);
add_image_size('960', 960, 644);
add_image_size('800', 800, 537);
add_image_size('768', 768, 515);
add_image_size('640', 640, 429);
add_image_size('480', 480, 322);
add_image_size('320', 320, 215);
add_image_size('240', 240, 161);
So basically each defined image size has the name of it’s own width (and I forced the ‘1039’ to be the maximum allowed upload size), and these widths correspond to eight different media sizes, which I set using this:
div.container {width: 1039px;}
@media only screen and (min-width: 960px) and (max-width: 1038px) {div.container {width: 960px;}}
@media only screen and (min-width: 800px) and (max-width: 959px) {div.container {width: 800px;}}
@media only screen and (min-width: 768px) and (max-width: 799px) {div.container {width: 768px;}}
@media only screen and (min-width: 640px) and (max-width: 767px) {div.container {width: 640px;}}
@media only screen and (min-width: 480px) and (max-width: 639px) {div.container {width: 480px;}}
@media only screen and (min-width: 320px) and (max-width: 479px) {div.container {width: 320px;}}
@media only screen and (max-width: 319px) {div.container {width: 240px;}}
Now, I with this basic setting and any chosen image as background-image (with a size of 1039×697) it will just resize the div.container
when a different media views it. However, I want to apply the image-sizes I added, so that it applies the correct image-size to fit the size of the media used (rather than load the huge image and resize it with CSS, it should load the image that is fitted for that resolution).
At current I use this solution:
var body = jQuery('body').css("width");
var body = parseInt(body);
var image = jQuery('.container').css("background-image");
if (body >= 1039) {
var img_width = 1039;
var img_height = 697;
} else if (body >= 960 && body < 1039) {
var img_width = 960;
var img_height = 644;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 800 && body <= 960) {
var img_width = 800;
var img_height = 537;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 768 && body < 800) {
var img_width = 768;
var img_height = 515;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 640 && body < 768) {
var img_width = 640;
var img_height = 429;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 480 && body < 640) {
var img_width = 480;
var img_height = 322;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 320 && body < 480) {
var img_width = 320;
var img_height = 215;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body >= 240 && body < 320) {
var img_width = 240;
var img_height = 161;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
} else if (body < 240) {
var img_width = 240;
var img_height = 161;
var image = image.replace('.jpg")', '-'+img_width+'x'+img_height+'.jpg")');
}
jQuery('.container').css("background-image", image);
And this does in fact apply the correct image for the right media, but it is fully dependent on JavaScript being enabled.
Is there some way I could achieve the same result using just CSS? Or perhaps there is a more elegant solution to this? If so I would love to hear how!
First off, kudos to this pretty cool solution.
I think you’re on the right track and not sure how much more you could do. You could certainly replicate the above with PHP & CSS, thus not requiring jQuery. It would require you to have an array of your sizes and just loop through them. This would be a PHP file in your /CSS directory, and can be enqueued like any other stylesheet.
This would solve your reliance on javascript.
Many thanks to the answer from Noel Tock, I got a solution that works great; created
style.css.php
inside the theme folder, which contains:Which outputs the following:
And to get it into WordPress I used the following in
functions.php
:And in
header.php
:And this all results in the Media Queries being dynamically generated using options from the database, and completely without JavaScript.