Maison > interface Web > js tutoriel > le corps du texte

Principe de mise en œuvre de l'image défilante jQuery_jquery

WBOY
Libérer: 2016-05-16 15:25:58
original
1121 Les gens l'ont consulté

本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出

一、什么是图片滚动加载?

  通俗的讲就是:当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次),只有当图片出现在浏览器的可视区域内时,才设置图片正真的路径,让图片显示出来。这就是图片懒加载。

二、为什要使用这个技术?

  比如一个页面中有很多图片,如淘宝、京东首页等等,如果一上来就发送这么多请求,页面加载就会很漫长,如果js文件都放在了文档的底部,恰巧页面的头部又依赖这个js文件,那就不好办了。更为要命的是:一上来就发送百八十个请求,服务器可能就吃不消了(又不是只有一两个人在访问这个页面)。

  因此优点就很明显了:不仅可以减轻服务器的压力,而且可以让加载好的页面更快地呈现在用户面前(用户体验好)。

三、怎么实现?

关键点如下:

      1、页面中的img元素,如果没有src属性,浏览器就不会发出请求去下载图片(也就没有请求咯,也就提高性能咯),一旦通过javascript设置了图片路径,浏览器才会送请求。有点按需分配的意思,你不想看,就不给你看,你想看了就给你看~

  2、如何获取正真的路径,这个简单,现在正真的路径存在元素的“data-url”(这个名字起个自己认识好记的就行)属性里,要用的时候就取出来,再设置;

  3、开始比较之前,先了解一些基本的知识,比如说如何获取某个元素的尺寸大小、滚动条滚动距离及偏移位置距离; 

1)屏幕可视窗口大小:对应于图中1、2位置处

    原生方法:window.innerHeight 标准浏览器及IE9+ || document.documentElement.clientHeight 标准浏览器及低版本IE标准模式 || document.body.clientHeight 低版本混杂模式

       jQuery方法: $(window).height()

2)浏览器窗口顶部与文档顶部之间的距离,也就是滚动条滚动的距离:也就是图中3、4处对应的位置;

    原生方法:window.pagYoffset——IE9+及标准浏览器 || document.documentElement.scrollTop 兼容ie低版本的标准模式 || document.body.scrollTop 兼容混杂模式;

        jQuery方法:$(document).scrollTop();

3)获取元素的尺寸:对应于图中5、6位置处;左边jquery方法,右边原生方法

    $(o).width() = o.style.width;

    $(o).innerWidth() = o.style.width+o.style.padding;

    $(o).outerWidth() = o.offsetWidth = o.style.width+o.style.padding+o.style.border;

    $(o).outerWidth(true) = o.style.width+o.style.padding+o.style.border+o.style.margin;

注意:要使用原生的style.xxx方法获取属性,这个元素必须已经有内嵌的样式,如

;

Si le style CSS a été initialement défini via une feuille de style externe ou interne, vous devez utiliser o.currentStyle[xxx] ||document.defaultView.getComputedStyle(0)[xxx] pour obtenir la valeur du style

4) Récupérer les informations de position de l'élément : correspond aux positions 7 et 8 dans l'image

1) Renvoie la distance de l'élément par rapport au côté supérieur et gauche du document

jQuery : La distance entre l'élément $(o).offset().top et le haut du document, et la distance entre l'élément $(o).offset().left et le bord gauche du document

Native : getoffsetTop(), il y a des instructions spécifiques sur l'élévation, donc je vais l'ignorer ici

À propos, la distance de décalage de l'élément renvoyé par rapport au premier élément parent positionné, faites attention à la différence par rapport à la distance de décalage ci-dessus

;

jQuery : position() renvoie un objet, $(o).position().left = style.left, $(o).position().top = style.top

4. Après avoir su comment obtenir la taille de l'élément et la distance de décalage, la question suivante est : Comment déterminer si un élément est entré ou est sur le point d'entrer dans la zone de la fenêtre visuelle ? Ce qui suit est également une image pour illustrer le problème.

1) La plus grande case à l'extérieur correspond à la taille réelle de la page, la case bleu clair au milieu représente la taille de l'élément parent, les objets 1 à 8 représentent la position réelle de l'élément sur la page ; dans le sens horizontal !

 2) La distance de décalage (offsetLeft) de la bordure gauche de l'objet 8 par rapport à la bordure gauche de la page est supérieure à la distance de la bordure droite de l'élément parent par rapport à la bordure gauche de la page. time, l'élément peut être lu en dehors de l'élément parent

 3) La bordure gauche de l'objet 7 traverse la bordure droite de l'élément parent A ce moment : la distance de décalage (offsetLeft) de la bordure gauche de l'objet 7 par rapport à la bordure gauche de la page est inférieure à la distance. de la bordure droite de l'élément parent par rapport à la bordure gauche de la page, donc l'Objet 7 entre dans la zone visible de l'élément parent

;

 4) A la position de l'objet 6, la distance entre le bord droit de l'objet 5 et le bord gauche de la page est supérieure à la distance entre le bord gauche de l'élément parent et le bord gauche de la page

 5) À la position de l'objet 5, la distance entre le bord droit de l'objet 5 et le bord gauche de la page est inférieure à la distance entre le bord gauche de l'élément parent et le bord gauche de la page ; à ce moment, on peut juger que l'élément est en dehors de la zone visible de l'élément parent

;

 6) Par conséquent, deux conditions doivent être remplies dans le sens horizontal pour indiquer que l'élément est dans la zone visuelle de l'élément parent ; de même, les deux conditions doivent être remplies dans le sens vertical ; ci-dessous pour plus de détails

4. Développez le plug-in jquery Utilisation : $("selector").scrollLoad({ les paramètres sont expliqués dans le code })

(function($) {
 $.fn.scrollLoading = function(options) {
  var defaults = {
   // 在html标签中存放的属性名称;
   attr: "data-url",
   // 父元素默认为window
   container: window,
   callback: $.noop
  };
  // 不管有没有传入参数,先合并再说;
  var params = $.extend({}, defaults, options || {});
  // 把父元素转为jquery对象;
  var container = $(params.container);
  // 新建一个数组,然后调用each方法,用于存储每个dom对象相关的数据;
  params.cache = [];
  $(this).each(function() {
   // 取出jquery对象中每个dom对象的节点类型,取出每个dom对象上设置的图片路径
   var node = this.nodeName.toLowerCase(), url = $(this).attr(params["attr"]);
   //重组,把每个dom对象上的属性存为一个对象;
   var data = {
    obj: $(this),
    tag: node,
    url: url
   };
   // 把这个对象加到一个数组中;
   params.cache.push(data);
  });

  var callback = function(call) {
   if ($.isFunction(params.callback)) {
    params.callback.call(call);
   }
  };
  
  //每次触发滚动事件时,对每个dom元素与container元素进行位置判断,如果满足条件,就把路径赋予这个dom元素!
  var loading = function() {
   // 获取父元素的高度
   var contHeight = container.outerHeight();
   var contWidth = container.outerWidth();

   // 获取父元素相对于文档页顶部的距离,这边要注意了,分为以下两种情况;
   if (container.get(0) === window) {
    // 第一种情况父元素为window,获取浏览器滚动条已滚动的距离;$(window)没有offset()方法;
    var contop = $(window).scrollTop();
    var conleft = $(window).scrollLeft();
   } else {
    // 第二种情况父元素为非window元素,获取它的滚动条滚动的距离;
    var contop = container.offset().top;
    var conleft = container.offset().left;
   }

   $.each(params.cache, function(i, data) {
    var o = data.obj, tag = data.tag, url = data.url, post, posb, posl, posr;
    if (o) {
     //对象顶部与文档顶部之间的距离,如果它小于父元素底部与文档顶部的距离,则说明垂直方向上已经进入可视区域了;
     post = o.offset().top - (contop + contHeight);
     //对象底部与文档顶部之间的距离,如果它大于父元素顶部与文档顶部的距离,则说明垂直方向上已经进入可视区域了;
     posb = o.offset().top + o.height() - contop;

     // 水平方向上同理;
     posl = o.offset().left - (conleft + contWidth);
     posr = o.offset().left + o.width() - conleft;

     // 只有当这个对象是可视的,并且这四个条件都满足时,才能给这个对象赋予图片路径;
     if ( o.is(':visible') && (post < 0 && posb > 0) && (posl < 0 && posr > 0) ) {
      if (url) {
       //在浏览器窗口内
       if (tag === "img") {
        //设置图片src
        callback(o.attr("src", url));
       } else {
        // 设置除img之外元素的背景url
        callback(o.css("background-image", "url("+ url +")"));
       }
      } else {
       // 无地址,直接触发回调
       callback(o);
      }
      // 给对象设置完图片路径之后,把params.cache中的对象给清除掉;对象再进入可视区,就不再进行重复设置了;
      data.obj = null;
     }
    }
   });
  };
  //加载完毕即执行
  loading();
  //滚动执行
  container.bind("scroll", loading);
 };
})(jQuery);
Copier après la connexion

Ce qui précède est une introduction détaillée au principe de mise en œuvre du chargement des images par défilement. J'espère que cela sera utile à l'apprentissage de chacun.

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal