【问题标题】:Prevent images from being downloaded to page on mobile site防止图像被下载到移动网站上的页面
【发布时间】:2013-03-02 02:53:46
【问题描述】:

我怎样才能做到这一点,以便在我的网站的移动版本中,图像不会从网络服务器下载到,因为这些是不需要且未使用的大文件,因此会严重影响移动版本的使用的网站。在查看了以前此类性质的线程后,我发现使用如下代码隐藏图像的父级会受益。

.parent {display:block;}
.background {background-image:url(myimage.png);}

@media only screen and (max-width:480px) {
.parent {display:none;}
}

问题是我不想将背景图像 CSS 用于与它们相关的 SEO 问题,因为我喜欢使用 Schema 标记等 ..所以如何防止 IMG 标记被下载,如 display:none;仅隐藏图像而不是停止下载。

注意:这不适用于版权保护问题,例如防止右键单击等,但为了速度和最终下载内容到移动设备的大小。

【问题讨论】:

  • 有几种脚本和技术可以用来嗅探发出请求的设备。可以在这里找到几个,听起来像这样的那些显示了如何将客户端转发到网站的移动版版本,无需大量图像下载。请注意,我也不相信它们中的任何一个都是万无一失的;这是一个不断发展的浏览器或设备世界。但有些时候应该会给你你想要的。
  • 听起来你需要使用一点 Javascript。我不确定你是否可以使用任何 CSS 来告诉浏览器不要去下载图片。
  • 就个人而言,我可能会拥有所有图像标签,例如<img data-src="img_url.jpg" />,然后可能会检查屏幕尺寸以确定它是否是手机/平板电脑/PC,然后选择所有图像并交换@987654324 @ 值到 load 上的 src 值中,以便尽快发生这种情况。如果您提前知道图像的大小,那么设置这些图像的widthheight 属性也会很有用。 There's got to be a library for this somewhere. I'm sure it will be posted soon as a response....
  • 当然,另一种选择是使用脚本为您的img 文件提供服务,并使用该脚本通过某种类型的检测脚本阻止下载到客户端。
  • @HenryQuekett,看看Mobile Detect,它是处理这类事情的一个相当有用的工具包。

标签: html css performance mobile


【解决方案1】:

如果@media 标签符合您的标准(例如,超过一定的分辨率),我建议将@import 和@media 命令组合起来,以仅@import 包含图像的样式表。

因此,默认情况下,您不会导入应用 BG 图像的样式表,只有在您确定该网站是“非移动”时,您才会最终这样做......如果这有意义的话!

W3c 网站有一些很好的规则组合示例:

http://www.w3.org/TR/css3-mediaqueries/#media0

【讨论】:

  • 我相信@import 是网站性能的杀手,我希望通过 HTML 中的 IMG 标签保持图像链接,但感谢您的建议
  • @JaredFarrish 当然,我确实读过它,试图保持不为移动网站下载不需要的图像的概念。虽然 OP 提到不下载“IMG 标签”,但他是在谈论背景图片,所以我们真的在这里谈论不下载图片文件,因为我还是解释了它!
  • 这里是交易:OP 在img 元素中拥有图像,而不是样式表。在除移动设备之外的所有设备中,它将保持这种状态。 OP 寻求的是一种img 切换到无或其他限制的方式。切换是困难的部分,不处理移动客户端的后果。
【解决方案2】:

此解决方案使用 CSS 来阻止加载背景图像并使用 jQuery 来阻止加载图像。我不熟悉任何会阻止加载图像的 CSS 解决方案。

JS 小提琴: http://jsfiddle.net/CoryDanielson/rLKuE/6/

如果您提前知道图像的高度和宽度(甚至比例),您可以为一组固定大小的 DIV 设置 background-image。这可能适用于图标和布局类型的图像。查看下面的 HTML/CSS 示例。

背景图片

/* hidden by default */
aside {
    display: none;
}

/* Pictures load for 'big screen' users.. pcs/tablets? */
@media screen and (min-width: 750px) {
  aside {
      display: block;
  }

  .catpicDiv {
    height: 100px;
    width: 100px;
    display: inline-block;
    border: 1px solid red;
    background-image: url('http://img2.timeinc.net/health/images/slides/poodle-1-400x400.jpg');
    background-size: cover;
  }
}

和 HTML

<aside>
    <div class="catpicDiv"></div>
    <div class="catpicDiv"></div>
    <div class="catpicDiv"></div>
</aside>


图像元素是另一回事...

我不知道有任何纯 CSS 解决方案来阻止它们加载图像。所以我会这样解决它:

如下定义IMG标签

<img src="" data-src="url-to-image.jpg" />

然后,在文档头部的某处你需要类似的 javascript


1) 加载所有图片的函数

function loadAllTheImages() {
    $("img").each(function(){
        $(this).attr('src', $(this).attr('data-src'));
    });
}

2) 确定用户是使用移动设备还是 PC(慢速与快速连接)然后加载图像的代码。 这段代码不是万无一失的,还有比这更准确合理的测试。

$(window).load(function(){
    if ( $(window).width() > 750 ) {
        loadAllTheImages(); // !
    } else {
        $("body").append("<a id='mobileCheck' href='javascript: void(0);'>I GOTS 4G, LEMME HAVE EM!</a>");
    }
});

3) 还有一些代码可以激活按钮来加载图像吗?为什么不呢,我猜...?

$(document).ready(function(){
    $('body').prepend("<h1>" + $(window).width().toString() + "</h1>");
    $('body').on('click', '#mobileCheck', function(){
        loadAllTheImages(); // !
        $("#mobileCheck").remove();
    });
});

与此处类似的解决方案以及我在 cmets 中的假设:

Delay image loading with jQuery

【讨论】:

  • 如果你给“大”图像一个特定的class 属性,你可以用jQuery专门定位它们。在loadAllTheImages 内部而不是$("img") 你可以有$("img.largeImage"),这将选择所有image elementsclasslargeImage
  • 如果它们已经加载,它们不会丢失图像。代码是1次的。当页面加载时,它会检查是小屏幕吗? 如果是,则没有图像。如果它是一个大屏幕,图像将加载。我更新了 JS Fiddle 以包含常规图像,并且只删除了一些“largeImages”jsfiddle.net/CoryDanielson/rLKuE/8
  • @HenryQuekett - 您也可以在服务器上使用 PHP 和服务器端嗅探器 ob_start()ob_get_clean()str_replace('&lt;img ', '&lt;br class="unloaded" ', $output) 做同样的事情。或者str_replace('data-img-src-replace', 'img=', $output),正如我在 cmets 中所建议的那样,我实际上已经这样做了。效果很好。
  • 对不起我的错误我之前在看一个 jQuery ......是的,所以你基本上说如果用户切换了 JS,他们将不会得到大图像,这是一个问题 :( 我真的很感激这个帮助很抱歉,我很痛苦,我想尽可能多地奖励你的帮助......
  • 您的问题的简单答案实际上只是No. 不幸的是,HTML 和 CSS 还不够强大,无法满足您的需求...... :( 现在这是一个越来越普遍的问题我相信他们将来会做一些事情。他们有针对 1x 和 2x(视网膜)图像的 CSS 解决方案,但不是针对不加载的。
【解决方案3】:

CSS 中没有原生解决方案可以阻止图像加载,即使您隐藏它们或将显示设置为无。

你必须使用一些 JS 来实现这个结果。如果您熟悉 JS,那根本不是问题。有几个插件可以做你想做的事。您也可以编写自己的 JS,因为它并不难。

这是我根据屏幕尺寸加载图像的代码:

DEMO AT CODE PEN

它可以在没有像 JQ 这样的库的情况下工作,但如果您使用其中一个库,它会自动切换到它(根据您的特定需求调整它)。

JS

// use jQuery or pure JS
if (typeof jQuery !== 'undefined') {
  // jQuery way
  // alert("jquery");

  $(function() {
    $(window).on('load resize', function() {
      var products = $("[data-product-image]");
      products.each(function(key, value) {
        var bg = null;
        if (window.outerWidth < 500) return;
        if (window.outerWidth < 1000) bg = $(value).data("product-image-s");
        if (window.outerWidth >= 1000) bg = $(value).data("product-image");
        console.log($(window).outerWidth);
        $(value).css({
          'background-image': 'url(' + bg + ')',
          'background-position': 'center',
          'background-size': 'cover',
        });
      });
    });
  });
} else {
  // Pure JS way
  // alert("JS");

  (function() {
    window.addEventListener('load', wlImageLoader);
    window.addEventListener('resize', wlImageLoader);
    function wlImageLoader() {
      console.log('event! Trig trig');
      var all = document.getElementsByTagName("div");
      var products = [];
      for (i = 0; i < all.length; i++) {
        if (all[i].hasAttribute('data-product-image')) {
          products.push(all[i]);
        }
      }
      Array.prototype.forEach.call(products, function(value) {
        var bg = null;
        var curent = window.getComputedStyle(value).getPropertyValue('background-image');
        console.log(curent);
        if (window.outerWidth < 500 || curent != 'none') return;
        if (window.outerWidth < 1000 && curent == 'none') bg = value.getAttribute('data-product-image-s');
        if (window.outerWidth >= 1000 && curent == 'none') bg = value.getAttribute('data-product-image');
        // if (window.outerWidth >= 2000 && curent == null) bg = value.getAttribute('data-product-image-l');
        if(bg == null || curent != 'none') return;
        value.style.backgroundImage = "url(" + bg + ")";
        value.style.backgroundPosition = "center";
        value.style.backgroundSize = "cover";
        curent = window.getComputedStyle(value).getPropertyValue('background-image');
        console.log(curent);
      });
    }
  })();
}

HTML

<div data-product-image="img/something_normal.jpg" data-product-image-s="img/something_small.jpg" id="p3" class="product">

但是,如果您是一个时间加载狂,您可能更喜欢在 JS 中本地编写代码,因为您通常不使用大部分 jQuery 库。对于快速的互联网连接,这不是问题,但如果您将移动设备定位在乡村,这可能会有所作为。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2013-12-30
    • 2013-09-22
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多