欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jQuery按需加載輪播圖(web前端性能優(yōu)化)

 更新時(shí)間:2017年02月17日 09:39:04   投稿:mrr  
這篇文章主要介紹了jQuery按需加載輪播圖(web前端性能優(yōu)化)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

引言

關(guān)于幻燈輪播圖,想必大家都不陌生,尤其是基于 jQuery 的,插件、代碼網(wǎng)上一搜一大堆,但是真正符合自己需求的幾乎沒(méi)有,所以我要打造一個(gè)符合自身需求,經(jīng)得起廣大網(wǎng)民考驗(yàn)的 jQuery 輪播圖!

思路

為什么說(shuō)網(wǎng)上其他一些輪播圖不符合我的要求?我的需求又是什么呢?

現(xiàn)在網(wǎng)上可以找到的多數(shù)幻燈輪播圖的 jQuery 插件的作法是,先把圖片和鏈接的 HTML 寫(xiě)好,然后控制隱藏和顯示來(lái)輪流展示當(dāng)前的幻燈圖片。但是對(duì)用戶(hù)而言,我們始終只是看到當(dāng)前的一張圖片,那其他幾張隱藏的圖片為什么要事先加載進(jìn)來(lái)呢?這不是費(fèi)時(shí)費(fèi)力嗎?所以我的第一個(gè)需求是按需加載。

我們一般會(huì)把輪播圖放在首頁(yè)展示,但是首頁(yè)的重點(diǎn)內(nèi)容應(yīng)該是最近更新的文章,至少我不認(rèn)為圖片展示功能需要被搜索引擎收錄,所以我的第二個(gè)需求是符合 SEO。

實(shí)現(xiàn)

沖著以上兩個(gè)需求,我做了一個(gè) DEMO ,大家不妨看看這個(gè) DEMO 的源代碼,發(fā)現(xiàn)區(qū)別了嗎?是的,在這個(gè) DEMO 的 HTML 源代碼中,你看不到任何的圖片和相關(guān)信息,都由 JS 載入進(jìn)來(lái)的,也就是說(shuō)爬蟲(chóng)爬不到,而且是隨著圖片的切換,一張一張地載入當(dāng)前的幻燈圖片。

這里我就只分享一下我的 JS 寫(xiě)法,HTML 什么就請(qǐng)各位看源碼吧,代碼我就不一一細(xì)說(shuō)了,注釋也都寫(xiě)得很明白了。

$(function() {
  var WangeSlide = (function() {
    //配置
    var config = {
      //輪播圖尺寸
      width : 960,
      height : 350,
      //是否自動(dòng)切換
      autoSwitch : true,
      //自動(dòng)切換間隔時(shí)間(毫秒)
      interval : 6000,
      //輪播圖圖片路徑
      picPath : 'http://www.dowebok.com/demo/2014/93/img/',
      //輪播圖圖片信息:圖片文件名 / 圖片標(biāo)題 / 圖片指向鏈接
      picInfo : [
        ['fullimage1.jpg', '圖片1提示','http://codepen.io/webstermobile/'],
        ['fullimage1.jpg', '圖片2提示','http://codepen.io/webstermobile/'],
        ['fullimage1.jpg', '圖片3提示','http://codepen.io/webstermobile/']
      ]
    };
    //獲取圖片信息
    /**
     * @param index 圖片所在的索引值
    **/
    var getImgInfo = function(index) {
      var imgSrc = config.picPath + config.picInfo[index][0],
        imgAlt = config.picInfo[index][3],
        imgUrl = config.picInfo[index][4],
        imgId = 'slide_' + (index+1).toString(),
        imgHtml = '<li id="' + imgId + '">' +
              '  <a href="' + imgUrl +'" rel="external nofollow" title="' + imgAlt + '" class="pic">' +
              '    <img src="' + imgSrc + '" alt="' + imgAlt + '" class="slide_thumb" />' +
              '  </a>' +
            '</li>',
        slideTextHtml = '<a href="' + imgUrl + '" rel="external nofollow"  title="' + imgAlt + '">' + imgAlt+ '</a>';
      return {
        imgAlt : imgAlt,
        imgUrl : imgUrl,
        imgHtml : imgHtml,
        slideTextHtml : slideTextHtml
      }
    };
    //圖片完全加載后緩慢加載顯示
    var fadeInImg = function(el, speed) {
      //console.log(el)
      el.find("img").load(function() {
        el.find("img").addClass("loaded")
        el.fadeIn(speed)
      });
    };
    //圖片切換
    /**
     * @param index 圖片所在的索引值
     * @param triggerCurEl 當(dāng)前觸發(fā)節(jié)點(diǎn)元素
    **/
    var imgSwitch = function(index, triggerCurEl) {
      var slideId = 'slide_' + (index+1).toString(),
        slideIdEl = document.getElementById(slideId);
      if (slideIdEl) {
        //如果已有對(duì)應(yīng)的元素,則顯示已有元素
        var panelLi = $('#panel ul li');
        panelLi.hide();
        $(slideIdEl).fadeIn('slow');
      } else {
        //如果還沒(méi)有對(duì)應(yīng)的元素,則注入元素
        $(getImgInfo(index).imgHtml).appendTo($('#panel ul'));
        var panelLi = $('#panel ul li');
        panelLi.hide();
        //載入顯示圖片
        fadeInImg($("#" +slideId), 'slow');
      }
      //獲取圖片的 alt 作為顯示信息
      $('#slide_text').html(getImgInfo(index).slideTextHtml);
      //當(dāng)前狀態(tài) cur
      $('#trigger ul li').removeClass('cur');
      triggerCurEl.addClass('cur');
    };
    //輪播圖
    var slide = function() {
      //設(shè)置輪播圖尺寸
      $('#panel').css({
        'width' : config.width + 'px',
        'height' : config.height + 'px'
      });
      var result = getImgInfo(0).imgHtml
      //初使化輪播圖,只加載第一張圖片信息
      $('#panel ul').html($(result));
      //載入顯示圖片
      fadeInImg($('#slide_1'), 500);
      //注入背景層 + 觸發(fā)器容器 + 輪播圖文字容器
      var slideBg = '<div id="slide_bg"></div>',
        trigger = '<div id="trigger"></div>',
        slideText = '<div id="slide_text"></div>';
      $('#panel').after(slideBg + trigger + slideText);
      //獲取圖片的 alt 作為顯示信息
      $('#slide_text').html(getImgInfo(0).slideTextHtml);
      //注入觸發(fā)節(jié)點(diǎn)
      var triggerUl = $('<ul></ul>');
      triggerUl.appendTo($('#trigger'));
      for (var i=0, j=config.picInfo; i<j.length; i++) {
        $('<li>' + (i+1).toString() +'</li>').appendTo(triggerUl);
      }
      //當(dāng)前狀態(tài) cur
      $('#trigger ul li').eq(0).addClass('cur');
      //點(diǎn)擊觸發(fā)節(jié)點(diǎn)
      $("#trigger ul li").click(function(){
        var index = $("#trigger ul li").index($(this))
        //console.log(index)
        imgSwitch(index,$(this))
      })
      //鼠標(biāo)懸停時(shí),停止切換
      var goSwitch = true;
      $('#panel').hover(
        function() {goSwitch = false},
        function() {goSwitch = true}
      );
      //自動(dòng)切換
      if (config.autoSwitch) {
        setInterval(function() {
          if (goSwitch) {
            //判斷當(dāng)前cur所在的索引值
            var index = parseInt($('.cur','#trigger').text()) - 1;
            if (index > (config.picInfo.length-2)) {
              index = -1;
            }
            imgSwitch((index+1), $('#trigger ul li:eq(' + (index+1) + ')'));
          }
        }, config.interval);
      }
    };
    return {
      //初使化
      init : function() {
        slide();
      }
    }
  })();
  WangeSlide.init();
})

按需加載的網(wǎng)絡(luò)請(qǐng)求情況

 

從圖上可以看到頁(yè)面加載的時(shí)候自動(dòng)切換或者用戶(hù)點(diǎn)擊切換之前只加載了一張slide圖,大大節(jié)省了頁(yè)面加載量。

優(yōu)勢(shì)

同樣的效果,只是實(shí)現(xiàn)方法不同?會(huì)不會(huì)很蛋疼?這有什么優(yōu)勢(shì)呢?

舉個(gè)例子來(lái)說(shuō),優(yōu)化前,假設(shè)首頁(yè)切換的幻燈圖片有5張,平均每張圖片20K,也就是說(shuō)你的首頁(yè)至少要加載100K的圖片,而這100K的圖片你能保證每個(gè)用戶(hù)都會(huì)去看嗎?如果用戶(hù)不看,豈不是白白浪費(fèi)了這100K的載入速度?

優(yōu)化后,在首頁(yè)初次載入的時(shí)候,僅需加載一張1K左右的,甚至是可有可無(wú)的 loading 圖片,當(dāng)用戶(hù)點(diǎn)擊下一張或者達(dá)到定時(shí)器的設(shè)置時(shí)才會(huì)去加載下一張圖片,大大節(jié)省了載入的時(shí)間。1K?100K?你懂的。

另外,用 JS 載入所需的圖片還有一個(gè)好處,就是在一些不支持 JS 的手機(jī)瀏覽器上,載入 100K 的圖片對(duì)于無(wú)法切換的輪播圖而言,是一個(gè)極大的累贅,而且也會(huì)大大降低用戶(hù)體驗(yàn)。

相關(guān)文章

最新評(píng)論