全网整合营销服务商

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

免费咨询热线: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条宝贵经验和方法  # 前端从浏览器的渲染到性能优化  # 加载  # 首页  # 我就  # 已有  # 网上  # 源代码  # 下一张  # 图图  # 省了  # 按需  # 是一个  # 也就是说  # 我要  # 是在  # 还没有  # 我不  # 放在  # 都不  # 也会  # 在这个 


相关文章: php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站VPS配置与SEO优化指南:关键词排名提升策略  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  如何快速上传建站程序避免常见错误?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何快速配置高效服务器建站软件?  高端建站如何打造兼具美学与转化的品牌官网?  如何通过服务器快速搭建网站?完整步骤解析  活动邀请函制作网站有哪些,活动邀请函文案?  Python路径拼接规范_跨平台处理说明【指导】  建站之星安装后如何自定义网站颜色与字体?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  招贴海报怎么做,什么是海报招贴?  重庆市网站制作公司,重庆招聘网站哪个好?  Swift中swift中的switch 语句  北京专业网站制作设计师招聘,北京白云观官方网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  已有域名如何快速搭建专属网站?  建站之星图片链接生成指南:自助建站与智能设计教程  如何设计高效校园网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  香港服务器选型指南:免备案配置与高效建站方案解析  如何在Ubuntu系统下快速搭建WordPress个人网站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何规划企业建站流程的关键步骤?  建站上市公司网站建设方案与SEO优化服务定制指南  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  专业商城网站制作公司有哪些,pi商城官网是哪个?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Android自定义控件实现温度旋转按钮效果  制作销售网站教学视频,销售网站有哪些?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  网站制作壁纸教程视频,电脑壁纸网站?  如何通过虚拟主机快速完成网站搭建?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  建站主机选哪家性价比最高?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何在阿里云部署织梦网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  网站制作大概要多少钱一个,做一个平台网站大概多少钱? 

您的项目需求

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