编码环境

Sublime Text 3

插件包括:

  1. Autoprefixer 自动补全CSS
  2. ColorPicker 颜色选择器
  3. ConvertToUTF8 转码
  4. GBK Support 支持GBK
  5. HTML-CSS-JS Prettify 前端代码格式化
  6. SublimeCodeIntel 最好用的自动补全

Chrome 57.0.2950.5 m

用来预览以及调试

gifcam

屏幕录制gif神器

http://blog.bahraniapps.com/gifcam/

用到的js&css插件

Jquery http://jquery.com/

PreloadJS http://createjs.com/preloadjs

SoundJS

animate https://github.com/daneden/animate.css

前言

H5其实也就是HTML5,是新的HTML标准,自从HTML5标准发布普及之后,使各种不依赖其他插件就能实现酷炫功能的html页面成为可能,这在营销展示的时候非常的有效,H5这个简称也随之而来,所以目前(以及本文)在提到H5,一般都是指那些酷炫的html页面,里面涉及到很多技术内容。

我也一直对H5的相关技术感兴趣,但是都在忙其他的项目,前段时间终于可以着手H5页面的开发了,内容包括小游戏、品牌宣传等等,学习并分享一下其中的内容。当然,这里面就不包括html+css+js的基础内容讲解了。

我将为此做一个系列文章,一步一步的完成丰富我们的h5页面,首当其冲的应该就是素材加载了。

什么时候用到素材加载?

  1. 当h5页面包含很多图片素材的时候(可以考虑使用雪碧图),特别是有大图片的时候,如果是一般的图片浏览,可以延迟加载,如果是类似游戏的话,就一定要保证用户体验,加载完才开始执行,否则场景都开始了,你给用户显示一片空白么?
  2. 当h5页面包含音频素材,并且需要立即播放,同样是需要在一开始加载完才行,否则到时候预加载是无法保证速度的。
  3. 总之还是要看加载与否是否会影响用户体验,如果影响,那么务必在页面加载完成后才显示。

loading提示,让用户等待

首次素材加载当然越快越好,所以一般h5的素材我们能压缩就压缩,即使质量降低了,但是手机上看只要没有明显的马赛克其实都可以理解……不排除网络慢的情况,所以一般我们都会有个loading提示页面来安抚用户焦急的心态,否则加载的时候也是一片空白,如果这个界面越有趣,用户当然就越安心~,让用户首次加载之后,后续浏览器打开页面一般都会有缓存,loading几乎都一闪而过。

常用的loading方案有3种

方案 优点 缺点
文字提示 方便直白、本身不用加载,可以提示具体进度 缺乏吸引力
css3动画 美观、本身不用加载,可以提示具体进度 效果实现困难
gif动画 美观,自由度高 本身是张图片,也需要加载,无法提示具体进度

loading预览图



1是gif(本身有50kb),加载这个也是要时间的

2是css3+svg(copy自大神作品,css代码就有1000行…),只是一个演示,一般没人会搞那么复杂的。

3是文字

图片的加载

对于一般只有图片展示的h5,加载图片有比较简单的方法,对于需要加载的img,加上自定义的class用于选择,这里使用deferred。

  1. <img class="deferred" src="http://i4.piimg.com/11340/7f638e192b9079e6.jpg" alt="">

后面借助dom元素的事件和jquery的deferred回调函数机制,加载完回调即可,deferred用法可参考

http://api.jquery.com/category/deferred-object/

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

  1. //简单的图片素材加载代码
  2. var loading_deferred = $.Deferred();
  3. var loading_index = 0;
  4. var loading_length = $('.deferred').length;
  5. $.when(loading_deferred).done(function() {
  6. $('.container').removeClass('hide');
  7. // 淡入淡出效果
  8. $('.container').addClass('fadeIn animated');
  9. $('.loading').addClass('fadeOut animated');
  10. });
  11. if (loading_length > 0) {
  12. for (var i = 0; i < loading_length; i++) {
  13. var temp_src = $('.deferred').get(i).src;
  14. var temp_img = new Image;
  15. temp_img.onload = function() {
  16. loading_index++;
  17. //console.log(loading_index);
  18. $('.loading p').text('素材加载中(' + loading_index + '/' + loading_length + ')');
  19. var persent = (loading_index / loading_length) * 100 + "%";
  20. if (loading_index == loading_length) {
  21. loading_deferred.resolve();
  22. }
  23. };
  24. temp_img.onerror = function() {
  25. $('.loading p').text('素材加载失败!');
  26. }
  27. temp_img.src = temp_src;
  28. }
  29. } else {
  30. loading_deferred.resolve();
  31. }

音频的加载

本想着音频的加载直接用Audio套用图片加载的公式即可

  1. //Constructor for audio elements. The preload property of the returned object is set to auto and the src property is set to the argument value
  2. var audio= new Audio(src);
  3. audio.onloadeddata = function(){
  4. //加载完成
  5. };
  6. audio.onerror = function(){
  7. //加载失败
  8. };

实际开发中,经过测试发现,浏览器的兼容性确实有问题,在Chrome浏览器上正常,但是在微信/IOS上就不正常了,默认音频是不能自动加载的,就不会执行onloadeddate,很多h5其实都是在微信/IOS上传播的,可以使用XMLHttpRequest代替,又不想重复造轮子,所以还是搜索一下现有的方案,发现了神器PreloadJS

利用神器PreloadJS

PreloadJS是CreateJS家族中的一个模块,其他模块还包括EaselJS、TweenJS、SoundJS,都是h5开发的大杀器。但是也不能保证浏览器的完全兼容,具体说明以及使用方法见官方文档。

PreloadJS默认情况就是使用XHR进行素材加载的,你也可以强制使用标签加载。

PreloadJS能够加载几乎所有的WEB资源文件,使用起来很方便,可以采用manifest进行统一的素材管理。加载代码变换后如下:

  1. //建议使用资源清单,方便管理,如果资源较多,可以考虑独立出json文件,脚本自动生成。
  2. var manifest = [
  3. "./img/1.jpg",
  4. "./img/2.jpg",
  5. "./img/3.jpg",
  6. "./img/4.jpg",
  7. "./img/5.jpg",
  8. "./img/6.jpg",
  9. "./img/7.jpg",
  10. "./img/8.jpg",
  11. "./img/9.jpg",
  12. "./img/10.jpg",
  13. "./img/11.jpg",
  14. "./img/12.jpg", {
  15. id: '告白气球',
  16. src: './audio/107192078.m4a'
  17. }, {
  18. id: '一生有你',
  19. src: './audio/95484.m4a'
  20. },
  21. ]
  22. //PreloadJS加载代码
  23. var loading_deferred = $.Deferred();
  24. $.when(loading_deferred).done(function() {
  25. $('.container').removeClass('hide');
  26. // 淡入淡出效果
  27. $('.container').addClass('fadeIn animated');
  28. $('.loading').addClass('fadeOut animated');
  29. });
  30. var queue = new createjs.LoadQueue(false);
  31. //SoundJS默认用的是复杂的Web Audio接口,这会导致加载音频变慢,所以显示注册使用html的audio即可
  32. createjs.Sound.registerPlugins([createjs.HTMLAudioPlugin]);
  33. //如果需要加载音频,需要注册SoundJs插件
  34. queue.installPlugin(createjs.Sound);
  35. queue.on("complete", function() {
  36. var items = queue.getItems();
  37. for (var i = 0; i < items.length; i++) {
  38. $('.container').append(items[i].result);
  39. };
  40. loading_deferred.resolve();
  41. queue.getLoadedItems();
  42. createjs.Sound.play("告白气球");
  43. }, this);
  44. queue.on("progress", function(event) {
  45. //console.log("Progress:", queue.progress, event.progress);
  46. var persent = Math.floor(queue.progress * 100) + "%";
  47. $('.loading p').text('素材加载中(' + persent + ')');
  48. });
  49. //设置并列加载,否则每次只加载一个,太耗时
  50. queue.setMaxConnections(5);
  51. queue.maintainScriptOrder = true;
  52. queue.loadManifest(manifest);

注意:使用XHR加载非本域名资源会遇到Cross-domain跨域加载的问题,资源服务器需要配合设置一下access-control-allow-origin头,或者使用标签模式进行加载new createjs.LoadQueue(false);

最终效果图

总结

HTML5虽然给出了一系列的标准,但是各大浏览器厂商还是支持的程度不一样,就拿CSS3的动画来说,以前为了兼容,animate还要写N个一样的代码,这非常的尴尬。现在的主流浏览器应该区别都不大了,但是!!Android的各种版本碎片化任旧是一大难题,而且目前所做的h5基本上都在微信上,微信的浏览器不同机型也会有各种坑,主要解决的也是各种效果的兼容以及视觉统一。上面的示例就在我android手机上是异常的,目测主要是不支持svg,好在微信上效果还是不错的。

素材加载保证了整个页面流程的用户体验,网速、素材大小、视觉效果设计都会对此有影响,得益于缓存机制,绝大多数情况用户只会经历一次煎熬。加载的过程给予用户一些惊喜,用户也许就会在第一时间爱上,就拿示例的小狗来说,其实我第一次看到这个CSS动画是感觉惊艳的,非常好玩,拿来做加载动画未尝不可(前提是要有实力弄出来…)。

相信大家注意到了SoundJS的厉害之处,下一篇将讲述一下h5音频和视频播放技术和遇到的坑。

demo地址:

https://github.com/leestar54/h5-demo/blob/master/loading.html

那些H5用到的技术(1)——素材加载的更多相关文章

  1. seo网页加速技术,预加载 DNS Prefetching 详解

    seo网页加速技术,预加载 DNS Prefetching 详解 DNS Prefetching 是什么 : DNS 是什么-- Domain Name System,域名系统,作为域名和IP地址相互 ...

  2. 前端提升生产力系列三(vant3 vue3 移动端H5下拉刷新,上拉加载组件的封装)

    | 在日常的移动端开发中,经常会遇到列表的展示,以及数据量变多的情况下还会有上拉和下拉的操作.进入新公司后发现移动端好多列表,但是在看代码的时候发现,每个列表都是单独的代码,没有任何的封装,都是通过v ...

  3. 基于zepto的H5/移动端tab切换触摸拖动加载更多数据

    以前实现移动端的滑动加载更多实现的方法是当滚动条快到页面底部时就自动加载更多的数据,在这方面很多人都用的是"西门的后花园"写的一个叫dropload的插件,这个插件用起来也很好,很 ...

  4. H5 缓存机制浅析 移动端 Web 加载性能优化

    腾讯Bugly特约作者:贺辉超 1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储, ...

  5. Android 插件技术:动态加载dex技术初探

    1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...

  6. [技术翻译]预加载响应式图像,从Chrome 73开始实现

    本次预计翻译三篇文章如下: 01.[译]9个可以让你在2020年成为前端专家的项目 02.[译]预加载响应式图像,从Chrome 73开始实现 03.[译]您应该知道的13个有用的JavaScript ...

  7. 使用jquery插件实现图片延迟加载技术(懒加载)

    有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...

  8. 高性能页面加载技术(流水线加载)BigPipe的C#简单实现(附源码)

    一,BigPipe简介 BigPipe是一个重新设计的基础动态网页服务体系.大体思路是,分解网页成叫做Pagelets的小块,然后通过Web服务器和浏览器建立管道并管理他们在不同阶段的运行.这是类似于 ...

  9. 框架技术--Spring自动加载配置

    今天项目中遇到一个问题,一个方法在服务启动后会自动被执行,查看了下配置未发现有定时的配置.但是后来发现是spring配置了启动时默认加载了方法. 代码: <?xml version=" ...

随机推荐

  1. (二)ASP.NET中JavaScript的中英文(多语言)实现方案(二)

    在ASP.NET中JavaScript的中英文(多语言)实现方案中简单的介绍了js实现多语言的一种方案.下面将要讲述另外一种方法,尽管很相似,但是有些地方也是需要细细琢磨的,不说了,先看看. 在Lan ...

  2. 阿里云云主机添加swap分区与swap性能优化

    1.swap的功能与相应内核参数 Linux 将物理内存分为内存段的部分被称作“页面”.交换是指内存页面被复制到预先设定好的硬盘空间(叫做交换空间)的过程,目的是释放用于页面的内存.物理内存和交换空间 ...

  3. yum使用,使用rpm指令安装rpm,使用dpkg指令安装deb

    yum安装时如果报错提示安装失败,缺少库文件,可以使用: yum whatprovides 库名 之后安装提供的程序 yum remove xxx卸载 yum update 更新 解决 Require ...

  4. Exception has been thrown by the target of an invocation

    I'd suggest checking for an inner exception. If there isn't one, check your logs for the exception t ...

  5. Backup--备份基础理论

    --完整备份:完整备份会备份所有数据的区和少量的日志(日志文件用于恢复数据保持数据一致性).由于差异备份需要依据最后一次完整备份,因此完整备份会清楚一些分配位图数据. --差异备份:差异备份是针对完全 ...

  6. 清北学堂(2019 4 30 ) part 3

    今天总的讲些算法,会了的话...看上去好厉害的样子: 1.老朋友动态规划DP: DP重点: 1.边界条件,开头不需处理的数据,比如斐波那契数列中的第一二项 2.转移方程,后面的项需要根据前面几项求出自 ...

  7. [转]解读Unity中的CG编写Shader系列6——不透明度与混合

    1.不透明度当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到 ...

  8. BAT机器学习面试1000题系列(41-45题)

    41.线性分类器与非线性分类器的区别以及优劣 如果模型是参数的线性函数,并且存在线性分类面,那么就是线性分类器,否则不是.常见的线性分类器有:LR,贝叶斯分类,单层感知机.线性回归常见的非线性分类器: ...

  9. mysql实际碰到问题汇总

    问题1:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in G ...

  10. 深入了解java虚拟机(JVM) 第五章 如何判断对象为垃圾对象

    本章开始学习垃圾回收的过程,垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收.垃圾回收主要又两种算法:引用计数算法和可达性分析算法. 一.引用计数算法 引用计数算 ...