APPUE
Hello! Thanks for visiting!

前端QQ交流群:14916270

HTML 编码规范

基本规范

使用符合语义的标签书写 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 会导致表单提交混乱


javascript事件

一般事件

  • onclick鼠标点击时触发此事件
  • ondblclick鼠标双击时触发此事件
  • onmousedown按下鼠标时触发此事件
  • onmouseup鼠标按下后松开鼠标时触发此事件
  • onmouseover当鼠标移动到某对象范围的上方时触发此事件
  • onmousemove鼠标移动时触发此事件
  • onmouseout当鼠标离开某对象范围时触发此事件
  • onkeypress当键盘上的某个键被按下并且释放时触发此事件
  • onkeydown当键盘上某个按键被按下时触发此事件
  • onkeyup当键盘上某个按键被按放开时触发此事件

页面相关事件

  • onabort图片在下载时被用户中断
  • onbeforeunload当前页面的内容将要被改变时触发此事件
  • onerror出现错误时触发此事件
  • onload页面内容完成时触发此事件
  • onmove浏览器的窗口被移动时触发此事件
  • onresize当浏览器的窗口大小被改变时触发此事件
  • onscroll浏览器的滚动条位置发生变化时触发此事件
  • onstop浏览器的停止按钮被按下时触发此事件或者正在下载的文件被中断
  • onunload当前页面将被改变时触发此事件

表单相关事件

  • onblur当前元素失去焦点时触发此事件
  • onchange当前元素失去焦点并且元素的内容发生改变而触发此事件
  • onfocus当某个元素获得焦点时触发此事件
  • onreset当表单中RESET的属性被激发时触发此事件
  • onsubmit一个表单被递交时触发此事件

滚动字幕事件

  • onbounce在Marquee内的内容移动至Marquee显示范围之外时触发此事件
  • onfinish当Marquee元素完成需要显示的内容后触发此事件
  • onstart当Marquee元素开始显示内容时触发此事件

编辑事件

  • onbeforecopy当页面当前的被选择内容将要复制到浏览者系统的剪贴板前触发此事件
  • onbeforecut当页面中的一部分或者全部的内容将被移离当前页面[剪贴]并移动到浏览者的系统剪贴板时触发此事件
  • onbeforeeditfocus当前元素将要进入编辑状态
  • onbeforepaste内容将要从浏览者的系统剪贴板传送[粘贴]到页面中时触发此事件
  • onbeforeupdate当浏览者粘贴系统剪贴板中的内容时通知目标对象
  • oncontextmenu当浏览者按下鼠标右键出现菜单时或者通过键盘的按键触发页面菜单时触发的事件
  • oncopy当页面当前的被选择内容被复制后触发此事件
  • oncut当页面当前的被选择内容被剪切时触发此事件
  • ondrag当某个对象被拖动时触发此事件 [活动事件]
  • ondragdrop一个外部对象被鼠标拖进当前窗口或者帧
  • ondragend当鼠标拖动结束时触发此事件,即鼠标的按钮被释放了
  • ondragenter当对象被鼠标拖动的对象进入其容器范围内时触发此事件
  • ondragleave当对象被鼠标拖动的对象离开其容器范围内时触发此事件
  • ondragover当某被拖动的对象在另一对象容器范围内拖动时触发此事件
  • ondragstart当某对象将被拖动时触发此事件
  • ondrop在一个拖动过程中,释放鼠标键时触发此事件
  • onlosecapture当元素失去鼠标移动所形成的选择焦点时触发此事件
  • onpaste当内容被粘贴时触发此事件
  • onselect当文本内容被选择时的事件
  • onselectstart当文本内容选择将开始发生时触发的事件

数据绑定

  • onafterupdate当数据完成由数据源到对象的传送时触发此事件
  • oncellchange当数据来源发生变化时
  • ondataavailable当数据接收完成时触发事件
  • ondatasetchanged数据在数据源发生变化时触发的事件
  • ondatasetcomplete当来子数据源的全部有效数据读取完毕时触发此事件
  • onerrorupdate当使用onBeforeUpdate事件触发取消了数据传送时,代替onAfterUpdate事件
  • onrowenter当前数据源的数据发生变化并且有新的有效数据时触发的事件
  • onrowexit当前数据源的数据将要发生变化时触发的事件
  • onrowsdelete当前数据记录将被删除时触发此事件
  • onrowsinserted当前数据源将要插入新数据记录时触发此事件

外部事件

  • onafterprint当文档被打印后触发此事件
  • onbeforeprint当文档即将打印时触发此事件
  • onfilterchange当某个对象的滤镜效果发生变化时触发的事件
  • onhelp当浏览者按下F1或者浏览器的帮助选择时触发此事件
  • onpropertychange当对象的属性之一发生变化时触发此事件
  • onreadystatechange当对象的初始化属性值发生变化时触发此事件

围成3D模型的JS图片旋转展示代码

转来的咯,不知道是谁写的!
一段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>

WebApp之Meta标签

对于桌面平台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


一些前端小问题汇总(不断更新中……)

这里是一些前端的小问题,之所以说它们是小问题,是因为它们完全靠记住就行,可能很多人知道,我只是把它们罗列到一起来,也是一些死的东西,做个笔记了解就行,并不是一些技术多高的东西吧,可能很多公司前端面试时你会遇到!我经常也会忘记这些,毕竟一些东西要多折腾折腾才会一直记住!

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支持


招聘WebGame前端架构师

WebGame前端架构师

工作地点: 上海
性别/年龄:不限
学历:大专及以上

工作职责:
1、负责WebGame前端架构设计,开发和维护;
2、负责前端开发标准、规范的制定;
3、关注性能,能够为全站性能提升、技术运用合理性给出专业指导意见,勤于技术创新、勤于布道;

职位要求:
1、2年以上web开发和前端开发经验,有大型网站的前端架构实践经验,深入了解其开发思想;
2、熟悉CSS 3.0(有相关经验者优先);
3、在CSS熟练的基础上会js优先
4:有解决问题、钻研新技术的兴趣和能力,善于交流和表达,有良好的团队合作精神;
5:对业内新技术及趋势有较强的敏感度;
6:有一定审美基础,善于沟通,乐于分享。

有意者直接邮件:enuobear@gmail.com
如果你有以上没有提到的任何技能,都是你的优势。
如果你觉得自己够强大,够靠谱,够热情,你可以忽略以上描述,直接来和我们面谈。
我们注重技术,但更注重人。

Touch的处理

本文作者: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代码

  1. .spirit {              / * 方块的class名称*/
  2. position: absolute;
  3. width: 50px;
  4. height: 50px;
  5. background-color: red;
  6. }

然后,在body下定义一个接收事件的容器,这里body的height必须是100%才能占满整个viewport:

Html代码

  1. <body style=”height: 100%;margin:0;padding:0”>
  2. <div id=”canvas”  style=”position: relative;width:100%;height: 100%;”></div>
  3. </body>

定义touchstart的事件处理函数,并绑定事件:

Javascript代码

  1. // define global variable
  2. var canvas = document.getElementById(“canvas”),
  3. spirit, startX, startY;
  4. // touch start listener
  5. function touchStart(event) {
  6. event.preventDefault();
  7. if (spirit ||! event.touches.length) return;
  8. var touch = event.touches[0];
  9. startX = touch.pageX;
  10. startY = touch.pageY;
  11. spirit = document.createElement(“div”);
  12. spirit.className = “spirit”;
  13. spirit.style.left = startX;
  14. spirit.style.top = startY;
  15. canvas.appendChild(spirit);
  16. }
  17. // add touch start listener
  18. 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代码

  1. function touchMove(event) {
  2. event.preventDefault();
  3. if (!spirit || !event.touches.length) return;
  4. var touch = event.touches[0],
  5. x = touch.pageX – startX,
  6. y = touch.pageY – startY;
  7. spirit.style.webkitTransform = ’translate(‘ + x + ’px, ’ + y + ’px)’;
  8. }
  9. Canvas.addEventListener(“touchmove”, touchMove, false);

在touch move listener中,我们使用webkit特有的css属性:webkitTransform来移动方块,这个属性具体怎么用请google之。建议构造面向iOS设备的网页的时候尽量使用webkit自己的特性,不但炫,更可以直接利用硬件来提高性能。

最后,我们处理touchend事件。手指提起的时候方块从屏幕上移除。

Javascript代码

  1. function touchEnd(event) {
  2. If (!spirit) return;
  3. canvas.removeChild(spirit);
  4. spirit = null;
  5. }
  6. 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站点是一个应该经常光顾的地方。


十年前那点破事儿

十年前,央视热捧了三位好学生,猛批韩寒。如今,他们的各自去向和情况如下:
马楠:美国总统克林顿访华时,向克林顿表达对美国的不满,引起中国人叫好。十年后,拿着美国绿卡,嫁了美国老公。
哈佛少女刘亦婷:十年前,准备报效祖国,中国很多人的希望。十年后到了美国做基金副总裁,嫁了美国人。
黄思路:十年前,中考高考参考书上封面都是她,在节目上歌颂中国教育的好来反衬辍学生韩寒。十年后,北大毕业到了哥伦比亚(讽刺吧?),老公也是白人。(还是白人!)
韩寒:十年前,一个不知道天高地厚的小子,被中国人认为破坏80后形象的第一人。十年后,现在在中国,被认为是年青一代最有良心的知识分子


看完后想10秒钟,你会改变自己!

有一对兄弟,他们的家住在80层楼上。有一天他们外出旅行回家,发现大楼停电了!虽然他们背着大包的行李,但看来没有什么别的选择,于是哥哥对弟弟说,我们就爬楼梯上去!于是,他们背着两大包行李开始爬楼梯。爬到20楼的时候他们开始累了,哥哥说“包包太重了,不如这样吧,我们把包包放在这里,等来电后坐电梯来拿。”于是,他们把行李放在了20楼,轻松多了,继续向上爬。

他们有说有笑地往上爬,但是好景不长,到了40楼,两人实在累了。想到还只爬了一半,两人开始互相埋怨,指责对方不注意大楼的停电公告,才会落得如此下场。他们边吵边爬,就这样一路爬到了60楼。到了60楼,他们累得连吵架的力气也没有了。弟弟对哥哥说,“我们不要吵了,爬完它吧。”于是他们默默地继续爬楼,终于80楼到了!兴奋地来到家门口兄弟俩才发现他们的钥匙留在了20楼的包包里了。

有人说,这个故事其实就是反映了我们的人生:20岁之前,我们活在家人、老师的期望之下,背负着很多的压力、包袱,自己也不够成熟、能力不足,因此步履难免不稳。20岁之后,离开了众人的压力,卸下了包袱,开始全力以赴地追求自己的梦想,就这样愉快地过了20年。可是到了40岁,发现青春已逝,不免产生许多的遗憾和追悔,于是开始遗憾这个、惋惜那个、抱怨这个、嫉恨那个,就这样在抱怨中度过了20年。到了60岁,发现人生已所剩不多,于是告诉自己不要在抱怨了,就珍惜剩下的日子吧!于是默默地走完了自己的余年。到了生命的尽头,才想起自己好象有什么事情没有完成,原来,我们所有的梦想都留在了20岁的青春岁月。

闭上眼睛,仔细想想,我的梦想是什么?