2012 年 02 月 03 日
基本规范
使用符合语义的标签书写 HTML 文档, 选择恰当的元素表达所需的含义;
元素的标签和属性名必须小写, 属性值必须加双引号;
元素嵌套遵循 (X)HTML Strict 嵌套规则, 推荐使用Firefox插件 HTML Validator 进行检查;
正确区分自闭合元素和非自闭合元素. 非法闭合包括:<br>..</br>、<script />、<iframe />, 非法闭合会导致页面嵌套错误问题;
通过给元素设置自定义属性来存放与 JavaScript 交互的数据, 属性名格式为 data-xx (例如:data-lazyload-url)
文档模板
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Sample page</title>
<link rel="stylesheet" href="css_example_url" />
<script src="js_example_url"></script>
</head>
<body>
<div id="page">
<div id="header">
页头
</div>
<div id="content">
主体
</div>
<div id="footer">
页尾
</div>
</div>
<script>
// 你的代码
</script>
</body>
</html>
DOCTYPE
页面文档类型统一使用HTML5 DOCTYPE. 代码如下:
<!doctype html>
编码
声明方法遵循HTML5的规范.
<meta charset="utf-8" />
注释
建议对超过10行的页面模块进行注释, 以降低开发人员的嵌套成本和后期的维护成本. 例如:
<div id="sample">
...
</div> <!-- #sample END -->
<div class="sample">
...
</div> <!-- .sample END -->
元素
结构性元素
p 表示段落. 只能包含内联元素, 不能包含块级元素;
div 本身无特殊含义, 可用于布局. 几乎可以包含任何元素;
br 表示换行符;
hr 表示水平分割线;
h1-h6 表示标题. 其中 h1 用于表示当前页面最重要的内容的标题;
blockquote 表示引用, 可以包含多个段落. 请勿纯粹为了缩进而使用 blockquote, 大部分浏览器默认将 blockquote 渲染为带有左右缩进;
pre 表示一段格式化好的文本;
头部元素
title 每个页面必须有且仅有一个 title 元素;
base 可用场景:首页、频道等大部分链接都为新窗口打开的页面;
link link 用于引入 css 资源时, 可省去 media(默认为all) 和 type(默认为text/css) 属性;
style type 默认为 text/css, 可以省去;
script type 属性可以省去; 不赞成使用lang属性; 不要使用古老的这种hack脚本, 它用于阻止第一代浏览器(Netscape 1和Mosaic)将脚本显示成文字;
noscript 在用户代理不支持 JavaScript 的情况下提供说明;
文本元素
a a 存在 href 属性时表示链接, 无 href 属性但有 name 属性表示锚点;
em,strong em 表示句意强调, 加与不加会引起语义变化, 可用于表示不同的心情或语调; strong 表示重要性强调, 可用于局部或全局, strong强调的是重要性, 不会改变句意;
abbr 表示缩写;
sub,sup 主要用于数学和化学公式, sup还可用于脚注;
span 本身无特殊含义;
ins,del 分别表示从文档中增加(插入)和删除
媒体元素
img 请勿将img元素作为定位布局的工具, 不要用他显示空白图片; 必要时给img元素增加alt属性;
object 可以用来插入Flash;
列表元素
dl 表示关联列表, dd是对dt的解释; dt和dd的对应关系比较随意:一个dt对应多个dd、多个dt对应一个dd、多个dt对应多个dd, 都合法; 可用于名词/单词解释、日程列表、站点目录;
ul 表示无序列表;
ol 表示有序列表, 可用于排行榜等;
li 表示列表项, 必须是ul/ol的子元素;
表单元素
推荐使用 button 代替 input, 但必须声明 type;
推荐使用 fieldset, legend 组织表单
表单元素的 name 不能设定为 action, enctype, method, novalidate, target, submit 会导致表单提交混乱
Share your thoughts
2011 年 12 月 22 日
转来的咯,不知道是谁写的!
一段JavaScript代码,围绕成3D模型样式的JavaScript图片旋转展示代码,这里为了演示方便,将图片替换成了数字,预留出了图片的位置,这样速度快些,会HTML的朋友都知道用时候该怎么做。本图片旋转需要手功控制,每点击一下,图片旋转一次,很方便。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>图片旋转展示</title>
<style>
#show{
position:relative;
margin:20px auto;
width:800px;
border:1px solid #999999;
}
.item{
position:absolute;
height:40px;
width:60px;
background:#999;
border:1px solid #eee;
cursor:pointer;
}
</style>
<script>
var len;
var showerObj;
var listObj;
var showerWidth=800;
var showerHeight=400;
var r;
var cR=0;
var ccR=0;
var timer=0;
window.onload=function(){
showerObj=document.getElementById("show");
listObj=showerObj.getElementsByTagName("div");
len=listObj.length;
r=Math.PI/180*360/len;
for(var i=0; i<len; i++){
var item=listObj[i];
item.style.top=showerHeight/2+Math.sin(r*i)*showerWidth/2-20+"px";
item.style.left=showerWidth/2+Math.cos(r*i)*showerWidth/2-30+"px";
item.rotate=(r*i+2*Math.PI)%(2*Math.PI);
item.onclick=function(){
cR=Math.PI/2-this.rotate;
timer || (timer=setInterval(rotate,10));
}
}
var rX=showerObj.offsetLeft+showerWidth/2;
var ry=showerObj.offsetTop+showerHeight/2;
var rotate=function(){
ccR=(ccR+2*Math.PI)%(2*Math.PI);
if(cR-ccR<0) cR=cR+2*Math.PI;
if(cR-ccR<Math.PI){
ccR=ccR+(cR-ccR)/19;
}else{
ccR=ccR-(2*Math.PI+ccR-cR)/19;
}
if(Math.abs((cR+2*Math.PI)%(2*Math.PI)-(ccR+2*Math.PI)%(2*Math.PI))<Math.PI/720){
ccR=cR;
clearInterval(timer);
timer=0;
}
for(var i=0;i<len;i++){
var item=listObj[i];
var w,h;
var sinR=Math.sin(r*i+ccR);
var cosR=Math.cos(r*i+ccR);
w=60+0.6*60*sinR;
h=(40+0.6*40*sinR);
item.style.cssText +=";width:"+w+"px;height:"+h+"px;top:"+parseInt(showerHeight/2+sinR*showerWidth/2/3-w/2)+"px;left:"+parseInt(showerWidth/2+cosR*showerWidth/2-h/2)+"px;z-index:"+parseInt(showerHeight/2+sinR*showerWidth/2/3-w/2)+";";
}
}
document.getElementById("l").onclick=function(){
cR=(cR+r+2*Math.PI)%(2*Math.PI);
timer || (timer=setInterval(rotate,10));
}
document.getElementById("r").onclick=function(){
cR=(cR-r+2*Math.PI)%(2*Math.PI);
timer || (timer=setInterval(rotate,10));
}
rotate();
}
</script>
</head>
<body>
<input id="l" type="button" value="left" >
<input id="r" type="button" value="right" >
<div id="show">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">0</div>
<div class="item">a</div>
<div class="item">b</div>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
</body>
</html>
Share your thoughts
2011 年 12 月 03 日
对于桌面平台web布局中大家对meta标签再熟悉不过了,它永远位于 head 元素内部,对做SEO的朋友一定对meta有种特殊的感情吧,今天我们就来说说移动平台的meta标签,在移动平台meta标签究竟有哪些神奇的功效呢?
1、Meta 之 viewport
说到移动平台meta标签,那就不得不说一下viewport了,那么什么是viewport呢?
viewport即可视区域,对于桌面浏览器而言,viewport指的就是除去所有工具栏、状态栏、滚动条等等之后用于看网页的区域
。对于传统WEB页面来说,980的宽度在iphone上显示是很正常的,也是满屏的,但对于webapp而言,可能就有点问题了,在iphone上我们的webapp在竖屏下通常宽度都是320,这时我们320页面在iphone上显示成啥效果呢?有人可能认为iPhone不是320的宽度莫,感觉应该是满屏的吧,事实呢?我们来看一下如下布局在iPhone上的显示情况
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Meta Viewport</title>
<style type="text/css">
div,body{
padding:0;
margin:0;
}
body{
padding-top:100px;
color:#fff;
}
div{
width:320px;
height:100px;
margin:0 auto;
background:#000;
text-align:center;
font:30px/100px Arial;
}
</style>
</head>
<body>
<div>
AppUE
</div>
</body>
</html>
在iPhone上显示如图:
因此我们必须改变viewport,我们就有如下几种属性值可以设置:
width: viewport 的宽度 (范围从 200 到 10,000 ,默认为 980 像素 )
height: viewport 的高度 (范围从 223 到 10,000 )
initial-scale: 初始的缩放比例 (范围从>0到 10 )
minimum-scale: 允许用户缩放到的最小比例
maximum-scale: 允许用户缩放到的最大比例
user-scalable: 用户是否可以手动缩放
对于这些属性,我们可以设置其中的一个或者多个,并不需要你同时都设置,iPhone 会根据你设置的属性自动推算其他属性值 ,而非直接采用默认值。
如果你把initial-scale=1 ,那么 width 和 height在竖屏时自动为320*356 (不是320*480 因为地址栏等都占据空间 ),横屏时自动为 480*208。类似地 ,如果你仅仅设置了 width ,就会自动推算出initial-scale 以及height。例如你设置了 width=320 ,竖屏时 initial-scale 就是 1 ,横屏时则变成 1.5 了。 那么到底这些设置如何让 Safari 知道 ?其实很简单 ,就一个 meta ,形如 :
<meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;” />
设置了meat后我们页面将如此呈现了:
好了,我们就可以按全屏来布局我们的页面了,不用再担心页面显示的很小了!
2、Meta 之 format-detection
你明明写的一串数字没加链接样式,而iPhone会自动把你这个文字加链接样式、并且点击这个数字还会自动拨号!想去掉这个拨号链接该如何操作呢?这时我们的meta又该大显神通了,代码如下:
<meta name=”format-detection” content=”telephone=no” />
telephone=no就禁止了把数字转化为拨号链接!
telephone=yes就开启了把数字转化为拨号链接,要开启转化功能,这个meta就不用写了,在默认是情况下就是开启!
3、Meta 之 apple-mobile-web-app-capable
<meta name=”apple-mobile-web-app-capable” content=”yes” />
这meta的作用就是删除默认的苹果工具栏和菜单栏。content有两个值”yes”和”no”,当我们需要显示工具栏和菜单栏时,这个行meta就不用加了,默认就是显示。
点屏幕图标进入
未加改meta的情况(跟从url访问无异)
加了该meta的情况
4、Meta 之 apple-mobile-web-app-status-bar-style
<meta name=”apple-mobile-web-app-status-bar-style” content=”default” />
<meta name=”apple-mobile-web-app-status-bar-style” content=”black” />
<meta name=”apple-mobile-web-app-status-bar-style” content=”black-translucent” />
作用是控制状态栏显示样式
status-bar-style:black
status-bar-style:black-translucent
Share your thoughts
2011 年 09 月 03 日
这里是一些前端的小问题,之所以说它们是小问题,是因为它们完全靠记住就行,可能很多人知道,我只是把它们罗列到一起来,也是一些死的东西,做个笔记了解就行,并不是一些技术多高的东西吧,可能很多公司前端面试时你会遇到!我经常也会忘记这些,毕竟一些东西要多折腾折腾才会一直记住!
1、前端页面有哪三层构成,分别是什么?作用是什么?
结构层(由 HTML 或 XHTML 之类的标记语言负责创建)、表现层(由CSS控制)、行为层(Javascript 语言和 DOM 主宰的领域)
2、啥子是css内联式,外联式,嵌入式?
内联式就是样式的属性内容直接跟在将要修饰的html标记里,如:
<div style=”height:30px;font-size:12px;”></div>
外联式就是通过<link href=”my.css” type=”text/css” rel=”stylesheet”/> 或者 @import url(my.css); 方式引入css
嵌入式就是用<style type=”text/css”></style>方式把CSS直接写在网页中
3、去掉链接的虚线框方法
a{blr:expression(this.onFocus=this.blur());}/*只支持IE,过多使用效率低 */
a:focus{outline:none;}//FF下
其实这里还不算全部的解决方法,另篇文章里我COPY来了一份网上别人总结出来的方法,可以点这里查看
4、a链接的顺序
l-v-f-h-a 既:link-visited-focus-hover-active 这里可能大家很少用到的就是focus,这个其实也是一种链接状态,就是当你在键盘上按Tab键时获得焦点的那个链接的即时状态,遗憾的是ie并不支持(ie中按Tab键显示的效果为a:active时的状态),只有在FF,Opera等浏览器下才能看到效果。就经常性我们就会用成L-V-H-A,这个东西其实还真有点不好记,好多人觉得老是混淆特别是那个A,这里有高人把它比如成“由爱生恨” Love Hate(LV-HA),哈哈 好记了吧!
5、css hack
*: IE6-7
_: IE6
\0: IE8-9
\9: IE6-9
!important: FF、IE7-9
CSS HACK书写顺序:先写FF等非IE浏览器所需样式,其次写IE8所需样式,接着是IE7的,再接着才是IE6的!
6、list-style-type 在ie6、ie7中不显示的解决
解决方法是给项目符号腾空间,代码:li{margin-left:25px;}
7、在IE9和FF中如何改变选择文本颜色和背景色
::selection { background:色值;color:色值; } /*Ie9+,Webkit,Opera9.5+*/
::-moz-selection { background:色值;color:色值; } /*Mozilla Firefox*/
8、如何关闭iOS中键盘自动大写
在iOS中,当虚拟键盘弹出时,默认情况下键盘是开启首字母大写的功能的,移动版本webkit为input元素提供了autocapitalize属性,通过指定autocapitalize=”off”来关闭键盘默认首字母大写
9、table中word-wrap:break-word;失效怎么解决
在table加上
word-wrap:break-word;
table-layout:fixed;
10、IE6双边距
display:inline;
11、如何解决IE6及更早浏览器下当li内部元素是定义了display:block的内联元素时底部产生空白的问题?
BUG重现:
a,span{display:block;background:#ddd;}
<ul>
<li><a href="http://www.appue.com/">AppUE</a></li>
<li><a href="http://www.appue.com/">AppUE</a></li>
<li><a href="http://www.appue.com/">AppUE</a></li>
<li><span>测试li内部元素为设置了display:block的内联元素时底部产生空白</span></li>
</ul>
如上代码,IE6及更早浏览器每个li内部的内联元素底部都会产生空白。解决方案是给li内部的内联元素再加上zoom:1
12、如何解决IE7及更早浏览器下子元素相对定位时父元素overflow属性的auto|hidden失效的问题?
div{overflow:auto;width:260px;height:80px;border:1px solid #ddd;}
p{position:relative;margin:0;}
<div>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
<p>如果我是相对定位,我的父元素overflow属性设置为auto|hidden将失效。如果你使用的是IE及更早浏览器,你将可以看到这个BUG</p>
</div>
如上代码,在IE7及更早浏览器下你会看到div的滚动条将无法工作。解决方案是给div也设置相对定位position:relative
13、如何清除图片下方出现几像素的空白间隙?
方法1:
img{display:block;}
方法2:
img{vertical-align:top;}除了top值,还可以设置为text-top | middle | bottom | text-bottom,甚至特定的和
值都可以
方法3:
#img{font-size:0;line-height:0;}#img为img的父元素
14、如何让文本垂直对齐文本输入框?
input{vertical-align:middle;}
15、为什么Standard mode下IE无法设置滚动条的颜色?
html{
scrollbar-3dlight-color:#999;
scrollbar-darkshadow-color:#999;
scrollbar-highlight-color:#fff;
scrollbar-shadow-color:#eee;
scrollbar-arrow-color:#000;
scrollbar-face-color:#ddd;
scrollbar-track-color:#eee;
scrollbar-base-color:#ddd;
}
将原来设置在body上的滚动条颜色样式定义到html标签选择符上即可
16、如何使文本溢出边界不换行强制在一行内显示?
#test{
white-space:nowrap;
width:150px;
}
设置容器的宽度和white-space为nowrap即可,其效果类似<nobr>标签
17、如何使文本溢出边界显示为省略号?
(此方法Firefox5.0尚不支持):
#test{
width:150px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
首先需设置将文本强制在一行内显示,然后将溢出的文本通过overflow:hidden截断,并以text-overflow:ellipsis方式将截断的文本显示为省略号。
18、如何使连续的长字符串自动换行?
#text{
width:150px;
word-wrap:break-word;
}
word-wrap的break-word值允许单词内换行
19、如何让已知高度的容器在页面中水平垂直居中?
#test{
position:absolute;
top:50%;
left:50%;
width:200px;
height:200px;
margin:-100px 0 0 -100px;
}
20、如何让未知尺寸的图片在已知宽高的容器内水平垂直居中?
#test{
display:table-cell;
*display:block;
*position:relative;
width:200px;
height:200px;
text-align:center;
vertical-align:middle;
}
#test p{
*position:absolute;
*top:50%;
*left:50%;
margin:0;
}
#test p img{
*position:relative;
*top:-50%;
*left:-50%;
vertical-align:middle;
}
#test是img的祖父节点,p是img的父节点。Know More:未知尺寸的图片如何水平垂直居中
21、如何设置span的宽度和高度(即如何设置内联元素的宽高)?
span{
display:block;
width:200px;
height:100px;
}
要使内联元素可以设置宽高,只需将其定义为块级或者内联块级元素即可。所以方法非常多样,既可以设置display属性,也可以设置float属性,
或者position属性等等。
22、如何给一个元素定义多个不同的css规则?
.a{color:#f00;}
.b{background:#eee;}
.c{background:#ccc;}
<div class=”a b”>测试1</div>
<div class=”a c”>测试2</div>
多个规则之间使用空格分开,并且只有class能同时使用多个规则,id不可以
23、如何让某个元素充满整个页面?
html,body{
height:100%;
margin:0;
}
#test{height:100%;}
24、如何让某个元素距离窗口上右下左4边各10像素?
html,body{
height:100%;
margin:0;
}
html{
_padding:10px;
}
#test{
position:absolute;
top:10px;
right:10px;
bottom:10px;
left:10px;
_position:static;
_height:100%;
}
25、如何容器透明,内容不透明?
方法1:
.outer{
width:200px;
height:200px;
background:#000;
filter:alpha(opacity=20);
opacity:.2;
}
.inner{
width:200px;
height:200px;
margin-top:-200px;
}
<div class="outer"></div>
<div class="inner">我是不透明的内容</div>
原理是容器层与内容层并级,容器层设置透明度,内容层通过负margin或者position绝对定位等方式覆盖到容器层上
方法2:
.outer{
width:200px;
height:200px;
background:rgba(0,0,0,.2);
background:#000\9;
filter:alpha(opacity=20)\9;
}
.outer .inner{
position:relative\9;
}
<div class="outer">
<div class="inner">我是不透明的内容</div>
</div>
高级浏览器直接使用rgba颜色值实现;IE浏览器在定义容器透明的同时,让子节点相对定位,也可达到效果
26、为什么2个相邻div的margin只有1个生效?
.box1{margin:10px 0;}
.box2{margin:20px 0;}
<div class=”box1″>box1</div>
<div class=”box2″>box2</div>
本例中box1的底部margin为10px,box2的顶部margin为20px,但表现在页面上2者之间的间隔为20px,
而不是预想中的10+20px=30px,结果是选择2者之间最大的那个margin,我们把这种机制称之为“外边距合并”;
外边距合并不仅仅出现在相邻的元素间,父子间同样会出现。
简单列举几点注意事项:
外边距合并只出现在块级元素上;
浮动元素不会和相邻的元素产生外边距合并;
绝对定位元素不会和相邻的元素产生外边距合并;
内联块级元素间不会产生外边距合并;
根元素间不会产生外边距合并(如html与body间);
设置了属性overflow且值不为visible的块级元素不会与它的子元素发生外边距合并;
27、如何在文本框中禁用中文输入法?
input,textarea{ime-mode:disabled;}
ime-mode为非标准属性,写该文档时只有IE和Firefox支持
1 Comment
2011 年 08 月 01 日
WebGame前端架构师
工作地点: 上海
性别/年龄:不限
学历:大专及以上
工作职责:
1、负责WebGame前端架构设计,开发和维护;
2、负责前端开发标准、规范的制定;
3、关注性能,能够为全站性能提升、技术运用合理性给出专业指导意见,勤于技术创新、勤于布道;
职位要求:
1、2年以上web开发和前端开发经验,有大型网站的前端架构实践经验,深入了解其开发思想;
2、熟悉CSS 3.0(有相关经验者优先);
3、在CSS熟练的基础上会js优先
4:有解决问题、钻研新技术的兴趣和能力,善于交流和表达,有良好的团队合作精神;
5:对业内新技术及趋势有较强的敏感度;
6:有一定审美基础,善于沟通,乐于分享。
有意者直接邮件:enuobear@gmail.com
如果你有以上没有提到的任何技能,都是你的优势。
如果你觉得自己够强大,够靠谱,够热情,你可以忽略以上描述,直接来和我们面谈。
我们注重技术,但更注重人。
1 Comment
2011 年 05 月 26 日
本文作者:markone
水果公司的那些small and cute的设备给我们提供了前所未有的用户体验。当用户在iphone和ipad上运指如飞的时候,那些使用objective-c写出优秀应用的开发人员们心里一定充满了成就感,因为正是他们(而不是水果)让iOS的世界变的丰富多彩。然而对于我们这些以web为自己事业核心的程序员来说,这种让人欲罢不能的多触式体验似乎跟我们关系不大,因为浏览器那一小块地方就是我们和用户的全部交集了。而许多网站为了让iOS的用户能够在多触式体验下使用自己的服务,都专门花钱开发objective-c的本地程序作为自己web service的客户端。
其实,对于一个web程序员或者一个网站来说,如果你的需求仅仅是让iPhone/iPad用户能够正常使用你的服务,那现有的html4页面完全能够满足(也许需要一点点重构,但是很容易);如果再往上一点,你需要让你的web客户端看起来像是用objective-c实现的一样,也并非不可能,只需要将我们熟悉的javascript搬到iOS设备上来就行。
本文从一个多触式网页开发初学者的角度,首先简单介绍一下iOS上的浏览器(这里主要指Safari)所支持的多触式事件模型,然后将触控(Touch)这种简单的动作升级为手势(Gestrue),最后将javascript + html + css构建的应用脱离浏览器,放到iOS设备的屏幕上成为一个本地link并和植物大战僵尸放到一起。
iOS上的Safari也支持click 和mouseover等传统的交互事件,只是不推荐在iOS的浏览器应用上使用click和mouseover,因为这两个事件是为了支持鼠标点击而设计出来的。Click事件在iOS上会有半秒左右的延迟,原因是iOS要highlight接收到click的element。而mouseover/out等事件则会被手指的点击触发。所以,在iOS上,应当抛弃传统的交互事件模型而接受一个新的事件模型。Touch事件和更高级的Gesture事件,能让你的网页交互起来像native应用一样。
处理Touch事件能让你跟踪用户的每一根手指的位置。你可以绑定以下四种Touch事件:
touchstart: 手指放到屏幕上的时候触发
touchmove: 手指在屏幕上移动的时候触发
touchend: 手指从屏幕上拿起的时候触发
touchcancel: 系统取消touch事件的时候触发。至于系统什么时候会取消,不详。。
Gesture事件则是对touch事件的更高级的封装,主要处理手指slide、rotate、scale等动作,将在下一篇文章详述。
在开始描述touch事件之前,需要先描述一下多触式系统中特有的touch对象(android和iOS乃至nokia最新的meego系统都模拟了类似的对象,这里只针对iOS,因为我只有iPad可用于测试。。)。这个对象封装一次屏幕触摸,一般来自于手指。它在touch事件触发的时候产生,可以通过touch event handler的event对象取到(一般是通过event.changedTouches属性)。这个对象包括一些重要的属性:
client / clientY:触摸点相对于浏览器窗口viewport的位置
pageX / pageY:触摸点相对于页面的位置
screenX /screenY:触摸点相对于屏幕的位置
identifier: touch对象的unique ID
我们从一个单根手指触摸的实例开始进入多触式网页的世界。当一根手指放下的时候,屏幕上出现一个方块,手指移动方块也随着移动,手指提起方块消失。首先,让我们定义一下方块的css:
Javascript代码
.spirit { / * 方块的class名称*/
position: absolute;
width: 50px;
height: 50px;
background-color: red;
}
然后,在body下定义一个接收事件的容器,这里body的height必须是100%才能占满整个viewport:
Html代码
<body style=”height: 100%;margin:0;padding:0”>
<div id=”canvas” style=”position: relative;width:100%;height: 100%;”></div>
</body>
定义touchstart的事件处理函数,并绑定事件:
Javascript代码
// define global variable
var canvas = document.getElementById(“canvas”),
spirit, startX, startY;
// touch start listener
function touchStart(event) {
event.preventDefault();
if (spirit ||! event.touches.length) return;
var touch = event.touches[0];
startX = touch.pageX;
startY = touch.pageY;
spirit = document.createElement(“div”);
spirit.className = “spirit”;
spirit.style.left = startX;
spirit.style.top = startY;
canvas.appendChild(spirit);
}
// add touch start listener
canvas.addEventListener(“touchstart”, touchStart, false);
首先,我们将方块spirit作为一个全局对象,因为我们现在要测试单根手指所以屏幕上最好只有一个物体在移动(等会有多触实例)。在touchStart这个事件处理函数中,我们也首先判断了是否已经产生了spirit,也就是是否已经有一个手指放到屏幕上,如果是,直接返回。
和传统的event listener一样,多触式系统也会产生一个event对象,只不过这个对象要多出一些属性,比如这里的event.touches,这个数组对象获得屏幕上所有的touch。注意这里的event.preventDefault(),在传统的事件处理函数中,这个方法阻止事件的默认动作,触摸事件的默认动作是滚屏,我们不想屏幕动来动去的,所以先调用一下这个函数。我们取第一个touch,将其pageX/Y作为spirit创建时的初始位置。接下来,我们创建一个div,并且设置className,left,top三个属性。最后,我们把spirit对象appendChild到容器中。这样,当第一根手指放下的时候,一个红色的,50px见方的方块就放到屏幕上了。
然后,我们要开始处理手指在屏幕上移动的事件:
Javascript代码
function touchMove(event) {
event.preventDefault();
if (!spirit || !event.touches.length) return;
var touch = event.touches[0],
x = touch.pageX – startX,
y = touch.pageY – startY;
spirit.style.webkitTransform = ’translate(‘ + x + ’px, ’ + y + ’px)’;
}
Canvas.addEventListener(“touchmove”, touchMove, false);
在touch move listener中,我们使用webkit特有的css属性:webkitTransform来移动方块,这个属性具体怎么用请google之。建议构造面向iOS设备的网页的时候尽量使用webkit自己的特性,不但炫,更可以直接利用硬件来提高性能。
最后,我们处理touchend事件。手指提起的时候方块从屏幕上移除。
Javascript代码
function touchEnd(event) {
If (!spirit) return;
canvas.removeChild(spirit);
spirit = null;
}
canvas.addEventListener(“touchend”, touchEnd, false);
在你的ipad或者iphone上测试一下以上代码。如果不出意外的话,一个完整的多触式web程序就诞生了。。
这种事件处理模式虽然能够满足我们开发多触式网页应用的需求,但是start – move – end的流程有点繁琐,能不能封装一些常用的动作让我们用一个event handler就能解决问题呢。没错,Gesture事件就是为了这个目的设计出来的,它封装了手指的scale, slide, rotate等常用的动作。不过,下一章我们再来讨论这个问题。。
附件是一个更加复杂一些的例子,每根手指放下的时候都会产生一个不同颜色的方块,手指动的时候方块跟着动,手指提起的时候方块消失,请下载查看试用。
通过附件所包含的实例,我们可以看出一些较为隐蔽的特性。首先,这里我们没有再使用event.touches取所有touch的对象,而是使用event.changedTouches这个数组,用来取得所有跟本次事件相关的touch。但是,这里我发现一个奇怪的特性,不知道是我的ipad有问题还是本来就是这样,就是在有多根手指放在屏幕上的时候,如果提起一根手指,touchend事件的changedTouches中会包含所有手指的touch对象,然后,其他几根留在屏幕上的手指会重新触发touchstart,并刷新所有的touch对象(identifier都不一样了)。如果这是一个所有设备都有的特性,那么将给编程者带来一些不便,不知道水果为啥要这么处理。
对touch event的介绍我们点到为止,这里给大家推荐两篇文档:
Safari dom additions reference:
Safari web content guide:
对于有志于开发多触式网页应用的程序员来说,apple的developer站点是一个应该经常光顾的地方。
Share your thoughts
2011 年 05 月 14 日
十年前,央视热捧了三位好学生,猛批韩寒。如今,他们的各自去向和情况如下:
马楠:美国总统克林顿访华时,向克林顿表达对美国的不满,引起中国人叫好。十年后,拿着美国绿卡,嫁了美国老公。
哈佛少女刘亦婷:十年前,准备报效祖国,中国很多人的希望。十年后到了美国做基金副总裁,嫁了美国人。
黄思路:十年前,中考高考参考书上封面都是她,在节目上歌颂中国教育的好来反衬辍学生韩寒。十年后,北大毕业到了哥伦比亚(讽刺吧?),老公也是白人。(还是白人!)
韩寒:十年前,一个不知道天高地厚的小子,被中国人认为破坏80后形象的第一人。十年后,现在在中国,被认为是年青一代最有良心的知识分子
Share your thoughts
2011 年 04 月 28 日
有一对兄弟,他们的家住在80层楼上。有一天他们外出旅行回家,发现大楼停电了!虽然他们背着大包的行李,但看来没有什么别的选择,于是哥哥对弟弟说,我们就爬楼梯上去!于是,他们背着两大包行李开始爬楼梯。爬到20楼的时候他们开始累了,哥哥说“包包太重了,不如这样吧,我们把包包放在这里,等来电后坐电梯来拿。”于是,他们把行李放在了20楼,轻松多了,继续向上爬。
他们有说有笑地往上爬,但是好景不长,到了40楼,两人实在累了。想到还只爬了一半,两人开始互相埋怨,指责对方不注意大楼的停电公告,才会落得如此下场。他们边吵边爬,就这样一路爬到了60楼。到了60楼,他们累得连吵架的力气也没有了。弟弟对哥哥说,“我们不要吵了,爬完它吧。”于是他们默默地继续爬楼,终于80楼到了!兴奋地来到家门口兄弟俩才发现他们的钥匙留在了20楼的包包里了。
有人说,这个故事其实就是反映了我们的人生:20岁之前,我们活在家人、老师的期望之下,背负着很多的压力、包袱,自己也不够成熟、能力不足,因此步履难免不稳。20岁之后,离开了众人的压力,卸下了包袱,开始全力以赴地追求自己的梦想,就这样愉快地过了20年。可是到了40岁,发现青春已逝,不免产生许多的遗憾和追悔,于是开始遗憾这个、惋惜那个、抱怨这个、嫉恨那个,就这样在抱怨中度过了20年。到了60岁,发现人生已所剩不多,于是告诉自己不要在抱怨了,就珍惜剩下的日子吧!于是默默地走完了自己的余年。到了生命的尽头,才想起自己好象有什么事情没有完成,原来,我们所有的梦想都留在了20岁的青春岁月。
闭上眼睛,仔细想想,我的梦想是什么?
1 Comment