一次响应性开发实践

标签: 前端 | 发表时间:2012-08-30 20:01 | 作者:Kejun
出处:http://hikejun.com/blog

响应性开发的概念不做细述,一年前曾做过一次分享” 聊聊响应性设计和开发“。
仅仅利用media query适配样式是远远不够的,并没有考虑触屏下的行为和特有的内容组织方式的不同。简单在桌面版基础上叠加mobile版的代码,会带来请求增多、流量、性能、代码冗余等诸多方面问题。

这次从以下几个方面着手,充分发挥“响应”的灵活性,目标是得到一个更“好用”的体验。

1. 响应性的模块
原本网站的模块化程度越高越便于做响应性开发。一个page例如是这样组织的:

<%include file="path/mod1.html" args="data=data" />
<%include file="path/mod2.html" args="data=data" />

如果在手机下访问,模板系统在生成这个页面时,会在path/下找mobile.mod1.html,有则加之,否则加mod1.html。也就是说在同一目录下,会存在多个版本的模块,当前只有2种:mod1.html(桌面版),mobile.mod1.html(mobile版)

响应部分的代码,跟主站代码是放在一起的,这样更便于维护。一个页面模板的结构是这样的:

page1.html:
<%inherit file="/base.html" />

<%def name="main">
桌面版主要内容
<%include file="path/mod1.html" args="data=data" />
</%def>

<%def name="sidebar">
桌面版边栏内容
</%def>

<%def name="mobile_main">
<%block filter="collect_css">
mobile版css
</%block>
mobile版主要内容。如果可以复用,直接调${self.main()}
很多情况下内容是不同的,比如去掉不必要的模块。
</%def>

<%def name="mobile_sidebar">
mobile版底部内容
</%def>


这意味可以同时开发/维护两个版本。(同样,设计师在设计一个页面,也需要秉承mobile first的原则)
在同一目录、同一文件维护比分布在不同的仓库中要方便的多。

2. 响应性的css/js
mobile版的变化很大,在样式上并不是桌面版css+mobile版css的关系。这得益于我们之前对静态文件管理系统的改造。传统的css的组织方式是集中式的,集中在几个通用文件中,形如base.css + product.css。而我们现在的方式是base.css + mod_1.css(inline) + mod_2.css(inline) + mod_3.css(inline) … 是按需组合的形式。

这样,加上设备判断后就可以轻易变成:
mobile.base.css + mobile.mod_1.css(inline) + mobile.mod_2.css(inline) + mobile.mod_3.css(inline) …

css/js文件跟模板一样,在同一目录下分别有桌面版和mobile版。根据访问端的情况,自动适配、按需组合。这样可以得到一个更优化的mobile站。

3. 增强触屏行为和兼容桌面事件
前者是指附加触屏上特有的事件:touchstart/touchmove/touchend以及手势swip/pinch/rotate/shake。这个不是难点。

mobile浏览器和桌面浏览器的事件模型有明显差异,为了完全复用桌面版的各种js组件,首要问题是设法兼容桌面事件(click和mouse事件)。

mobile上的click和mouse事件有几个需要注意的地方:
a. click和mouse事件不会发生在不可点击的元素上,意味绑在document上的事件代理完全失效
b. mouse事件是发生在手指离开屏幕后,且顺序是mouseover > mousemove > mousedown > mouseup
c. click事件最后触发。从手指离开屏幕起,有约300多毫秒延迟,而且有可能不会被触发

见下图:

“If the user taps a clickable element, events arrive in this order: mouseover, mousemove, mousedown, mouseup, and click. The mouseout event occurs only if the user taps on another clickable item. Also, if the contents of the page changes on the mousemove event, no subsequent events in the sequence are sent.”( 出处)

android/ios不支持beforeunload事件,对unload事件的支持有些怪异,需要用pageshow/pagehide事件替代。

以上事件的差异都是要尽力消除的。解决思路是利用jQuery的special event机制覆盖掉原本的事件绑定。即:node.click(fn),mobile上转向node.touchend(fn) 。实现的代码:https://gist.github.com/3358036

4. 优化和用户体验

a.去掉了apple-mobile-web-app-capable声明。单页应用要加上,用响应式开发的加上这句体验反而不好,跳转的链接会弹出窗口打开。

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<meta name="format-detection" content="telephone=no"/>
## <meta name="apple-mobile-web-app-capable" content="yes">

b. “If the user taps a nonclickable element, no events are generated.”(引自Apple Dev Center),所以:

body {
cursor:pointer;
}

c. 设定内容中图片的最大宽:

.topic-content img {
max-width:100%;
}

d. 加载提示,感觉像异步加载。

e. application cache本身是为web app设计的,在响应式开发中的应用是不同的。
把大文件在手机端cache起来:

CACHE MANIFEST
# version 0.0.1
CACHE:
${static('/js/jquery.min.js')}
${static('/js/do.js')}
${static('/css/mobile/base.css')}
${image_url('/pics/icon/dou.png')}
${static('/css/ui/dialog.css')}
${static('/js/ui/dialog.js')}
${static('/js/mobile/jquery.mobile.events.js')}

这个文件是动态生成的,好处是当文件更新后,文件名中的签名会跟着变,也就会触发手机端app cache的更新。

判断cache更新:

if (window.applicationCache) {
window.applicationCache.addEventListener('updateready',function(){
window.applicationCache.swapCache();
}, false);
}

为了避免动态页面被cache,在一个隐藏的iframe里指定它。

f. mobile上的UI库,比桌面版更有必要。

响应式开发最大的优点是投入产出比高。可以高效的把产品向各种终端设备上部署,而且使用体验也可以做到不错。这只是探索的开始。
用手机访问: http://group.douban.com

相关 [开发 实践] 推荐:

2011彩票首页开发实践

- 红茶 - Taobao UED Team
彩票新版首页已经悄无声息的上线一个月时间,目前只在老版首页中挂了一个链接入口,没有覆盖之前的版本,这种新旧版并行的措施,一方面为了给用户提供足够的缓冲,另外一方面则是收集用户的反馈意见来完善我们的产品,使之更加贴近用户. 此次彩票首页的改版,采用语义化的html5标签来布局页面,针对不支持html5的IE系列浏览器(IE8及其以下版本),依然采用js方法激活自定义标签即可.

一次响应性开发实践

- - Kejun's Blog
响应性开发的概念不做细述,一年前曾做过一次分享” 聊聊响应性设计和开发“. 仅仅利用media query适配样式是远远不够的,并没有考虑触屏下的行为和特有的内容组织方式的不同. 简单在桌面版基础上叠加mobile版的代码,会带来请求增多、流量、性能、代码冗余等诸多方面问题. 这次从以下几个方面着手,充分发挥“响应”的灵活性,目标是得到一个更“好用”的体验.

Will Larson:Digg的开发实践和流程

- - 博客 - 伯乐在线
曾经风靡一时、估值一度达到2亿美元的 Digg,因为两年前一次失败的改版,人气大跌,并失去公众对它的关注,创始人Kevin Rose也无奈离开. 前不久,更是以50万美元的价格被 Betaworks 收购剩余资产. Will Larson曾经担任Digg的工程总监,他在一篇 博客中,回顾了Digg从2010年5月到2012年5月公司的研发团队架构和流程.

基于phonegap开发app的实践

- - CSDN博客Web前端推荐文章
app开发告一段落,期间遇到不少问题,写篇文章记录一下. 为虾米要用phonegap. 开发app,至少要考虑android和ios两个版本吧,android偶可以应付,ios表示完全木有接触过,于是时间成本、开发成本上去了. phonegap则解决了这个问题,而且对po主而言,用web开发的方式来搞app很爽啊有木有.

前端组件化开发实践

- - 美团技术团队
随着前端开发复杂度的日益提升,组件化开发应运而生,并随着 FIS、React 等优秀框架的出现遍地开花. 这一过程同样发生在美团,面临业务规模的快速发展和工程师团队的不断扩张,我们历经引入组件化解决资源整合问题、逐步增强组件功能促进开发效率、重新打造新一代组件化方案适应全栈开发和共享共建等阶段,努力“controlling complexity”.

物联网开发最佳实践

- - ITeye资讯频道
假设您已经决定开发一个 IoT 产品. 首先,您可以了解许多从移动开发演变而来的实践. 具体地讲,考虑以下这些实践:. 迭代式地设计解决方案的原型. 化身 (avatar)、服务和解耦的 API. 如果您创建过任何类型的 Web 应用程序,那么您可能已经熟悉服务的概念. 服务是应用程序提供的能力,是一个系统的传统视图,比如天气数据服务.

[译] Android 开发最佳实践

- - IT瘾-dev
Android 开发最佳实践. 从 Futurice公司Android开发者中学到的经验. 遵循以下准则,避免重复发明轮子. 若你对开发iOS或Windows Phone 有兴趣, 请看. iOS Good Practices和. Windows client Good Practices这两篇文章.

Web 开发指南:前端开发编码标准及最佳实践

- - 博客园_梦想天空
  本文向大家推荐来自 isobar(全球顶级数字公司)的前端开发编码标准和最佳实践. 这份文档涵盖 HTML、CSS 和 JavaScript 编码标准,可访问性,性能优化,浏览器兼容和测试和搜索引擎优化支持等众多内容,下面是全文目录:. 60款很酷的 jQuery 幻灯片演示和下载. 12个很棒的学习 jQuery 的网站推荐.

Struts2、Spring、Hibernate 高效开发的最佳实践

- senyo - IBM developerWorks 中国 : 文档库
Struts2、Spring、Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 IT 技术书籍中都有它们的开发教程,但是通常的教程都会让很多程序员陷入痛苦的配置与修改配置的过程. 本文利用 SSH 中的技术特性,利用 Java 反射技术,按照规约优于配置的原理,基于 SSH 设定编写了一个通用开发框架,这使得开发者可以专注于业务逻辑的开发,而不用随着业务增加而添加或修改任何配置,并且对于权限控制和日志记录也提供了方便的接口.

淘宝彩票移动项目开发实践

- - Taobao UED Team
作者按:如今越来越多的互联网产品开始在移动终端发力,终端产品越来越丰富. 但是,平台差异带来的开发成本浪费很让人头疼. 一段时间以来,淘宝彩票前端组也在努力寻求移动终端项目开发最佳实践,尽管诸多方面不甚成熟,但抛砖引玉,希望我们的总结整理会对大家有所启发. 淘宝彩票客户端产品目前有两条体系:. 1、 原生应用:包括iPhone和Andoird上原生的客户端应用.