根据屏幕分辨率动态更改图像

时间:2016-06-16 19:38:38

标签: javascript jquery html responsive-design

我有一个带有全屏背景图片的部分,该部分是通过JavaScript数据属性加载的。由于这是响应式网站,因此根据屏幕尺寸放大和缩小相同的背景图像(1920 x 1080px),这对于性能不是很好,例如,在屏幕尺寸较小的手机上。

HTML:

<!-- BEGIN PAGE TITLE -->
<section id="page-title" class="page-title-lg" data-bg-img="nature/full-20.jpg">
  <div class="container">
    <div class="page-title-wrapper">
      <div class="page-title-txt">
        <h1>Large Page Title</h1>
      </div>
    </div>
  </div>
</section>
<!-- END PAGE TITLE -->

JS:

// Image Background 
$('[data-bg-img]').each(function() {
      var dataImg = $(this).attr('data-bg-img');
      $(this).css('background-image', 'url(assets/img/' + dataImg + ')');
 });

有没有办法动态检测窗口大小并通过不同的数据属性加载适当的图像(例如2560 x 1440,1920 x 1440,1280 x 800,640 x 960等)?

3 个答案:

答案 0 :(得分:2)

如果平板电脑,桌面设备和移动设备有三种不同的图像,您可以创建一个简单的系统来自动选择要加载的正确图像。

<section id="page-title" class="page-title-lg" data-bg data-bg-img-desktop="nature/full-20.jpg" data-bg-img-tablet="nature/full-20.jpg" data-bg-img-mobile="nature/full-20.jpg"></section>

请注意以下四个属性:data-bg data-bg-img-desktop,data-bg-img-tablet,data-bg-img-mobile。

页面加载时,获取屏幕宽度并加载最接近屏幕大小的图像:

<script type="text/javascript">

var imageBgs = document.querySelectorAll('[data-bg]');
var screenWidth = window.innerWidth;

for(var i=0; i<imageBgs.length; i++) {
    if( screenWidth < 768 ){
        // Load mobile image
        imageBgs[i].style.backgroundImage = 'url('+imageBgs[i].getAttribute('data-bg-img-mobile')+')';
    } else if( screenWidth >= 768 && screenWidth <= 1024 ) {
        // Ipad
        imageBgs[i].style.backgroundImage = 'url('+imageBgs[i].getAttribute('data-bg-img-tablet')+')';
    } else {
        // desktop image
        imageBgs[i].style.backgroundImage = 'url('+imageBgs[i].getAttribute('data-bg-img-desktop')+')';
    }
}

</script>

答案 1 :(得分:1)

您是否有理由不能直接更改CSS?

有几种方法可以解决这个问题。一种方法是收听resize事件,并相应地更新所有图像。但是,您也可以使用jquery在页面加载期间为每个元素创建媒体查询,并让浏览器处理所有内容。

这里有一个小提琴,说明如何做到这一点:https://jsfiddle.net/czr41bqp/

基本上,您可以为要切换的每个屏幕尺寸添加样式,并在此处创建style元素并将其附加到标题中。当然,这要求您预先生成所有版本的图像,并且尺寸与每个图像一致。

$(function() {
  //define a template with all media queries we want to target
  var mediaQueryTemplate = '\
    @media screen and (min-width:350px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/350x150) } \
    } \
    @media screen and (min-width:640px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/640x960) } \
    } \
    @media screen and (min-width:1280px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/1280x800) } \
    } \
    @media screen and (min-width:1280px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/1280x800) } \
    } \
    @media screen and (min-width:1920px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/1920x1440) } \
    } \
    @media screen and (min-width:2560px) { \
        #{{ID}} { background-image: url({{BASE_URL}}/2560x1440) } \
    } \
  ';

  var $style = $('<style>');
  $style.appendTo('head');

  $('[data-bg-img]').each(function() {
    //generate all media queries from the template for each image and add them to the style tag

    var dataImg = $(this).attr('data-bg-img');
    var mediaQueries = mediaQueryTemplate.replace(/{{ID}}/g, this.id).replace(/{{BASE_URL}}/g, dataImg);

    $style.text($style.text() + mediaQueries);
  });
});

答案 2 :(得分:1)

一种方法是离开&#34; src&#34;属性为空,然后根据屏幕宽度进行分配。

windowSize = $("window").width();

if(windowSize >= 1000){
$("img").attr("src","bigFile.png")
}
if(windowSize <= 999 && windowSize >= 500){
$("img").attr("src","mediumFile.png")
}
if(windowSize < 499){
$("img").attr("src","mobileFile.png")
}

或者你可以使用类似的东西:

if(windowSize >= 1000){
    $("imageContainer").html("<img src="bigFile">);
}