最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How can I set different banner images using background cover at different breakpoints?

programmeradmin4浏览0评论

I use the following code to see if a featured image exists and set my banner image like so:

<?php if ( has_post_thumbnail() ) : 
        $src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'hero', '' );
    ?>
    <div class="banner" style="background: url(<?php echo $src[0]; ?>) no-repeat center center; 
                      -webkit-background-size: cover;
                      -moz-background-size: cover;
                      -o-background-size: cover;
                      background-size: cover;">

I would like to alter this and display different images at different breakpoints using:

<?php if ( has_post_thumbnail() ) : 
    $hero = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'hero', '' );
    $tablet = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID), 'tablet', '' );
    $phablet = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phablet', '' );
    $phone = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phone', '' );
?>

I'm not sure how to specify the media queries in the I've used something similar with the tag, but I would rather have the image as a background cover.

Any suggestions?

I use the following code to see if a featured image exists and set my banner image like so:

<?php if ( has_post_thumbnail() ) : 
        $src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'hero', '' );
    ?>
    <div class="banner" style="background: url(<?php echo $src[0]; ?>) no-repeat center center; 
                      -webkit-background-size: cover;
                      -moz-background-size: cover;
                      -o-background-size: cover;
                      background-size: cover;">

I would like to alter this and display different images at different breakpoints using:

<?php if ( has_post_thumbnail() ) : 
    $hero = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'hero', '' );
    $tablet = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID), 'tablet', '' );
    $phablet = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phablet', '' );
    $phone = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phone', '' );
?>

I'm not sure how to specify the media queries in the I've used something similar with the tag, but I would rather have the image as a background cover.

Any suggestions?

Share Improve this question asked Jun 7, 2015 at 17:47 crondeaucrondeau 211 bronze badge
Add a comment  | 

1 Answer 1

Reset to default 0

The way I would do this would be to inline the background: url(...) property.

<?php if ( has_post_thumbnail() ) : 
    $hero = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'hero', '' );
    $tablet = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID), 'tablet', '' );
    $phablet = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phablet', '' );
    $phone = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'phone', '' );
?>
<style>
    @media only screen and (min-width : 480px) {
        .banner {
            background-image: url('<?php echo $phone; ?>');
        }
    }

    @media only screen and (min-width : 768px) {
        .banner {
            background-image: url('<?php echo $phablet; ?>');
        }
    }

    @media only screen and (min-width : 992px) {
        .banner {
            background-image: url('<?php echo $tablet; ?>');
        }
    }

    @media only screen and (min-width : 1200px) {
        .banner {
            background-image: url('<?php echo $hero; ?>');
        }
    }
</style>
<?php endif; ?>

You'll have to adjust the breakpoints to your needs. Note that I'm selecting the banner by class. If you have mutltiple banners on a page then you'll have to assign each one an ID and use the ID to select them.

The background-size property can be in your stylesheet since it applies to all devices.


An alternative approach would be to sniff out the device on the server side and then only serve the image in the necessary size. This solution would allow you to only serve one image instead of four.

I don't care for that solution because you have to maintain a list of user agent to device type mappings and you don't get a whole lot of benefit.

Most browsers will not fetch images that it does not need, so even though the inline CSS solution serves up four images, only one should actually be downloaded by the browser.


The best solution, I think, would be to use the picture element. Unfortunately browser support for that element isn't so great right now.

发布评论

评论列表(0)

  1. 暂无评论