SlideShare a Scribd company logo
1 of 150
Download to read offline
移动Web开发
 最佳实践
          拔⾚ & 完颜
F2E of Taobao & eTao
         2012-07-07
拔⾚
             F2E of Taobao
    http://jayli.github.com
Web Developer & Translator
                              完颜
                              F2E of eTao
                              http://weibo.com/mario
1999      2005   2008



       移动设备的演化
纠结的去学习 Objective-C
万维⽹
www
万维⽹
www
• 平台选择
• MediaQuery
• ⽂字排版
• 流体布局
• 图⽚载⼊
• Dom操作性能优化
• 触屏事件
•…
         响应式设计⼩组




 http://wiki.ued.taobao.net/doku.php?id=ued.bj:f2e:rd
http://www.alistapart.com/articles/responsive-web-design
响应式设计独特之处

•   ⼀套项⽬代码
•   ⼀套开发环境
•   ⼀个URL
•   内容所见即所得
•   不会因为终端升级⽽导致不可⽤
•   …
320
480
768
1024
偷懒的做法…
   ⼀种偷懒的做法是:等⽐缩放
但等⽐缩放后的页⾯⽂字像蚂蚁⼀样看不清楚
布局
     百分⽐宽度+ 容器 浮动

      .wrapper {
            width:100%;
      }

      .wrapper .item {
            float:left;
      }
960px




520px            200px          200px




          20px           20px


        定宽布局
90%




50%         20%        20%




       5%         5%


      流体布局
http://wiki.ued.taobao.net
http://taobao.7m.cn/
复杂的页⾯怎么办?
功能减法
Fewer Features
样式1   样式2   样式3




                  更⾼
                  分辨
                  率的
                  样式
http://wt.taobao.com
查看源码
       ViewPort Meta


  <meta name="viewport"
        content="
              width=device-width,
              initial-scale=1">
ViewPort Meta 参数

 • width=device-width
 • user-scalable=1
 • initial-scale=1
 • maximum-scale=1
 • minimum-scale=1
Layout
                    viewport




Visual viewport
= Layout viewport
ViewPort 参数最佳组合
<meta name="viewport"
      content="
            width=device-width,
            initial-scale=1,
            maximum-scale=1">

<meta name="viewport"
      content="
            width=device-width,
            initial-scale=1">
ViewPort 参数最佳组合
<meta name="viewport"
      content="
            width=device-width,
            initial-scale=1,
            maximum-scale=1">

<meta name="viewport"
      content="
            width=device-width,
            initial-scale=1">
Media Query CSS
/* PC宽屏样式 */

/* iPad 及以下,所有小于(不等于)960宽度的平板电脑 */
@media only screen and (max-width: 959px) {}

/* 仅iPad 竖版,所有小于(不等于)960宽度的平板电脑的竖版 */
@media only screen and (min-width: 768px) and (max-width: 959px) {}

/* iPhone 及以下 */
@media only screen and (max-width: 767px) {}

/* 仅iPhone 横版,包括某些平板电脑的竖版 */
@media only screen and (min-width: 480px) and (max-width: 767px) {}

/* 仅iphone4 竖版 */
@media only screen and (max-width: 479px) {}
MediaQuery书写思路

 • 先写⾼分辨率样式
 • 先写低分辨率样式
MediaQuery书写思路

 • 先写⾼分辨率样式
 • 先写低分辨率样式


  哪种写法更适合?
MediaQuery书写思路

 • 先写⾼分辨率样式
 • 先写低分辨率样式
原因?

1,设计师设计原型往往⾸先基于宽屏
 甚⾄不会给出适配设计稿

2,宽屏视觉元素更多,减法⽐加法容易
Skeleton CSSGrid System
   http://www.getskeleton.com
reset.css
                     字体样式定义
body {
         font-family:
                tahoma,arial,5b8b4f53,sans-serif;
}


    html {
             -webkit-text-size-adjust: 100%;
    }
iOS:华⽂细黑 + Helvetica




Android:⽂泉驿微⽶黑 + Droid Sans
响应式图⽚
有两种基本的图⽚类型需要考虑

 1,需要缩放的图⽚
 2,不能缩放的图⽚




 1.           2.
http://www.flickr.com/photos/zhangsj/6126931247/
HighRes.png
HighRes.png




LowRes.png
<style>
.selector-to-img{
       width:100px;height:100px;
       background:url('img-pc.png‘) no-repeat center;
}
@media only screen and /*tablet*/ {
       background:url('img-tablet.png') no-repeat center;
}
@media only screen and /*mobile*/ {
       background:url('img-mobile.png') no-repeat center;
}
</style>

<img src="space.gif" class="selector-to-img" />
这样做需要2个条件

1,服务器上提供多尺⼨图⽚
  淘宝传图⼯具可以⾃动⽣成多尺⼨图⽚

2,要有⼼理准备污染html代码



                         }
       Pic_sum.jpg
       Pic_m.jpg
       Pic_b.jpg             服务器
       Pic_80x40.jpg         ⾃动⽣成
       Pic_120x120.jpg       25种尺⼨
       Pic_160x160.jpg
       …
图⽚的剪裁
http://jayli.github.com/gallery/rd/responsive.html
同⼀张图,不同的定位
http://jayli.github.com/gallery/rd/responsive.html
.pic {
         background-image:url("url.png");
         width:30px;height:30px;
}
@media only screen and /*tablet or mobile*/ {
     .pic {
            width:20px;height:20px;
            background-position:x y;
     }
}

<img src="space.gif" class="pic" />
设备适配只能在前端完成?
RESS
                  服务器端实现的“响应式”
   Responsive Design + Server Side Components
http://www.slideshare.net/4nd3rsen/ress-responsive-design-server-side-
                       components-10084972
ServerSide




           ClientSide

@media only screen and /*设备1条件*/ {
     /* 设备1样式*/
}
@media only screen and /*设备2条件*/ {
     /* 设备2样式*/
}
@media only screen and /*设备3条件*/ {
     /* 设备3样式*/
}
ServerSide
if($Device1){
         //设备1样式
        echo $style1;
}else if($Device2){
         //设备2样式
         echo $style2;
}else if($Device3){
         //设备3样式
         echo $style3;
}




     ClientSide
如果抛开“兼容性”?




针对单⼀设备做更极致的⽤户体验
http://caipiao.m.taobao.com
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
<!doctype html>
<html manifest="http://www.../pad-sport-cache.php">
<head>
<!—ViewPortMeta设置,禁止手动缩放-->
<meta name="viewport" content="
       width=device-width,
       initial-scale=1,
       maximum-scale=1">
<!--屏蔽拨号链接-->
<meta name="format-detection" content="telephone=no" />
<!--隐藏浏览器导航栏-->
<meta name="apple-mobile-web-app-capable" content="yes" />
<link rel="apple-touch-icon"
       sizes="72x72"
       href="http://cdn/img-72-72.png" />
</head>
…
http://www.taobao.com/go/chn/minfo/index.html
查看源码
         多了⼏个新属性
<meta name="apple-mobile-web-app-capable"
       content="yes">
<meta name="apple-mobile-web-app-status-bar-style"
       content="black" />
<!--不自动将地址和email转为链接-->
<meta name="format-detection"
       content="address=no;email=no" />
<!--添加到主屏时的图标-->
<link rel="apple-touch-icon-precomposed"
       href="http://cdn/img-114-114.png">
<link rel="apple-touch-startup-image"
       href="http://cdn/img-320-460.png">
查看源码
         多了⼏个新属性
<meta name="apple-mobile-web-app-capable"
       content="yes">
<meta name="apple-mobile-web-app-status-bar-style"
       content="black" />
<!--不自动将地址和email转为链接-->
<meta name="format-detection"
       content="address=no;email=no" />
<!--添加到主屏时的图标-->
<link rel="apple-touch-icon-precomposed"
       href="http://cdn/img-114-114.png">
<link rel="apple-touch-startup-image"
       href="http://cdn/img-320-460.png">
查看源码
         多了⼏个新属性
<meta name="apple-mobile-web-app-capable"
       content="yes">
<meta name="apple-mobile-web-app-status-bar-style"
       content="black" />
<!--不自动将地址和email转为链接-->
<meta name="format-detection"
       content="address=no;email=no" />
<!--添加到主屏时的图标-->
<link rel="apple-touch-icon-precomposed"
       href="http://cdn/img-114-114.png">
<link rel="apple-touch-startup-image"
       href="http://cdn/img-320-460.png">
查看源码
         多了⼏个新属性
<meta name="apple-mobile-web-app-capable"
       content="yes">
<meta name="apple-mobile-web-app-status-bar-style"
       content="black" />
<!--不自动将地址和email转为链接-->
<meta name="format-detection"
       content="address=no;email=no" />
<!--添加到主屏时的图标-->
<link rel="apple-touch-icon-precomposed"
       href="http://cdn/img-114-114.png">
<link rel="apple-touch-startup-image"
       href="http://cdn/img-320-460.png">
查看源码
         多了⼏个新属性
<meta name="apple-mobile-web-app-capable"
       content="yes">
<meta name="apple-mobile-web-app-status-bar-style"
       content="black" />
<!--不自动将地址和email转为链接-->
<meta name="format-detection"
       content="address=no;email=no" />
<!--添加到主屏时的图标-->
<link rel="apple-touch-icon-precomposed"
       href="http://cdn/img-114-114.png">
<link rel="apple-touch-startup-image"
       href="http://cdn/img-320-460.png">
将⽹页添加⾄主屏




可以将⽹页App添加⾄桌⾯,通过桌⾯图标打开App
       http://caipiao.m.taobao.com
添加到主屏的icon

         apple-touch-icon-precomposed
          添加到桌⾯时有圆⾓/⾼光修饰

         apple-touch-icon
          只处理圆⾓,没有⾼光修饰

icon原图
各⾃的显⽰效果




apple-touch-icon   apple-touch-icon-precomposed
终端事件的渐进增强

     淘宝使⽤最多的
     Slide/Switchable
     让他们⽀持touch事件

     触屏事件不要⽤
     ʼclickʼ代替
YUI Slide
http://jayli.github.com/gallery/yuislide/
触屏touch事件
if ('ontouchstart' in document.documentElement) {
        node.delegate('touchstart‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate('touchend‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate("touchmove",function(e){
              var current_x = e.touches[0].pageX;
        });
        //…
}
触屏touch事件
if ('ontouchstart' in document.documentElement) {
        node.delegate('touchstart‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate('touchend‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate("touchmove",function(e){
              var current_x = e.touches[0].pageX;
        });
        //…
}
触屏touch事件
if ('ontouchstart' in document.documentElement) {
        node.delegate('touchstart‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate('touchend‘, function(e){
              var x = e.changedTouches[0].clientX;
              //…
        });
        node.delegate("touchmove",function(e){
              var current_x = e.touches[0].pageX;
        });
        //…
}
空间位移事件

if(window.DeviceMotionEvent) {
       window.addEventListener('devicemotion',function(e){
              var acceleration = e.accelerationIncludingGravity;
              var x = acceleration.x,
                     y = acceleration.y,
                     z = acceleration.z;
              //…
       },false);
 }
HTML5 和 Native App 如何对接?
HTML5 和 Native App 如何对接?

  1,Web App 服务可以适时更新
     Native App软件更新需要重新安装 ?


  2,Web App 开发周期相对较短
     Native App和Web App之间的分⼯?
PhoneGap 提供了⼀些思路




将HTML5 App打成安装包,但包升级时⽆法⾃动更新
         http://phonegap.com/
HTML5 App + NativeApp




HTML5快速开发原型+打包⾄NativeApp框架中
HTML5 App + NativeApp
Native App




                      HTML5 App




     Far More than PhoneGap…
移动Web中的性能问题!
移动设备和浏览器性能                        概况


             型号             CPU           RAM
           iPhone 4S    双核A5 800MHZ       512M

  iOS      iPhone 4       A4 800MHZ       512M

          iPhone 3GS   S5PC100 600MHZ     256M

          Glaxy Note   Exynos 双核 1.4GHZ    1G

          Nexus One       ⾼通 1GHZ         512M
Android
          MOTO XT615     ⾼通 800MHZ        512M

          HTC Legend     ⾼通 600MHZ        384M



            常见移动设备硬件情况
iPhone
 3GS                               其他
 5%                                12%
                 iPhone
                  4S
                 29%      600MHZ          1GHZ以上
                           19%             45%



       iPhone4
                                 800MHZ
         66%
                                   24%




       iPhone硬件分布         Andoid硬件分布(CPU)



                 ⼿机淘宝2012-4⽉数据
iOS和Android版本

             版本           渲染引擎          JS引擎
            iOS 4.3+      Web Core       Nitro *
 iOS
            Older iOS     Web Core   JavaScript Core

          Android 2.2+    Web Core         V8
Android
          Older Android   Web Core   JavaScript Core
iOS 5.1
                          Android 4.0
      iOS 5.0
                          Android 2.3
      iOS 4.3
                          Android 2.2
      iOS 4.2
                          Android 3.0
      iOS 4.1




iOS版本分布         Android版本分布



    ⼿机淘宝2012-4⽉数据
So,问题是…

1,低端设备众多
2,系统分配给浏览器的资源有限
  http://is.gd/hApzIp
3,简化的浏览器实现
4,不少⽼旧引擎
5,需要⾼性能⽀持的HTML5 OPOA
然⽽,事实却更加严峻…
   和PC平台相⽐


1,性能问题会被放⼤数倍
2,很容易造成体验瓶颈
Web App 的性能优化
1. 处理性能(CPU & RAM)
   • Reflow & Repaint
   • CSS3的性能问题
   • 动画
   • JS中的内存控制
   • ⾼效的JS技巧
   • 关于电量
   • HTML5带来的优化
2. ⽹络性能 Network
需要优化的两个核⼼


1. 减少内存中存储的内容
2. 减少CPU的实时运算消耗
Reflow & Repaint
                   (Layout & Paint)




http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-
              performance-making-your-javascript-slow
      http://www-archive.mozilla.org/newlayout/doc/reflow.html
减少Reflow & Repaint

1. off-document 避免直接操作DOM
2. ⼀次性修改样式
3. 让Dom脱离⽂档流
4. 减少Dom数量和深度
5. Dom复⽤
减少Reflow & Repaint

1. off-document 避免直接操作DOM
2. ⼀次性修改样式
3. 让Dom脱离⽂档流
4. 减少Dom数量和深度
5. Dom复⽤
减少Reflow & Repaint

1. off-document 避免直接操作DOM
2. ⼀次性修改样式
3. 让Dom脱离⽂档流
4. 减少Dom数量和深度
5. Dom复⽤
1.off-document:⽂档⽚段
var fragment = document.createDocumentFragment(),
       list = [‘foo’,’bar’,’baz’],elem,contents;

for (var i = 0; i<list.length; i++){
       elem = document.createElement(‘div’);
       content = document.createTextNode(list[i]);
       fragment.appendChild(content);
}

document.body.appendChild(fragment);
1.off-document:⽂档⽚段
var fragment = document.createDocumentFragment(),
       list = [‘foo’,’bar’,’baz’],elem,contents;

for (var i = 0; i<list.length; i++){
       elem = document.createElement(‘div’);
       content = document.createTextNode(list[i]);
       fragment.appendChild(content);
}

document.body.appendChild(fragment);
1.off-document:节点克隆
var tmpnode = document.getElementById(‘container’),
      clone = tmpnode.cloneNode(true),
      list = [‘foo’,’bar’,’baz’],elem,contents;

clone.setAttribute(‘width’,’50%’);

for(var i = 0; i<list.length; i++){
       elem = document.createElement(‘div’);
       content = document.createTextNode(list[i]);
       clone.appendChild(elem);
}

original.parentNode.replaceChild(clone,original);
1.off-document:节点克隆
var tmpnode = document.getElementById(‘container’),
      clone = tmpnode.cloneNode(true),
      list = [‘foo’,’bar’,’baz’],elem,contents;

clone.setAttribute(‘width’,’50%’);

for(var i = 0; i<list.length; i++){
       elem = document.createElement(‘div’);
       content = document.createTextNode(list[i]);
       clone.appendChild(elem);
}

original.parentNode.replaceChild(clone,original);
off-document:block-none-block

  var subElem = document.create(‘div’),
         elem = document.getElementById(‘animated’);

  elem.style.display = ‘none’;
  elem.appendChild(subElem);
  elem.style.width = ‘320px’;
  elem.style.height = ‘480px’;….
  elem.style.display = ‘block’;
off-document:block-none-block

  var subElem = document.create(‘div’),
         elem = document.getElementById(‘animated’);

  elem.style.display = ‘none’;
  elem.appendChild(subElem);
  elem.style.width = ‘320px’;
  elem.style.height = ‘480px’;….
  elem.style.display = ‘block’;
2.⼀次性修改样式

<style type=“text/css”>
   div { background:white; color:black; }
   div.active { background:blue; color:white; }
</style>

<script>
       $(‘#styled’).addClass(‘active’);
</script>
3.让元素脱离⽂档流

 .selector1 {
        position:absolute;
 }

 .selector2 {
        position:fixed;
 }
4.减少Dom数量和深度




瓶颈1:节点reflow,⼦元素/后续元素都会reflow
瓶颈2:DOM尺⼨会减慢所有操作
5.DOM复⽤




建⽴Dom复⽤池,避免频繁创建和销毁;使⽤前端模板
CSS3 性能问题!




     http://simonjonsson.com/dev/css3-performance-test
http://www.pubnub.com/blog/css3-performance-optimizations
性能杀⼿

        •   ⼤字体
        •   Box shadow
        •   Text indent
        •   Gradients
        •   Background-size
        •   Translate3D & GPU硬件加速

        http://estelle.github.com/mobileperf/#slide37


   过度的使⽤会增加CPU负载
加上reflow和repaint,性能负担加倍
综合以上,思考⼀下:


 1. 为什么移动浏览器滚动时动画会
    停⽌?!

 2. 为什么我的iScroll这么卡?!
http://fav.m.taobao.com/h5proxy-fav.htm
iScroll的性能瓶颈




   iScroll滚动与原⽣滚动的性能⽐较
render(reflow+repaint)和script损耗激增

   http://fav.m.taobao.com/h5proxy-fav.htm
iScroll的性能瓶颈




空闲时iScroll的CPU损耗不⾼
http://fav.m.taobao.com/h5proxy-fav.htm
iScroll的性能瓶颈




 Scroll发⽣时,CPU急剧飙⾼
http://fav.m.taobao.com/h5proxy-fav.htm
iScroll.js
http://cubiq.org/iscroll-4
CSS3 动画性能
动画实现的⼏种形式
动画实现的原理:
  1, left/top 传统绝对定位计算
  2, CSS3 Transform 2d
  3, CSS3 Transform 3d

动画的组织⽅式:
  1, JavaScript (setInterval) 传统组织
  2, CSS3 Transition 动态补间
  3, CSS3 Animation 关键帧组织
传统的动画实现
<div id=“Test”>矩形动画,位移300px</div>

<script>
       var el = $(‘#Test’), i = 0;
       var s = setTimeout(function(){
              i += 1;
              el.css(‘top’,i+’px’);

                if(i >= 300){
                        clearTimeout(s);
                        return false;
                }
                setTimeout(arguments.callee,20);
       },20);
</script>
传统的动画实现
<div id=“Test”>矩形动画,位移300px</div>

<script>
       var el = $(‘#Test’), i = 0;
       var s = setTimeout(function(){
              i += 1;
              el.css('-webkit-transform', 'translateY('+i+'px)');

                if(i >= 300){
                        clearTimeout(s);
                        return false;
                }
                setTimeout(arguments.callee,20);
       },20);
</script>
传统的动画实现
<div id=“Test”>矩形动画,位移300px</div>

<script>
       var el = $(‘#Test’), i = 0;
       var s = setTimeout(function(){
              i += 1;
              el.css(‘-webkit-transform’,
                      'translate3d(0,'+i+'px,0)');
              if(i >= 300){
                      clearTimeout(s);
                      return false;
              }
              setTimeout(arguments.callee,20);
       },20);
</script>
CSS3 Anim 关键帧组织
.run {
         -webkit-transform:translate3d(0,300px,0);
         -webkit-animation-duration: .4s;
         -webkit-animation-iteration-count: 1;
         -webkit-animation-name:anim-top;
}

@-webkit-keyframes anim-top {
     from {
            top:0;
     }
     to {
            top:300px;
     }
}
CSS3 Anim 关键帧组织
.run {
         -webkit-transform:translate3d(0,300px,0);
         -webkit-animation-duration: .4s;
         -webkit-animation-iteration-count: 1;
         -webkit-animation-name:anim-top;
}

@-webkit-keyframes anim-top {
     from {
            -webkit-transform:translateY(0px);
     }
     to {
            -webkit-transform:translateY(300px);
     }
}
CSS3 Anim 关键帧组织
.run {
         -webkit-transform:translate3d(0,300px,0);
         -webkit-animation-duration: .4s;
         -webkit-animation-iteration-count: 1;
         -webkit-animation-name:anim-top;
}

@-webkit-keyframes anim-top {
     from {
            -webkit-transform:translate3d(0,0,0);
     }
     to {
            -webkit-transform:translate3d(0,300px,0);
     }
}
CSS3 Transition 动态补间
.test {
          top:0;
          -webkit-transition-property:top;
          -webkit-transition-duration:.4s;
          -webkit-transition-timing-function: linear;
}
.test.run {
       top:300px;
}

<script>
       $(‘.test’).addClass(‘run’);
</script>
CSS3 Transition 动态补间
.test {
          top:0;
          -webkit-transition-property:top;
          -webkit-transition-duration:.4s;
          -webkit-transition-timing-function: linear;
}
.test.run {
       -webkit-transform:translateY(300px);
}

<script>
       $(‘.test’).addClass(‘run’);
</script>
CSS3 Transition 动态补间
.test {
          top:0;
          -webkit-transition-property:top;
          -webkit-transition-duration:.4s;
          -webkit-transition-timing-function: linear;
}
.test.run {
       -webkit-transform:translate3d(0,300px,0);
}

<script>
       $(‘.test’).addClass(‘run’);
</script>
⼏种⽅式的性能对⽐
                                   iOS           Android
                           Time(ms)   smooth Time(ms)   smooth

              absolute      1400+        N    1000+       N
JavaScript   translateY     1400+        N    1000+       Y
             translate3D     690         Y    1000+       Y
              absolute       500         N     430        N
Animation    translateY      470         Y     433        Y
             translate3D     470         Y     433        Y
              absolute       430         N     408        N
Transition   translateY      470         Y     417        Y
             translate3D     460         Y     413        Y
⼏种⽅式的性能对⽐
                                   iOS           Android
                           Time(ms)   smooth Time(ms)   smooth

              absolute      1400+        N    1000+       N
JavaScript   translateY     1400+        N    1000+       Y
             translate3D     690         Y    1000+       Y
              absolute       500         N     430        N
Animation    translateY      470         Y     433        Y
             translate3D     470         Y     433        Y
              absolute       430         N     408        N
Transition   translateY      470         Y     417        Y
             translate3D     460         Y     413        Y
⼏种⽅式的性能对⽐
                                   iOS           Android
                           Time(ms)   smooth Time(ms)   smooth

              absolute      1400+        N    1000+       N
JavaScript   translateY     1400+        N    1000+       Y
             translate3D     690         Y    1000+       Y
              absolute       500         N     430        N
Animation    translateY      470         Y     433        Y
             translate3D     470         Y     433        Y
              absolute       430         N     408        N
Transition   translateY      470         Y     417        Y
             translate3D     460         Y     413        Y
⼏种⽅式的性能对⽐
                                   iOS           Android
                           Time(ms)   smooth Time(ms)   smooth

              absolute      1400+        N    1000+       N
JavaScript   translateY     1400+        N    1000+       Y
             translate3D     690         Y    1000+       Y
              absolute       500         N     430        N
Animation    translateY      470         Y     433        Y
             translate3D     470         Y     433        Y
              absolute       430         N     408        N
Transition   translateY      470         Y     417        Y
             translate3D     460         Y     413        Y
Transform-Translate3d


                                GPU硬件加速
                                性能强劲,⾦枪不倒



                                  Why?


http://www.slideshare.net/lijing00333/graphic-programming-in-js
JS code…         setInterval(anim,10);

 JS解释器(JS引擎)
                         CPU消耗
浏览器内核(渲染引擎)
                         在层层调
                         ⽤中
   X window
                                    CPU

   OS kernel
                                    GPU




               硬件        GPU空闲
JS code…

 JS解释器(JS引擎)


浏览器内核(渲染引擎)                 CSS3Transition
                CSS3 transition
                普通样式动画
                 WebGL API    CSS3 transition
   X window                   transform动画


   OS kernel



               硬件
JS code…

 JS解释器(JS引擎)


浏览器内核(渲染引擎)                 CSS3Transition
                CSS3 transition
                普通样式动画
                 WebGL API    CSS3 transition
   X window                   transform动画


   OS kernel



               硬件
                CPU计算纹理 GPU渲染纹理
GPU 加速过程


                                               CPU
          发送指令



          结果返回给浏     Memory
Browser
            览器




                                               GPU

             http://www.khronos.org/webgl/
           http://zh.wikipedia.org/wiki/纹理映射
http://m.taobao.com/
需要留意的问题
1.创建纹理并发送数据的过程很慢
 但GPU处理3D动画很快
2.Mobile Safari默认创建1个纹理
 ⼤⼩不超过1024x1024
3.创建的纹理⽣命周期仅在动画过程中存在,动画结
 束即刻销毁
4.创建或销毁纹理过程中,可能会出现闪屏
 (BUG)
解决⽅案
    • 在动画元素上设置max-width:1024px,限制纹
      理绘制范围
    • 避免⼤批量同时应⽤
    • 解决闪屏:
       -webkit-backface-visibility:hidden;
       -webkit-transform-style:preserve-3d;



       http://jsfiddle.net/besteric/NrAYy/embedded/result%2Ccss/
http://ued.taobao.com/blog/2012/01/06/Chrome渲染Transition时页面闪动Bug
JavaScript中的内存控制
      • 闭包导致循环引⽤
      • 闭包导致过长的调⽤链
      • 使⽤事件代理
      • 低效的Dom选择器
      • 减少Dom遍历范围和次数
      • 事件节流
      • …
   http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1
http://www.developer.nokia.com/Community/Wiki/JavaScript_Performance_Best_
                                  Practices
            http://www.html5rocks.com/en/tutorials/speed/quick/
关于电量
      • JPEG最省电(JPEG > PNG > GIF)
      • 图⽚数量越⼤,尺⼨越⼤,越耗电
      • Ajax等动态JS增加电量消耗
      • 加载不必要的资源导致电量浪费(JS库)
      • Reflow和repaint耗电
      • WebGL(Translate3D)耗电
      • 内存占⽤越⼤越耗电
      • 性能越差,电量消耗越快

http://www2012.wwwconference.org/proceedings/proceedings/p41.pdf
性能原则!
• 处理性能优化的核⼼是CPU和内存
• 尽⼒去减少Reflow和repaint吧
• 合理使⽤GPU加速动画渲染
• 不要过分信任和滥⽤CSS3
• 更⾼效的JavaScript⼩技巧
• 性能越好,耗电越少
• 你有更好更聪明的⽅案
• 影响和驱动设计
• 遵循前⼈的经验,站在巨⼈的肩上
• 记住,移动浏览器在现阶段仍然是个屌丝
古⽼的编程技术 vs 新式设备
扩展阅读




http://blog.cloudfour.com/css-media-query-for-mobile-is-fools-gold/
移动开发⼯具箱
•   Chrome Developer Tools
•   Mobile Perf bookmarklet
     •    Firebug Lite / Page Resources / DOM Monster / SpriteMe / CSSess /
          Zoompf
•   Yslow Mobile
•   PageSpeed Insights
•   ICY
•   iWebInspector
•   Android Webkit Console (Android 2.2+)
•   Remote Debugging for Mobile Safari
•   Weinre
•   Adobe Shadow
•   JSPerf
•   SunSpider
•   Mobile Browser Concurrency Test
另辟蹊径
从策略的⾓度,另⼀些解决⽅案
Web App模块化版本控制⽅案
                             服务端⽩名单过滤
                                                       Modernizr

             V8检测              前端辅助检测                  特性检测


                               ⽣成HEM标识




        Module A                                          Module D
                           Module         Module
                             B               C


http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-
                   engine-v8-or-jsc-is-used-at-runtime-in-andro
Clever View
                              placeholder

                              fake-src IMG



                              Current View             Scroll




                              fake-src IMG

                                  script




http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-
                              scrolling-html5
“⽹络状况嗅探”⽅案
                       前端API层
Android 2.2+                             Android 4.0+

navigator.connection            Window.performance



  固定IMG打点
   计算带宽            前端传统嗅探                  补充⽅案


                                     Offline/2G/3G/WIFI
                       ⽹络适配库
                                     ⾼/中/低



                  ⾼清图切换 等
    http://lognormal.github.com/boomerang/doc/
《⼿机淘宝HTML5 Web App项⽬最佳实践》

       更多实践详情请关注

  7⽉8⽇ TaoMobile ⽆线技术专场
         ⽞寂/左使/不台
《淘宝彩票移动项⽬开发实践》

更多移动Web OPOA 项⽬实践请关注

7⽉28⽇ D2沙龙(北京场)
         函⾕
Thanks
栋寒/完真/地极/⻁⽛/灵⽟/流⽕/函⾕
       ⼈马/夏之
⽞寂/曹纯/渚薰/张军/师影/弈天/神勋
http://www.flickr.com/photos/wintan29/3641254652/
  http://www.flickr.com/photos/samuel-leo/3550983108/sizes/s/in/photostream
http://www.flickr.com/photos/morinkovo_fotky/4168850871/sizes/z/in/photostream
             http://www.flickr.com/photos/contactink/3062292337/
             http://www.flickr.com/photos/onemillion/3979984655
               http://www.flickr.com/photos/polvero/4232984120
              http://www.flickr.com/photos/bramus/5918434508/
              http://www.flickr.com/photos/wired_gr/5824553327/
             http://www.flickr.com/photos/macprime/3204702518/
             http://www.flickr.com/photos/gpayne85/3202258029/
          http://www.flickr.com/photos/27457302@N07/3487724038/
              http://www.flickr.com/photos/gorimon/3536710606/
            http://www.flickr.com/photos/massimiliana/1436809029/
拔⾚
             F2E of Taobao
    http://jayli.github.com
Web Developer & Translator
                              完颜
                              F2E of eTao
                              http://weibo.com/mario
淘宝移动端Web开发最佳实践

More Related Content

What's hot

2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3LiviaLiaoFontech
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发iddcn
 
淘宝彩票移动项目开发实践
淘宝彩票移动项目开发实践淘宝彩票移动项目开发实践
淘宝彩票移动项目开发实践alvis-m
 
Mobile UI design and Developer
Mobile UI design and DeveloperMobile UI design and Developer
Mobile UI design and Developerjay li
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述kevin_yanggl
 
Html&css培训 舒克
Html&css培训 舒克Html&css培训 舒克
Html&css培训 舒克jay li
 
Flash对象在(X)Html中的格式和参数及安全性
Flash对象在(X)Html中的格式和参数及安全性Flash对象在(X)Html中的格式和参数及安全性
Flash对象在(X)Html中的格式和参数及安全性taobao.com
 

What's hot (8)

2021.laravelconf.tw.slides3
2021.laravelconf.tw.slides32021.laravelconf.tw.slides3
2021.laravelconf.tw.slides3
 
Vue.js
Vue.jsVue.js
Vue.js
 
高粒度模块化的前端开发
高粒度模块化的前端开发高粒度模块化的前端开发
高粒度模块化的前端开发
 
淘宝彩票移动项目开发实践
淘宝彩票移动项目开发实践淘宝彩票移动项目开发实践
淘宝彩票移动项目开发实践
 
Mobile UI design and Developer
Mobile UI design and DeveloperMobile UI design and Developer
Mobile UI design and Developer
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述
 
Html&css培训 舒克
Html&css培训 舒克Html&css培训 舒克
Html&css培训 舒克
 
Flash对象在(X)Html中的格式和参数及安全性
Flash对象在(X)Html中的格式和参数及安全性Flash对象在(X)Html中的格式和参数及安全性
Flash对象在(X)Html中的格式和参数及安全性
 

Viewers also liked

ท้องถิ่นไทย
ท้องถิ่นไทยท้องถิ่นไทย
ท้องถิ่นไทยARAM Narapol
 
Langdurig problematische gezinssituaties
Langdurig problematische gezinssituatiesLangdurig problematische gezinssituaties
Langdurig problematische gezinssituatiesCaroline Sprenkeling
 
My favorite tv show is
My favorite tv show  isMy favorite tv show  is
My favorite tv show ispizza2001
 
20141229 majalah detik_161
20141229 majalah detik_16120141229 majalah detik_161
20141229 majalah detik_161Juli Rokhmad
 
UN VIAJE EN EL TIEMPO
UN VIAJE EN EL TIEMPOUN VIAJE EN EL TIEMPO
UN VIAJE EN EL TIEMPOseandrepino
 
Riedy finalpres
Riedy finalpresRiedy finalpres
Riedy finalpresriedys
 
Finalpowerpoint
FinalpowerpointFinalpowerpoint
Finalpowerpointriedys
 
Comm 201 Presentation
Comm 201 PresentationComm 201 Presentation
Comm 201 Presentationctpowel
 
使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心Du Yamin
 
The super scientist
The super scientistThe super scientist
The super scientistpizza2001
 
Tv news archive cni
Tv news archive cniTv news archive cni
Tv news archive cniuclalibrary
 

Viewers also liked (20)

ท้องถิ่นไทย
ท้องถิ่นไทยท้องถิ่นไทย
ท้องถิ่นไทย
 
Langdurig problematische gezinssituaties
Langdurig problematische gezinssituatiesLangdurig problematische gezinssituaties
Langdurig problematische gezinssituaties
 
Smartech
SmartechSmartech
Smartech
 
My favorite tv show is
My favorite tv show  isMy favorite tv show  is
My favorite tv show is
 
20141229 majalah detik_161
20141229 majalah detik_16120141229 majalah detik_161
20141229 majalah detik_161
 
การจัดอาหารให้ลูกก่อนวัยเรียน
การจัดอาหารให้ลูกก่อนวัยเรียนการจัดอาหารให้ลูกก่อนวัยเรียน
การจัดอาหารให้ลูกก่อนวัยเรียน
 
UCLA OR12
UCLA OR12UCLA OR12
UCLA OR12
 
UN VIAJE EN EL TIEMPO
UN VIAJE EN EL TIEMPOUN VIAJE EN EL TIEMPO
UN VIAJE EN EL TIEMPO
 
Obesity powerpoint
Obesity powerpointObesity powerpoint
Obesity powerpoint
 
Driegeleding
DriegeledingDriegeleding
Driegeleding
 
Chapter1
Chapter1Chapter1
Chapter1
 
Riedy finalpres
Riedy finalpresRiedy finalpres
Riedy finalpres
 
Finalpowerpoint
FinalpowerpointFinalpowerpoint
Finalpowerpoint
 
Comm 201 Presentation
Comm 201 PresentationComm 201 Presentation
Comm 201 Presentation
 
使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心使用GoogleAppEngine建立个人信息中心
使用GoogleAppEngine建立个人信息中心
 
The super scientist
The super scientistThe super scientist
The super scientist
 
Basic stat review
Basic stat reviewBasic stat review
Basic stat review
 
Tv news archive cni
Tv news archive cniTv news archive cni
Tv news archive cni
 
การจัดอาหารให้ลูกก่อนวัยเรียน
การจัดอาหารให้ลูกก่อนวัยเรียนการจัดอาหารให้ลูกก่อนวัยเรียน
การจัดอาหารให้ลูกก่อนวัยเรียน
 
Viergeleding
ViergeledingViergeleding
Viergeleding
 

Similar to 淘宝移动端Web开发最佳实践

Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门Xiujun Ma
 
Dive into Responsive Web Design
Dive into Responsive Web DesignDive into Responsive Web Design
Dive into Responsive Web Designcncuckoo
 
Qq.com前端架构实践与思考
Qq.com前端架构实践与思考Qq.com前端架构实践与思考
Qq.com前端架构实践与思考greengnn
 
Android 4-app
Android 4-appAndroid 4-app
Android 4-applydiafly
 
TBAD F2E 2010 review
TBAD F2E 2010 reviewTBAD F2E 2010 review
TBAD F2E 2010 reviewleneli
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发leneli
 
淘宝前端开发关键词
淘宝前端开发关键词淘宝前端开发关键词
淘宝前端开发关键词jay li
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile appsAdam Lu
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介Fred Lin
 
Website Pracice Focusing on UX, Chinese
Website Pracice Focusing on UX, ChineseWebsite Pracice Focusing on UX, Chinese
Website Pracice Focusing on UX, Chinesemultiple1902
 
Backbone.js and MVW 101
Backbone.js and MVW 101Backbone.js and MVW 101
Backbone.js and MVW 101Jollen Chen
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsChieh Lin
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度kumawu
 
Axure RP Prototyping Tool
Axure RP Prototyping ToolAxure RP Prototyping Tool
Axure RP Prototyping ToolSouyi Yang
 
重构之道 触屏篇
重构之道 触屏篇重构之道 触屏篇
重构之道 触屏篇麦哥UE
 
重构之道 触屏篇
重构之道 触屏篇重构之道 触屏篇
重构之道 触屏篇麦哥UE
 
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例Kuro Hsu
 
使用Big pipe提升浏览速度v2
使用Big pipe提升浏览速度v2使用Big pipe提升浏览速度v2
使用Big pipe提升浏览速度v2kumawu
 

Similar to 淘宝移动端Web开发最佳实践 (20)

Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 
Dive into Responsive Web Design
Dive into Responsive Web DesignDive into Responsive Web Design
Dive into Responsive Web Design
 
Qq.com前端架构实践与思考
Qq.com前端架构实践与思考Qq.com前端架构实践与思考
Qq.com前端架构实践与思考
 
Android 4-app
Android 4-appAndroid 4-app
Android 4-app
 
TBAD F2E 2010 review
TBAD F2E 2010 reviewTBAD F2E 2010 review
TBAD F2E 2010 review
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发
 
淘宝前端开发关键词
淘宝前端开发关键词淘宝前端开发关键词
淘宝前端开发关键词
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
 
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介
Developer也可以做出漂亮網站 - Twitter Bootstrap/JQuery Mobile簡介
 
Website Pracice Focusing on UX, Chinese
Website Pracice Focusing on UX, ChineseWebsite Pracice Focusing on UX, Chinese
Website Pracice Focusing on UX, Chinese
 
Backbone.js and MVW 101
Backbone.js and MVW 101Backbone.js and MVW 101
Backbone.js and MVW 101
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development Fundamentals
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度
 
Axure RP Prototyping Tool
Axure RP Prototyping ToolAxure RP Prototyping Tool
Axure RP Prototyping Tool
 
重构之道 触屏篇
重构之道 触屏篇重构之道 触屏篇
重构之道 触屏篇
 
重构之道 触屏篇
重构之道 触屏篇重构之道 触屏篇
重构之道 触屏篇
 
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例
漫談 CSS 架構方法 - 以 OOCSS, SMACSS, BEM 為例
 
使用Big pipe提升浏览速度v2
使用Big pipe提升浏览速度v2使用Big pipe提升浏览速度v2
使用Big pipe提升浏览速度v2
 

淘宝移动端Web开发最佳实践