全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

jQuery按需加载轮播图(web前端性能优化)

引言

关于幻灯轮播图,想必大家都不陌生,尤其是基于 jQuery 的,插件、代码网上一搜一大堆,但是真正符合自己需求的几乎没有,所以我要打造一个符合自身需求,经得起广大网民考验的 jQuery 轮播图!

思路

为什么说网上其他一些轮播图不符合我的要求?我的需求又是什么呢?

现在网上可以找到的多数幻灯轮播图的 jQuery 插件的作法是,先把图片和链接的 HTML 写好,然后控制隐藏和显示来轮流展示当前的幻灯图片。但是对用户而言,我们始终只是看到当前的一张图片,那其他几张隐藏的图片为什么要事先加载进来呢?这不是费时费力吗?所以我的第一个需求是按需加载。

我们一般会把轮播图放在首页展示,但是首页的重点内容应该是最近更新的文章,至少我不认为图片展示功能需要被搜索引擎收录,所以我的第二个需求是符合 SEO。

实现

冲着以上两个需求,我做了一个 DEMO ,大家不妨看看这个 DEMO 的源代码,发现区别了吗?是的,在这个 DEMO 的 HTML 源代码中,你看不到任何的图片和相关信息,都由 JS 载入进来的,也就是说爬虫爬不到,而且是随着图片的切换,一张一张地载入当前的幻灯图片。

这里我就只分享一下我的 JS 写法,HTML 什么就请各位看源码吧,代码我就不一一细说了,注释也都写得很明白了。

$(function() {
  var WangeSlide = (function() {
    //配置
    var config = {
      //轮播图尺寸
      width : 960,
      height : 350,
      //是否自动切换
      autoSwitch : true,
      //自动切换间隔时间(毫秒)
      interval : 6000,
      //轮播图图片路径
      picPath : 'http://www.dowebok.com/demo/2014/93/img/',
      //轮播图图片信息:图片文件名 / 图片标题 / 图片指向链接
      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 当前触发节点元素
    **/
    var imgSwitch = function(index, triggerCurEl) {
      var slideId = 'slide_' + (index+1).toString(),
        slideIdEl = document.getElementById(slideId);
      if (slideIdEl) {
        //如果已有对应的元素,则显示已有元素
        var panelLi = $('#panel ul li');
        panelLi.hide();
        $(slideIdEl).fadeIn('slow');
      } else {
        //如果还没有对应的元素,则注入元素
        $(getImgInfo(index).imgHtml).appendTo($('#panel ul'));
        var panelLi = $('#panel ul li');
        panelLi.hide();
        //载入显示图片
        fadeInImg($("#" +slideId), 'slow');
      }
      //获取图片的 alt 作为显示信息
      $('#slide_text').html(getImgInfo(index).slideTextHtml);
      //当前状态 cur
      $('#trigger ul li').removeClass('cur');
      triggerCurEl.addClass('cur');
    };
    //轮播图
    var slide = function() {
      //设置轮播图尺寸
      $('#panel').css({
        'width' : config.width + 'px',
        'height' : config.height + 'px'
      });
      var result = getImgInfo(0).imgHtml
      //初使化轮播图,只加载第一张图片信息
      $('#panel ul').html($(result));
      //载入显示图片
      fadeInImg($('#slide_1'), 500);
      //注入背景层 + 触发器容器 + 轮播图文字容器
      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);
      //注入触发节点
      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);
      }
      //当前状态 cur
      $('#trigger ul li').eq(0).addClass('cur');
      //点击触发节点
      $("#trigger ul li").click(function(){
        var index = $("#trigger ul li").index($(this))
        //console.log(index)
        imgSwitch(index,$(this))
      })
      //鼠标悬停时,停止切换
      var goSwitch = true;
      $('#panel').hover(
        function() {goSwitch = false},
        function() {goSwitch = true}
      );
      //自动切换
      if (config.autoSwitch) {
        setInterval(function() {
          if (goSwitch) {
            //判断当前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();
})

按需加载的网络请求情况

 

从图上可以看到页面加载的时候自动切换或者用户点击切换之前只加载了一张slide图,大大节省了页面加载量。

优势

同样的效果,只是实现方法不同?会不会很蛋疼?这有什么优势呢?

举个例子来说,优化前,假设首页切换的幻灯图片有5张,平均每张图片20K,也就是说你的首页至少要加载100K的图片,而这100K的图片你能保证每个用户都会去看吗?如果用户不看,岂不是白白浪费了这100K的载入速度?

优化后,在首页初次载入的时候,仅需加载一张1K左右的,甚至是可有可无的 loading 图片,当用户点击下一张或者达到定时器的设置时才会去加载下一张图片,大大节省了载入的时间。1K?100K?你懂的。

另外,用 JS 载入所需的图片还有一个好处,就是在一些不支持 JS 的手机浏览器上,载入 100K 的图片对于无法切换的轮播图而言,是一个极大的累赘,而且也会大大降低用户体验。


# jquery  # 按需加载  # jquery轮播图  # 利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)  # 前端性能优化建议  # 写给前端工程师的Web前端性能优化的10点建议  # WEB前端性能优化的7大手段详解  # webpack学习教程之前端性能优化总结  # 提高Web性能的前端优化技巧总结  # 前端程序员必须知道的高性能Javascript知识  # 前端性能优化及技巧  # 网站前端和后台性能优化的34条宝贵经验和方法  # 前端从浏览器的渲染到性能优化  # 加载  # 首页  # 我就  # 已有  # 网上  # 源代码  # 下一张  # 图图  # 省了  # 按需  # 是一个  # 也就是说  # 我要  # 是在  # 还没有  # 我不  # 放在  # 都不  # 也会  # 在这个 


相关文章: SQL查询语句优化的实用方法总结  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  网站制作软件有哪些,制图软件有哪些?  网站制作壁纸教程视频,电脑壁纸网站?  如何通过WDCP绑定主域名及创建子域名站点?  建站之星展会模板:智能建站与自助搭建高效解决方案  韩国服务器如何优化跨境访问实现高效连接?  建站org新手必看:2024最新搭建流程与模板选择技巧  建站之星2.7模板:企业网站建设与h5定制设计专题  定制建站哪家更专业可靠?推荐榜单揭晓  建站之星如何助力企业快速打造五合一网站?  建站之星会员如何解锁更多建站功能?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何解决VPS建站LNMP环境配置常见问题?  建站主机与服务器功能差异如何区分?  海南网站制作公司有哪些,海口网是哪家的?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何在Golang中指定模块版本_使用go.mod控制版本号  建站之星如何通过成品分离优化网站效率?  网站制作报价单模板图片,小松挖机官方网站报价?  h5在线制作网站电脑版下载,h5网页制作软件?  如何快速生成高效建站系统源代码?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  如何在VPS电脑上快速搭建网站?  南京网站制作费用,南京远驱官方网站?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何快速搭建高效WAP手机网站吸引移动用户?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何通过主机屋免费建站教程十分钟搭建网站?  建站之星如何防范黑客攻击与数据泄露?  七夕网站制作视频,七夕大促活动怎么报名?  ,如何利用word制作宣传手册?  如何用5美元大硬盘VPS安全高效搭建个人网站?  购物网站制作公司有哪些,哪个购物网站比较好?  javascript中对象的定义、使用以及对象和原型链操作小结  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  ,sp开头的版面叫什么?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  制作网站的模板软件,网站怎么建设?  建站之星多图banner生成与模板自定义指南  一键网站制作软件,义乌购一件代发流程?  微课制作网站有哪些,微课网怎么进?  建站之星安装提示数据库无法连接如何解决?  如何快速上传自定义模板至建站之星?  建站之星CMS五站合一模板配置与SEO优化指南  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  如何通过cPanel快速搭建网站?  c# 在高并发场景下,委托和接口调用的性能对比  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。