HTML5相关资源
几个HTML5的演示
想了解更多,请看
http://www.hongkiat.com/blog/48-excellent-html5-demos/
http://directguo.com/html5/#slide1
9RIA的HTML5版块有更多关于HTML5的资料,http://bbs.9ria.com/forum-52-1.html
几个HTML5的演示
想了解更多,请看
http://www.hongkiat.com/blog/48-excellent-html5-demos/
http://directguo.com/html5/#slide1
9RIA的HTML5版块有更多关于HTML5的资料,http://bbs.9ria.com/forum-52-1.html
昨天在WebRebuild大会上分享了《揭秘HTML5和CSS3》,现来总结一下。
PPT在这里:
互联网的发展总是在不断地催生新技术的产生,而HTML5和CSS3是最近一直被讨论的热门话题,对于每个互联网开发者尤其是前端开发者而言,都充满了好奇与渴望。那么HTML5和CSS3究竟有哪些让我们眼前一亮的东西呢?
HTML 5草案的前身名为Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的HTML工作团队。在2008年1月22日,第一份正式草案发布。 HTML 5是近十年来Web开发标准最巨大的飞跃。和以前的版本不同,HTML 5并非仅仅用来表示Web内容,它的新使命是将Web带入一个成熟的应用平台,在HTML 5平台上,视频,音频,图象,动画,以及同电脑的交互都被标准化。那么我们来看一下HTML5的技术概览有哪些:
HTML5新增了很多多媒体和交互性元素如video, audio,在HTML4当中如果要嵌入一个视频或是音频的话需要引入一大段的代码,还有兼容各个浏览器,而HTML5只需要通过引入一个标签就可以,就 像img标签一样方便。在页面布局和内容实现方面HTML5新增了很多结构化标签元素以及块级及语义元素,如果你要用HTML表示一个文件的上传进度条, 在 HTML5中你可以用progress这个元素来表示,它有一个value属性描述了已经完成了多少任务,还有一个属性max描述了这个任务一共需要多 少,还可以通过DOM接口得到这个进度条的position属性(只读),也就是任务完成的百分比。Youtube在HTML5技术上已经做了一个尝试,http://www.youtube.com/html5(需要翻墙) 是用HTML5做的一个DEMO,从整个页面源代码来看,非常简洁。当然HTML5也对一些元素新增了一些属性,如input和textarea的 placeholder属性,相当于输入框的输入提示,script有一个async属性会影响脚本的加载和执行。对于所有的HTML共有的属性我们通常 把它称作是“全局属性”,如class, id, tabindex, title,HTML5也新增了一些全局属性,如contenteditable, contextmenu, hidden等属性。HTML5还增加了对于微数据的支持,如HTML5新增的item, itempro, subject等属性。
当然HTML5也移除了一些表示页面展现的元素,如font, center, strike等,这些本应该是CSS来做的,所以还是很好理解的,也移除了一些影响网站可访问性的元素如frame, frameset, noframe以及一些不常用的元素如acronym,而采用abbr来表示缩写。HTML5还移除了一些影响客户端兼容性的HTML熟悉,如link的 rev属性,td的scope属性;HTML5也移除了一些表示页面展现的属性如一些元素的align,bgcolor属性。
HTML5 提供了强大的控件类型如url, email, date, tel等,强大的约束属性,如required表示必填,文件上传的accept属性,以及一些表单重复元素模型的支持,HTML5在提交表单的时候还可 以设置提交的方式为XML提交方式,这样服务器端接收到的数据将是XML格式,HTML5的表单被定义为“Web Forms 2.0”,目前opera9.5+对Web Forms 2.0的支持较为完美。
点此查看Web Forms 2.0 DEMO,需要Opera9.5+
HTML5在DOM LEVEL 2 HTML方面很多都是继承自HTMLDocument的接口,当然HTML5在DOM上也有一些值得注意的新成员,如:支持 getElementsByClassName,可以根据class类名选择元素,getSelection()将会返回当前选中的对象,在选择器上面有 两个方法querySelector和querySelectorAll可以根据 css选择符来获取要查询的元素,相当于YUI3中的Y.one和Y.all。
HTML5在Javascript上面新增了哪些API呢?
HTML5让你心动了吗?那么HTML5什么时候会成为标准呢?据说要等到2022年,这有一个很有意思的网站http://ishtml5readyyet.com/告诉你还有多少天HTML5会真正到来。
点击查看HTML5 DEMO,需要Firefox3.5+/Safari4.0+
CSS3对于我们Web开发者来说不只是新奇的技术,更重要的是这些全新概念的web应用给我们带来更多无限的可能性,也极大地提高了我们的开发效 率。我们将不必再依赖图片或者Javascript 去完成圆角、多背景、用户自定义字体、3D动画、渐变、盒阴影、文字阴影、透明度等提高Web设计质量的特色应用。
利用属性选择器我们可以根据属性值的开头或结尾很容易选择某个元素,利用兄弟选择器可以选择同级兄弟结点或紧邻下一个结点的元素,利用伪类选择器可 以选择某一类元素,CSS3在选择器上的丰富支持让我们可以灵活的控制样式,而不必为了选择某些元素给他们加上如”odd”或”even”这样的类名。
有一个调查说开发者最期待CSS3的特性是什么,最后票数最多的是“圆角”,不错,圆角这个功能可以给我们这些前端工程师省去很多时间和精力去切图 拼凑一个圆角。CSS3还支持阴影,盒阴影以及文本阴影,渐变,之前你可能是通过IE的滤镜看到过,其实CSS3实现起来更加方便。@font-face 可以自定义字体,如果用传统的方式,VD把一个带有特殊文字的设计图给你让你来实现的话你可能会把它做成一个图片,而通过CSS3用@font-face 就可以了。CSS3对于连续文本换行也新增了一个属性word-wrap,你可以设置其为normal(不换行)或break-word(换行),这解决 了连续英文字符出现页面错位的问题,也不需要后端去截取这个连续字符。使用CSS3你还可以给边框加背景,这在iphone上也有应用的例子。CSS3在 背景上支持背景调整大小,如当你用一张大图要做一个小的元素背景时可以通过background-size来调整背景图的大小来适应这个元素。CSS3支 持opacity, rgba和hsl/a, opacity和rgba的区别是opacity设置的透明对其内容也会产生影响,而rgba只对你应用的元素产生影响。CSS3在布局上对于盒模型提供 了支持,可以设置box-sizing为content-box或border-box,应用为content-box就是正常的模式,而应用为 border-box和IE5.5的盒模型很相似,即元素的宽度包括border和padding,这个在布局上可能会比较方便,不用去管到底这个元素会 占用多大的宽度,而用content-box还需要手动计算一下这个元素实际占用的宽度。
CSS3支持的动画类型有:transform(变换)、transition(过渡)和animation(动画)。你可以对特定的属性设置 transition,transiton和animation的区别不大,animation的动画是自己定义的,面向的更多的是脚本开发者,往往更加 复杂。
为了使用大部分CSS3特性,我们不得不与原来的属性一起使用生产商专有扩展。原因是直到现在,大部分浏览器只支持部分CSS3属性。最常见的私有 属性是用于Webkit核心浏览器的(比如, Safari), 它们以-webkit-开始,以及Gecko核心的浏览器(比如, Firefox),以-moz-开始,还有Konqueror (-khtml-)、Opera (-o-) 以及Internet Explorer (-ms-)都有它们自己的属性扩展(目前只有IE8支持-ms-前缀)
我觉得首先是遵循一个优雅降级的原则,比如前面谈到的圆角,我们可以针对Firefox和Safari等这些支持圆角的浏览器中应用CSS圆角,而 那些不支持CSS圆角的浏览器则显示为直角。其次就是对于不支持CSS3的浏览器可以使用Javascript来实现,如CSS3任何元素支 持:hover伪类,我们就可以对只支持链接:hover的IE6用JS来实现。最后就是在向用户或老板推广新技术的同时也要关注他们的目标与可行性,不 能为了技术而技术。
点击查看CSS3 DEMO,需要Firefox3.5+/Safari4.0+
大家还是看PPT吧,从整个大会听下来,觉得克军的演讲《分层语义话模块实践》给我的印象挺深的,同时我也很赞同他的一个观点就是HTML往往被我们所忽视但往往是最重要的一部分,可能未来的几年就是HTML的时代了。
1.form的action里无法传递参数
如<form action=”?module=trade&page=2″ method=”get”>,本来以为想当然地提交的时候会将module和page传递到后端,其实不然,只能通过<input type=”hidden” name=”module” value=”trade” /> <input type=”hidden” name=”page” value=”2″ />这种方式来提交。
PS: 当method为post的时候可以传递参数
2.创建<input>元素
本以为通过var input = document.createElement(’input’); input.name=”page”; input.type=”hidden”就可以,其实也不然,ie下只能通过document.createElement(’<input name=”page” />’); YUI就比较方便了,直接form.append(’<input type=”hidden” name=”page” />’);就可以了。
3.异步上传文件
我们知道通过Ajax无法实现上传文件,但是怎么来根据“异步”的这种机制来实现文件上传呢,参考YUI3的io-upload-iframe源码你就可以明白了,主要就是通过创建一个iframe,然后将表单提交到这个iframe里,因为form可以设置target,然后通过获取这个iframe的 contentWindow.document来获取响应。
function _create(o, c) {
var i = Y.Node.create('<iframe id="ioupload' + o.id + '" name="ioupload' + o.id + '" />');
i._node.style.position = 'absolute';
i._node.style.top = '-1000px';
i._node.style.left = '-1000px';
Y.one('body').appendChild(i);
// Bind the onload handler to the iframe to detect the file upload response.
Y.on("load", function() { _handle(o, c) }, '#ioupload' + o.id);
}
function _handle(o, c) {
var d = Y.one('#ioupload' + o.id).get('contentWindow.document'),
b = d.one('body'),
xml = (d._node.nodeType === 9),
p;
if (c.timeout) {
_clearTimeout(o.id);
}
if (b) {
// When a response Content-Type of "text/plain" is used, Firefox and Safari
// will wrap the response string with <pre></pre>.
p = b.query('pre:first-child');
o.c.responseText = p ? p.get('innerHTML') : b.get('innerHTML');
Y.log('The responseText value for transaction ' + o.id + ' is: ' + o.c.responseText + '.', 'info', 'io');
}
else if (xml) {
o.c.responseXML = d._node;
Y.log('The response for transaction ' + o.id + ' is an XML document.', 'info', 'io');
}
Y.io.complete(o, c);
Y.io.end(o, c);
// The transaction is complete, so call _destroy to remove
// the event listener bound to the iframe transport, and then
// destroy the iframe.
w.setTimeout( function() { _destroy(o.id); }, 0);
}
function _startTimeout(o, c) {
Y.io._timeout[o.id] = w.setTimeout(
function() {
var r = { id: o.id, status: ‘timeout’ };
Y.io.complete(r, c);
Y.io.end(r, c);
Y.log(’Transaction ‘ + o.id + ‘ timeout.’, ‘info’, ‘io’);
}, c.timeout);
}
function _clearTimeout(id) {
w.clearTimeout(Y.io._timeout[id]);
delete Y.io._timeout[id];
}
function _destroy(id) {
Y.Event.purgeElement(’#ioupload’ + id, false);
Y.one(’body’).removeChild(Y.one(’#ioupload’ + id));
Y.log(’The iframe transport for transaction ‘ + id + ‘ has been destroyed.’, ‘info’, ‘io’);
}
Y.mix(Y.io, {
_upload: function(o, uri, c) {
var f = (typeof c.form.id === ’string’) ? Y.config.doc.getElementById(c.form.id) : c.form.id,
fields,
// Track original HTML form attribute values.
attr = {
action: f.getAttribute(’action’),
target: f.getAttribute(’target’)
};
_create(o, c);
// Initialize the HTML form properties in case they are
// not defined in the HTML form.
_setAttrs(f, o.id, uri);
if (c.data) {
fields = _addData(f, c.data);
}
// Start polling if a callback is present and the timeout
// property has been defined.
if (c.timeout) {
_startTimeout(o, c);
Y.log(’Transaction timeout started for transaction ‘ + o.id + ‘.’, ‘info’, ‘io’);
}
// Start file upload.
f.submit();
Y.io.start(o.id, c);
……
<canvas>是html5当中的一个标签,通过Javascript来画图。
<canvas id=”canvas” width=”150″ height=”150″></canvas>
<script>
var canvas = document.getElementById(”canvas”);
var ctx = canvas.getContext(”2d”);
ctx.fillStyle = “rgb(0,0,200)”;
ctx.fillRect(10, 10, 50, 50);
</script>

这是canvas的网格,刚才的图形,x=10,y=10, width=150, height=150
不像svg, canvas仅支持一种图形-矩形,所有其它复杂的图形都是通过一些函数来组成的。
fillRect(x,y,width,height) : 画一个填充的矩形
strokeRect(x,y,width,height) : 为一个矩形描边
clearRect(x,y,width,height) : 清楚一个矩形的一部分并且设为透明
rect(x, y, width, height)
直接画矩形,当调用rect方法时moveTo会直接定位到(0,0)位置
beginPath() 创建路径的第一步是调用beginPath方法,返回一个存储路径的信息
closePath() 从当前的点到起始点闭合路径
stroke()描边路径
fill()填充路径
lineTo(x, y) 从上一个起点到(x,y)的点画线,上一个起点可以通过moveTo来指定,默认为原先路径的终点
ctx.beginPath();
ctx.moveTo(75,50);
ctx.lineTo(100,75);
ctx.lineTo(100,25);
ctx.fill();
继续阅读 »
处理ie6问题的最好策略是修复它,那么该如何去修复ie6的这些问题呢?
【计划一下你的设计并且让他们简单一些】
如果你即将开始提前计划你的设计,请花一点时间考虑一下最好的编程方案,以便可以避免一些布局问题,即使是最复杂的视觉设计也可以通过简单的代码来实现,如果你发现你用了很复杂的Markup,你最好重新看一下你的设计方案。
【使用一个正确的Doctype】
用了一个不正确的Doctype或许会触发ie6的quirks mode并且让你的页面在各个浏览器之前渲染不一致。使用以下的doctypes: HTML 4.01 Strict, HTML 4.01 Frameset, HTML 4.01 Transitional, XHTML 1.0 Strict, XHTML 1.0 Frameset, XHTML 1.0 Transitional, or XHTML 1.1
例如:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd“>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
【使用渐进增强】
渐进增强简单的意思是对所有用户来说在增加光彩之前确保基本的功能可用,一般来说,渐进增强是指在没有javascript的情况下让互联网应用程序可以工作,通过使用javascript来增加动画、Ajax效果等等;但是说到ie6,渐进增强的另一个原则是使用ie6不支持的css3,html5以及其它网络协议。
【使用CSS Reset规则】
一个简单的reset
body,div,ul,ol,li,h1,h2,h3,h4,h5,h6,form,fieldset,input,textarea,p,th,td {margin:0;padding:0;}
【为ie6使用条件注释】
<!–[if IE6]>
<link rel=”stylesheet” href=”http://domain.tld/ie6.css”
media=”screen” />
<![endif]–>
css内的ie hack
/* target IE6 */
* html #selector { color: red; }
/* filter IE6 */
html>body #selector { color: red; }
#selector {
width: 200px !important; /* target other browsers */
width: 100px; /* target IE6 and lower */
}
【清除浮动】
.clearfix:after {
content: ” “;
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix { display: inline-table; }
/* Hides from IE-mac \*/
* html .clearfix {height: 1%;}
.clearfix { display: block; }
/* End hide from IE-mac */
【IE的Javascript内存泄露】
由于ie使用它自己的内存管理,所以当操作javascript的时候没有收回内存时或许会产生内存泄露。
Douglas Crockford有一篇文章写了“preventing JavaScript memory leaks in Internet Explorer”.
Taobao Search&AD UED的元璋兄也曾经写了一篇通过try catch来防止ie的内存泄露的文章,看代码吧:
with mememory leak:
function createButton() {
var obj = document.createElement(”button”);
obj.innerHTML = “click me”;
obj.onclick = function() {
//handle onclick
}
obj.onmouseover = function() {
//handle onmouseover
}
return obj;//return a object which has memory leak problem in IE6
}
var dButton = document.getElementsById(”d1″).appendChild(createButton());
//skipped….
without mememory leak:
/**
* Use the try … finally statement to resolve the memory leak issue
*/
function createButton() {
var obj = document.createElement(”button”);
obj.innerHTML = “click me”;
obj.onclick = function() {
//handle onclick
}
obj.onmouseover = function() {
//handle onmouseover
}
//this helps to fix the memory leak issue
try {
return obj;
} finally {
obj = null;
}
}
var dButton = document.getElementsById(”d1″).appendChild(createButton());
//skipped….
引入了finally声明,finnally声明定义了一段语句,这段语句将总是在try语句块后执行完成后来执行。通过这个就可以避免内存泄露,很奇怪吧~
html5是正在起草的最新超文本标记语言,大部分的主流浏览器(ff3.5, chrome, opera, Safari)都已经支持了html5,有一句话说的好“XHTML 2: 出师未捷身先死, HTML 5:万千宠爱于一身”,我个人也比较倾向于html5这种标准,很多浏览器厂商对于html5也是表现了前所未有的热情,因此html5或许不久后将成为主流,有一个网站html5 gallery列举了一些正在使用html5的网站,可以查看一下他们的源码。那么html5有哪些新的东西呢?
【多媒体标签】
html5为作图、音频、视频引入了一组新的标签,这些标签可以让浏览器的体验更好,并且让我们在互联网上浏览媒体更加标准化。
<canvas>
canvas可以让你很容易地画矩形、曲线、直线,但是还是有一些局限,比如描边和阴影。要画图首先要在页面加入一个canvas标签,然后是通过javascript来做画图这件事。例如:
<canvas id=”the_canvas” width=”200″ height=”200″>
<p>Your browser doesn’t support the canvas tag.</p>
</canvas>
var drawingCanvas = document.getElementById(’the_canvas’);
下面是检测dom是否存在这个canvas以及浏览器是否支持canvas标签
if(drawingCanvas.getContext) {
// Create the 2D drawing canvas
var context = drawingCanvas.getContext(’2d’);
//Canvas commands go here
}
<audio>
<video>
【结构化标签】
<section>
<header>
<footer>
<nav>
<article>
<aside>
<figure>
【内联标签】
<mark>
<time>
<meter>
<progress>
新增的Form Input类型
* datetime
* datetime-local
* date
* month
* week
* time
* number
* range
* email
* url
【不建议使用的标签】
* acronym
* applet
* basefont
* big
* center
* dir
* font
* frame
* frameset
* isindex
* noframes
* noscript
* s
* strike
* tt
* u
【交互性标签】
<details>
<datagrid>
<menu>
【其它方面的变化】
新的文档类型声明
<!DOCTYPE HTML>
href属性
你可以在任何html元素上加href,让其成为可以链接的。
Asynchronous属性
通过给script加async属性来决定脚本是否异步加载,这样可以防止阻断网站。