WEB前端开发工程师的随记–黑妞HAHA

——专注web前端开发,关注用户体验

记录下blog搬家到heiniuhaha.wordpress.com

自从上周五备案号被收回后,一直不安心,因为可能下一刻heiniuhaha.cn域名就不能访问了。今天跟随玉伯搬家到heiniuhaha.wordpress.com,不用担心域名,不用担心服务器,不用担心update wordpress后blog崩溃,希望能结束这种忧心的日子,只关注blog的内容,安安心心写东西,舒舒服服学东西。

使用wordpress感受:

缺点:

速度没有之前独立域名的快,因为服务器是在国外,也有被墙的隐患,不过没有关系,咱还是会红杏出墙的.

优点:

wordpress官方提供的blog服务,服务器会比较稳定,更新比较容易,域名和空间免费,数据不容易丢失.

哇,世界真美好,突然有种解脱的感觉。

ps:玉伯新家

崩溃,我的备案号突然被注销了

工信部注销备案号的短信:

尊敬的用户宋建敏 ,您备案信息中的网站黑妞哈哈–前端开发工程师已被注销,该网站的备案号浙ICP备09037889号-1已被收回。特此通知!

工业和信息化部网站备案系统

神啊,这什么世界,弄个blog写写技术博咋就这么难?一会儿要求备案,一会儿要求提交身份证扫描件,好吧,我是安善良民,我全都满足你天朝的所谓规则,所有麻烦的要求.可是,没安生几天就彻底崩溃了.昨天(2011-02-25),正在高高兴兴看淘宝年会演出的时候,收到了这个让人愤怒的短信,我到底哪点没有满足你的要求,我哪里惹到你了?一点注销理由都没有,甚至于一点警告都没有,就被突然关闭了.难道出生在天朝就那么悲剧么?

赶紧用手机访问了下我的blog,还好,还能访问,但是已经慌兮兮了,备案号已经被注销了,随时会收回我的域名吧.无耻啊,一群不懂internet的leader管着china’s network,V5的天朝,连互联网都无人权的地方.

web前端常识之浏览器原理

一、HTTP协议定义

URL的组成

例如:http://www.alimama.com/membersvc/index.htm。它的含义如下:

HTTP 协议的基本特点:

  • 支持客户 / 服务器模式。
  • 简单快速 : 客户向服务器请求服务时 , 只需传送请求方法和路径 。 请求方法常用的有 GET 、 POST 。 每种方法规定了客户与服务器联系的类型不同 。 由于 HTTP 协议简单 , 使得 HTTP 服务器的程序规模小,因而通信速度很快。
  • 灵活: HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
  • 无连接 : 无连接的含义是限制每次连接只处理一个请求 。 服务器处理完客户的请求 , 并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态: HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面 , 在服务器不需要先前信息时它的应答就较快。

Internet的基本协议是TCP/IP协议,然而在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

二、HTTP协议通信过程

当我们在浏览器的地址栏输入“www.baidu.com”然后按回车,这之后发生了什么事,我们直接看到的是打开了对应的网页,那么内部客户端和服务端是如何通信的呢?

基于HTTP协议的客户/服务器模式的信息交换过程,它分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。

  1. URL自动解析 HTTP URL包含了用于查找某个资源的足够信息,基本格式如下:HTTP://host[“:”port][abs_path],其中HTTP表示桶盖HTTP协议来定位网络资源;host表示合法的主机域名或IP地址,port指定一个端口号,缺省80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。例如:输入www.taobao.com;浏览器会自动转换成:http://www.taobao.com/
  2. 获取IP,建立TCP连接 浏览器地址栏中输入”http://www.xxx.com/”并提交之后,首先它会在DNS本地缓存表中查找,如果有则直接告诉IP地址。如果没有则要求网关DNS进行查找,如此下去,找到对应的IP后,则返回会给浏览器。当获取IP之后,就开始与所请求的Tcp建立三次握手连接,连接建立后,就向服务器发出HTTP请求。
  3. 客户端浏览器向服务器发出HTTP请求 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令,接着以报头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。http请求由三部分组成,分别是:请求行、消息报头、请求正文。
  4. Web服务器应答,并向浏览器发送数据 客户机向服务器发出请求后,服务器会客户机回送应答,HTTP/1.1 200 OK应答的第一部分是协议的版本号和应答状态码,正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
  5. Web服务器关闭TCP连接 一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码Connection:keep-aliveTCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

四、实例分析HTTP通信

先介绍一个工具,HTTP Analyzer ,为一款实时分析 HTTP/HTTPS 数据流的工具。它可以实时捕捉HTTP/HTTPS 协议数据,可以显示许多信息(包括:文件头、内容、Cookie、查询字符窜、提交的数据、重定向的URL地址),可以提供缓冲区信息、清理对话内容、HTTP状态信息和其他过滤选项。同时还是一个非常有用的分析、调试和诊断的开发工具。

下面我们访问http://www.google.cn/ ,HTTP analyzer将抓包来分析访问浏览器和服务器通信的过程。
1、 运行HTTP Analyzer,选择菜单Action—start开始抓包;
2、 浏览器中输入 http://www.google.cn/,网页打开后,在HTTP Analyzer中选择Action—stop停止抓包;工具已经详细列出了访问的数据包信息。通过截图见到了解下抓包信息。

抓包结果和文件头信息(下图)
20100319042612739

一次请求的html正文内容(下图)
20100319042640734

本次请求是否存在cookies信息(下图)
20100319042726854
一次请求的整个数据包信息,包括头信息和正文(下图)。
20100319042747598
你会发现浏览器中只点击了一个超级链接,却发送了多个数据包。那是因为,我们请求的网页文件中有很多图片、音乐、电影等信息时,服务器返回的信息中并不直接包含图片数据,而只是保存该图片的链接,当浏览器进行解释的时候,遇到图片的url时,才向服务器发出对图片的请求信息。

下面我们来详细分析HTTP的请求和响应信息:

HTTP请求消息

当客户端和服务端建立TCP连接后,客户端就会向服务器发送一个请求信息。http 请求由三部分组成,分别是:请求行、消息报头、请求正文,如:
[1]GET / HTTP/1.1
[2]Accept: image/gif, image/x-xbitmap, imag
e/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 客户端可识别的内容类型列表。
[3]Accept-Language: zh-cn 客户端所能解释的语言:简体中文
[4]UA-CPU: x86
[5]Accept-Encoding: gzip, deflate 客户端可以解释的类型
[6]User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon; EmbeddedWB 14.52 from: http://www.bsalsa.com/ EmbeddedWB 14.52; .NET CLR 2.0.50727; InfoPath.1; CIBA) 客户端浏览器型号
[7]Host: http://www.google.cn/ 提交请求页面
[8]Connection: Keep-Alive TCP连接保持打开
[9]

该请求信息主要由4部分组成:
请求方法URI协议/版本:以上代码第[1]行“GET”表示请求方法,,“HTTP/1.1代表协议和协议的版本,HTTP请求可以使用多种请求方法,最常用的为GET和POST方法
请求报头:[2]-[8]行,包含许多有关客户端环境和请求正文的有用信息。
空行 :[9] 请求报头和请求正文之间是一个空行,这个行非常重要,表示请求报头已经结束,接下来是正文,这个行非常重要,它表示请求报头已经结束,接下来是请求正文。
请求正文:请求正文中可以包含客户提交的查询字符串信息,如用户名和密码等。这里没有。

这里有一点值得说明的是:请求方法中的GET和POST方法;
GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上,同时这个URL长度还有限制,不允许超过1k。

POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

HTTP响应消息

响应跟请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文,如:
[1]HTTP/1.1 200 OK
[2]Cache-Control: private, max-age=0
[3]Date: Fri, 27 Feb 2009 07:53:36 GMT
[4]Expires: -1
[5]Content-Type: text/html; charset=UTF-8
[6]Set-Cookie: PREF=ID=cc4a31ab6792ef2c:NW=1:TM=1235721216:LM=1235721216:S=q1hQBu-1KdamAWK-; expires=Sun, 27-Feb-2011 07:53:36 GMT; path=/; domain=.google.cn
[7]Cont
ent-Encoding: gzip
[8]Server: gws
[9]Transfer-Encoding: chunked
[10]
[11]ddc

该响应信息也以对应的4部分组成:

协议状态描述,HTTP/1.1表示协议版本,200 OK表示服务器已经成功处理了客户端发出的请求。200表示HTTP的应答码成功。HTTP应答码由3位数字构成,其中首位数字定义了应答码的类型:
1XX-信息类(Information),表示收到Web浏览器请求,正在进一步的处理中
2XX-成功类(Successful),表示用户请求被正确接收,理解和处理例如:200 OK
3XX-重定向类(Redirection),表示请求没有成功,客户必须采取进一步的动作。
4XX-客户端错误(Client Error),表示客户端提交的请求有错误 例如:404 NOT Found,意味着请求中所引用的文档不存在。
5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理:如 500

响应报头:跟请求报头一样,它指出服务器的功能,标识出响应数据的细节。
空行:也是属于响应报头和响应正文之间必须存在的一个空行,表示响应报头结束,接下来是响应正文
响应正文:也就是服务器返回的网页内容。
根据上文的描述,再结合工具实际验证一回,相信应该能对HTTP协议和其通信流程有个大致的了解。

五、扩展知识

高层协议有:文件传输协议 FTP 、电子邮件传输协议 SMTP 、域名系统服务 DNS 、网络新闻传输协议NNTP 和 HTTP 协议等。

中介由三种:代理 (Proxy) 、网关 (Gateway) 和通道 (Tunnel) ,一个代理根据 URI 的绝对格式来接受请求,重写全部或部分消息,通过 URI 的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一个通道作为不改变消息的两个连接之间的中继点 。 当通讯需要通过一个中介 ( 例如 : 防火墙等 ) 或者是中介不能识别消息的内容时,通道经常被使用。

  • 代理 (Proxy):一个中间程序 , 它可以充当一个服务器 , 也可以充当一个客户机 , 为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它 。 代理经常作为通过防火墙的客户机端的门户 , 代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
  • 网关 (Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。 网关经常作为通过防火墙的服务器端的门户 , 网关还可以作为一个协议翻译器以便存取那些存储在非HTTP 系统中的资源。
  • 通道 (Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于 HTTP 通讯,尽管通道可能是被一 个 HTT P 请求初始化的 。 当被中继的连接两端关闭时,通道便消失 。 当一个门户 (Portal)必须存在或中介 (Intermediary) 不能解释中继的通讯时通道被经常使用。

相关链接:Yahoo给出的34条网站加速方法
推荐阅读:现代浏览器揭秘(为之漫笔)

小结下dom节点操作

一、节点的定义

dom节点树

dom节点树

图中可见节点HTML文档中的每个成分都是一个节点:

  • 整个文档是一个文档节点
  • 每个HTML标签是一个元素节点
  • 包含在HTML元素中的文本是文本节点
  • 每个HTML属性是一个属性节点
  • 注释属于注释节点

备注:通过DOM,可以访问HTML文档中的每个节点。

二、节点引用

节点的绝对引用:

  • document.documentElement返回文档的根节点
  • document.activeElement返回当前文档中被击活的标签节点
  • event.fromElement返回鼠标移出的源节点
  • event.toElement返回鼠标移入的源节点
  • event.srcElement返回激活事件的源节点

节点的相对引用:(设当前对节点为node)

  • node.parentNode node.parentElement 返回父节点,document.parentNode()返回null
  • node.childNodes[1] 符合标准,返回子节点集合(包含文本节点及标签节点),文本和属性节点的childNodes永远是null.先获取长度node.childNodes.length,然后可以通过循环或者索引找到需要的节点.
    //对与文本节点的处理:
    eg:

    var myTextNodes = document.getElementById("test").childNodes;
    var count = myTextNodes.length;
    for(var i = 0; i < count; i++) {
      if(myTextNodes[i].nodeType=="3" && myTextNodes[i].nodeName!="#text"){//排除IE空白文本的节点
      alert(myTextNodes[i]);
    }
    }
    
  • node.children 不符合标准,不推荐使用,它只返回html节点,甚至不返回文本节点
  • node.firstChild返回第一个子节点,firstChild=childNodes[0]
  • node.lastChild返回最后一个子节点,lastChide=childNodes[childNodes.length-1]
  • node.nextSibling()返回同属下一个节点
  • node.previousSibling()返回同属上一个节点

三、节点操作

  • 节点定位
    getElementById(elementId)
    //寻找一个有着给定id属性值的元素,返回一个元素节点 ,document.getElementById(IDvalue)
    
    getElementsByTagName(tagName)
    //用于寻找有着给定标签名的所有元素,document.getElementsByTagName(tagName)
    
    getElementsByName(elementName)
    //在HTML中checkbox和radio都是通过相同的name属性值,来标识一个组内的元素。如果我们现在要获取被选中的元素,首先获取改组元素,然后循环判断是节点的checked属性值是否为true即可
  • 创建节点:
    document.createElement(element)
    //参数为要新添的节点标签名,egnewnode=document.createElement("div");
    
    document.createTextNode(string)
    //创建一个包含着给定文本的新文本节点,eg:document.createTextNode("hello");
    

    eg:

    var a =document.createElement("span");
    var b =document.createTextNode("cssrain");
    a.appendChild(b);
    
  • 添加节点:
    //添加子节点:
    node.appendChild(newChild) //newChild为生新增的节点.eg: document.body.appendChildNode(o) document.forms[0].appendChildNode(o)
    
    
    //插入节点
    node.insertBefore(newNode,targetNode)
    node.insertAfter(newNode,targetNode);
  • 修改节点:
    //删除节点
    node.remove()[2] //当某个节点被remove方法删除时,这个节点所包含的所有子节点将同时被删除。
    node.removeChild(node) //eg:document.body.removeChild(node)
    node.removeNode()//IE支持,但FF不支持,推荐用removeChild代替实现
    
    //替换节点
    node.replaceChild(newChild,oldChild) //oldChild节点必须是node元素的一个子节点。
    node.replaceNode() node.swapNode()//只有IE支持replaceNode与swapNode方法,其他浏览器则不支持。
    
  • 复制节点:
    //返回复制节点引用
    node.cloneNode(bool)//bool为布尔值,true / false 是否克隆该节点所有子节点 ,eg:node.cloneNode(true)
  • 获取节点信息:
    .nodeName//只读,返回节点名称,相当于tagName.
    .nodeValue//可读可写,但对元素节点不能写。返回一个字符串,指示这个节点的值。元素节点返回null,属性节点返回属性值,文本节点返回文本。一般只用于设置文本节点的值。
    .nodeType//只读,返回节点类型:1,元素节点;2,属性节点;3,文本节点。
    
    node.contains() //是否包含某节点,返回boolean值,IE支持,FF不支持contains(),但支持W3C标准compareDocumentPosition() .
    node.hasChildNodes()//是否有子节点,返回boolean值
  • 属性节点:
    setAttribute(key,value)//element.setAttribute(attributeName,attributeValue),setAttribute()方法只能用在属性节点上。
    getAttribute(key)//返回一个给定元素的一个给定属性节点的值

备注:

[1]childNodes兼容性问题说明:

用IE的调试工具会发现IE中把空格解析成“#text”,即IE会把2个标签之间只要有回车或空格的地方解析成空白文本节点,就多了个节点nodeName=”#text”。而FF中却不会。

  • 测试代码:

    //节点之间留有空格和回车
    <div id="test1">
    <div>first</div>
    <div>second</div>
    <div>third</div>
    </div>
    
    //除注释外,节点间无空格回车
    <div id="test2"><div>first</div><div>second</div><div>third</div></div>
    
    var val1=document.getElementById("test1").childNodes.length;
    var val2=document.getElementById("test2").childNodes.length;
    alert("val1="+val1+":"+"val2="+val2)
  • 测试结果:

    IE中是val1=7:val2=3
    FF中是val1=3:val2=3

  • 兼容性解决办法:

    在for循环里不妨加上:
    if(childNode.nodeName==”#text”) continue;
    或者nodeType == 1。

[2]add(),remove()兼容性问题:

注意的是add,remove方法仅用于area,controlRange,options等集合对象.

<select>
<option value="1">option1</option>
<option value="2">option2</option>
</select>
<script type="text/javascript">
function fnAdd(){//兼容IE,FF,Opera,Chrome
var oOption=document.createElement("option");
document.getElementById("#oList").options.add(oOption);
oOption.text="option3";
oOption.value="3";
}
function fnRemoveChild(){//兼容IE,FF,Opera,Chrome
document.getElementById("#oList")).removeChild(document.getElementById("#oList").lastChild);
}
function fnRemove(){
//兼容IE,FF,Opera,Chrome
document.getElementById("#oList").remove(0);
}
</script>

扩展知识:

innerHTML、outerHTML、innerText、outerText

  • 定义:

    • innerHTML设置或获取标签内的HTML,eg:获取node.innerHTML 设置node.innerHTML=”hello”
    • outerHTML设置或获取标签及标签内的HTML
    • innerText设置或获取标签内的文本
    • outerText设置(包括标签)或获取(不包括标签)对象的文本
  • 不同之处:

    innerHTML与outerHTML在设置对象的内容时包含的HTML会被解析,而innerText与outerText则不会。

    在设置时,innerHTML与innerText仅设置标签内的文本,而outerHTML与outerText设置包括标签在内的文本。

  • 注意:

    W3C 只支持innerHTML. 其他都是微软的规定.(outerHTML,outerText,innerText只有微软的IE 好使, 其他浏览器不好用(firefox, mozilla等),必须用其他方法实现)

转载请注明:https://heiniuhaha.wordpress.com/wp-content/uploads/2011/02/dom_tree.png

浅谈web标准、可用性、可访问性

前言:大家不难发现,只要是招聘UED相关的岗位,如前端开发工程师、交互设计师、用户研究员甚至视觉设计师,一般都对web标准、可用性和可访问性的理解有要求。那么到底什么是web标准、可用性、可访问性呢?

一、web标准

简单的说,就是HTML、CSS、JavaScript这三者分离。WEB标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如 W3C DOM)、ECMAScript等。

web标准的优点:

  • 代码的效率:在HTML文件中使用最精简的代码,而把样式和页面布局信息包含进CSS文件中。则放在服务器上的文件越小,下载文件需要的时间就越短。
  • 易于维护:页面的样式和布局信息保存在单独的CSS文件中,如果你想改变站点的外观时,仅需要在单独的CSS文件中做出更改即可。整站统一css则可带来巨大的便利。
  • 可访问性:上网用户中那些视力受损的人,通过屏幕阅读器使用键盘命令将网页的内容读给他们听。以语义化的HTML(结构和表现相分离的HTML)编写的网页文件,就可以让此类用户更容易导航,且网页文件中的重要信息也更有可能被这些用户找到。
  • 设备兼容性:纯HTML,无附加样式信息,可以针对具有不同特点(如屏幕尺寸等)的设备而被重新格式化,只需要引用一套另外的样式表即可。同时,CSS本身也可以让你为不同的呈现方式和媒体类型(如在屏幕上阅读网页,打印网页,在移动设备上阅读网页等)规定不同的样式表。
  • 网络爬虫/搜索引擎:搜索引擎使用“爬虫”,解析你的网页。语义化的HTML能更准确更快速的被解析,从而知道哪些才是重要的内容,那么你的网页在搜索结果中的排名就会大受影响。

二、可用性、可访问性

可访问性就是对所有人一视同仁,无论他们是否有残障。

网站的用户类型:

  • 身体健康的用户;
  • 盲人或严重视觉障碍者,他们使用屏幕阅读器来听取网站,或者通过点字显示器来感知网页;
  • 近视者,需要将字体大小放大到200%;
  • 患有运动性残疾,因此无法用手操作鼠标,而用点击棒来操作键盘,或通过视线点击器来操作网站的用户;
  • 使用移动设备如常用的手机,或使用跟踪球等不常见的计算机控制设备的用户。

实现可用性、可访问性的方法

  • 逐步强化你的网站功能,同时对支持性进行测试。运用“渐进增强”和“平稳退化”原则开发网站。
  • 允许用户关闭有问题的增强功能。
  • 提供相同内容或功能的替代版本。
  • 就客户端需要支持的技术向你的客户提出建议,并举例说明哪些公司的产品支持这些技术。

可访问性良好网页的特征

  • HTML语义化、结构化:HTML语义结构提供了网页的整体框架,提示他们在文件层级中所处的位置,还有他们可以如何与各种页面元素进行交互,以及在适当的地方对文本内容进行强调,帮助用户获得大量重要信息。如导航菜单例子:
    <ul>
    	<li>Menu Item 1</li>
    	<li>Menu Item 2</li>
    	<li>Menu Item 3</li>
    </ul>
    

    说明:通过将导航菜单构造为列表,就能很容易地让那些使用屏幕阅读器、同时无法看到列表的人知道这是个列表。因为他们的屏幕阅读器会告诉他们这是一张列表。如果你没有使用列表标记,屏幕阅读器就没办法知道这是列表,因此也就不能告诉使用者了。

  • 替代内容:文本可以作为页面内容的通用替代内容,如img标签的alt属性值、a标签的title属性值。
    <a href="http://www.alimama.com" title="淘宝联盟大促销">
    	<img alt="淘宝联盟大促销" src="images/app/sale.jpg"/>
    </a>
    

    说明:文本内容可以很方便地由屏幕阅读器朗读出来,也可以放大或缩小,还可以方便地改变其对比度,或者进行其他许多变形操作。alt 属性包含了对该图片的简短描述,以便无法准确看到该图片的用户(或搜索引擎)使用,title属性负责对链接地址的详细文本描述。

  • HTML定义基本交互:实现tab选项卡搜索功能
    <form action="search.html" method="GET">
    	<fieldset>
    		<legend>Search within:</legend>
    		 <ul>
    			<li><label for="dogs">Dogs</label><input id="dogs" type="radio" name="animal" value="dog" checked></li>
    			<li><label for="cats">Cats</label><input id="cats" type="radio" name="animal" value="cat"></li>
    			<li><label for="fish">Fish</label><input id="fish" type="radio" name="animal" value="fish"></li>
    		</ul>
    	</fieldset>
    	<input type="text" id="searchfield" name="search"/>
    	<input type="submit" value="Search"/>
    </form>
    

    说明:先考虑基本交互(而不是仅仅只加载视觉效果的部分)的话,你就可以简化实现tab搜索效果。现在我们可以只用一个表单来进行所有的搜索,而同时仍然能实现tab选项卡效果(虽然这需要一点样式和脚本)。通过 AJAX 来插入页面内容,那禁用javascript的用户将无法使用。

四个可访问性标准(WCAG 2.0):

  • 可感知:人们可以通过适合自己的媒体来获知网页内容。比如应当让盲人得以收听页面内容。例如,图像应该有文本对应体。
  • 可操作:人们可以与 web 应用程序或内容进行交互。例如,用户应该可以不用鼠标也能与某个网站进行交互,并且可以通过屏幕阅读器来进行导航。
  • 可理解:使用者可以弄懂页面内容和用户界面。例如,正文不应该比它需要的更加复杂,且网站应以可预测的方式来运行。
  • 健壮性:所提供的一切服务都应当不受平台或操作系统的限制。这样就可以避免人们提供一些不太完善的服务,这些服务会因为硬件/软件的限制而导致大多数人都无法使用。例如,不同设备上的浏览器能够一起使用网站,且导航应该是一致的。

说明:网站并不是必须满足全部这些要求,要视网站用户类型而定,但为了实现可访问性,网站应当确保其页面可以用一般的屏幕阅读技术读取。

总结:

可访问性是网站开发质量的一个衡量标准。如果你在开发网站的时候(以及开始开发前)顾及你的使用用户的话,你就能创建可用性、可访问性更好、更符合web标准的网页,并且享受它所带来的一切好处。

参考网页:
opera web标准课程
百度百科 web标准

转载请注明转自:http://www.heiniuhaha.cn/blog/?p=1378

推荐web标准经典教程(opera员工主编)

这几天在网上看web标准的相关文章,合格的前端开发工程师必须要深刻理解web标准,但发现自己一直都不是很清晰这个概念,因此希望理清下头绪,就发现了这个站点,写的非常好,比市面上的书籍写的精炼且通俗易懂多了,特地分享给大家,希望对大家也有用。
http://kb.operachina.com/?q=wsc#toc

什么是Doctype?什么是标准模式与混杂模式?

一、什么是Doctype?

DOCTYPE是Document Type(文档类型)的简写,在页面中,用来指定页面所使用的XHTML(或者HTML)的版本。要想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE声明。只有确定了一个正确的DOCTYPE,XHTML里的标识和CSS才能正常生效。
以XHTML 1.0为例:
XHTML 1.0中有3种DTD(文档类型定义)声明可以选择:过渡的(Transitional)、严格的(Strict)和框架的(Frameset)。这里分别介绍如下。

1.过渡的
一种要求不很严格的DTD,允许在页面中使用HTML4.01的标识(符合xhtml语法标准)。过渡的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

2.严格的
一种要求严格的DTD,不允许使用任何表现层的标识和属性,例如<br/>等。严格的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

3.框架的
一种专门针对框架页面所使用的DTD,当页面中含有框架元素时,就要采用这种DTD。框架的DTD的写法如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

ps:
使用严格的DTD来制作页面,当然是最理想的方式。但是,对于没有深入了解Web标准的网页设计者,比较合适的是使用过渡的DTD。因为这种DTD还允许使用表现层的标识、元素和属性,比较适合大多数网页制作人员。

二、什么是标准模式与混杂模式?

不同文档模式主要影响CSS内容的呈现,尤其是浏览器对盒模型的解析,但在某些情况下也会影响到JavaScript的解释执行。
1、文档模式目前有四种:

混杂模式(quirks mode)
 //让IE的行为与(包含非标准特性的)IE5相同
标准模式(standards mode)
//让IE的行为更接近标准行为
准标准模式(almost standards mode)
//这种模式下的浏览器特性有很多都是符合标准的,不标准的地方主要体现在处理图片间隙的时候(在表格中使用图片时问题最明显)。
超级标准模式:
//IE8引入的一种新的文档模式,超级文档模式可以让IE以其所有版本中最符合标准的方式来解释网页内容。

ps:
总的来看,混杂模式让IE像IE5,标准模式使用IE7的呈现引擎,而超级标准模式则是IE8的默认文档模式。
2、如何触发文档模式:

  • 触发混杂模式:
    如果在文档开始处没有发现文档类型声明,则所有浏览器都会默认开启混杂模式。但采用混杂模式不是什么值得推荐的做法,因为不同浏览器在这种模式下的行为差异非常大,如果不使用某些hack技术,跨浏览器的行为根本就没有一致性可言。
  • 触发标准模式:
    <!-- HTML 4.01 严格型 -->
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">
    
    <!-- XHTML 1.0 严格型 -->
    <!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  • 触发准标准模式:
    <!-- HTML 4.01 过渡型 -->
    <!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
    
    <!-- HTML 4.01 框架集型 -->
    <!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Frameset//EN"  "http://www.w3.org/TR/html4/frameset.dtd">
    
    <!-- XHTML 1.0 过渡型 -->
    <!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <!-- XHTML 1.0 框架集型 -->
    <!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Frameset//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
  • IE8中关闭超级标准模式:
    <meta http-equiv="X-UA-Compatible" content="IE=7" />
    //content属性中IE的值用于指定使用哪个版本的呈现引擎来呈现页面。设计这个值的目的就是为了向后兼容那些专门为老版本的IE设计的站点和页面。

在Mac OS X中配置Apache + PHP + MySQL

前言:mac pro到手已经半年了,可是一直没怎么弄熟练怎么在mac上做开发,google到了秦歌的这篇文章,觉得非常不错,全文转载分享给大家。

Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便。本文以Mac OS X 10.6.3为例。主要内容包括:

  1. 启动Apache
  2. 运行PHP
  3. 安装MySQL
  4. 使用phpMyAdmin
  5. 配置PHP的MCrypt扩展库
  6. 设置虚拟主机

启动Apache

有两种方法:

  1. 打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)”
  2. 打开“终端(terminal)”,然后
    1. 运行“sudo apachectl start”,再输入帐号密码,这样Apache就运行了。
    2. 运行“sudo apachectl -v”,你会看到Mac OS X 10.6.3中的Apache版本号:
      Server version: Apache/2.2.14 (Unix)
      Server built:   Feb 11 2010 14:40:31
      

这样在浏览器中输入“http://localhost”,就可以看到出现一个内容为“It works!”的页面,它位于“/Library(资源库)/WebServer/Documents/”下,这是Apache的默认根目录。

注意:开启了Apache就是开启了“Web共享”,这时联网的用户就会通过“http://[本地IP]/”来访问“/Library(资源库)/WebServer/Documents/”目录,通过“http://[本地IP]/~[用户名]”来访问“/Users/[用户名]/Sites/”目录,可以通过设置“系统偏好设置”的“安全(Security)”中的“防火墙(Firewall)”来禁止这种访问。

运行PHP

  1. 在终端中运行“sudo vi /etc/apache2/httpd.conf”,打开Apache的配置文件。(如果不习惯操作终端和vi的可以设置在Finder中显示所有的系统隐藏文件,记得需要重启Finder,这样就可以找到对应文件,随心所欲编辑了,但需要注意的是某些文件的修改需要开启root帐号,但整体上还是在终端上使用sudo来临时获取root权限比较安全。)
  2. 找到“#LoadModule php5_module libexec/apache2/libphp5.so”,把前面的#号去掉,保存并退出vi。
  3. 运行“sudo cp /etc/php.ini.default /etc/php.ini”,这样就可以通过php.ini来配置各种PHP功能了。比如:
    ;通过下面两项来调整PHP提交文件的最大值,比如phpMyAdmin中导入数据的最大值
    upload_max_filesize = 2M
    post_max_size = 8M
    ;比如通过display_errors来控制是否显示PHP程序的报错
    display_errors = Off
    
  4. 运行“sudo apachectl restart”,重启Apache,这样PHP就可以用了。
  5. 运行“cp /Library/WebServer/Documents/index.html.en /Library/WebServer/Documents/info.php”,即在Apache的根目录下复制index.html.en文件并重命名为info.php
  6. 在终端中运行“vi /Library/WebServer/Document/info.php”,这样就可以在vi中编辑info.php文件了。在“It’s works!”后面加上“”,然后保存之。这样就可以在http://localhost/info.php中看到有关PHP的信息,比如版本号是5.3.1。

安装MySQL

由于Mac OS X中并没有预装MySQL,所以需要自己手动安装,目前MySQL的最稳定版本是5.1。MySQL提供了Mac OS X下的安装说明

  1. 下载MySQL 5.1。选择合适的版本,比如这里选择的是mysql-5.1.46-osx10.6-x86_64.dmg。
  2. 运行dmg,会发现里面有4个文件。首先点击安装mysql-5.1.46-osx10.6-x86_64.pkg,这是MySQL的主安装包。一般情况下,安装文件会自动把MySQL安装到/usr/local下的同名文件夹下。比如点击运行“mysql-5.1.46-osx10.6-x86_64.dmg”会把MySQ安装到“/usr/local/mysql-5.1.46-osx10.6-x86_64”中。一路默认安装完毕即可。
  3. 点击安装第2个文件MySQLStartupItem.pkg,这样MySQL就会自动在开机时自动启动了。
  4. 点击安装第3个文件MySQL.prefPane,这样就会在“系统设置偏好”中看到名为“MySQL”的ICON,通过它就可以设置MySQL开始还是停止,以及是否开机时自动运行。到这里MySQL就基本安装完毕了。
  5. 通过运行“sudo vi /etc/bashrc”,在bash的配置文件中加入mysqlmysqladmin的别名
    #mysql
    alias mysql='/usr/local/mysql/bin/mysql'
    alias mysqladmin='/usr/local/mysql/bin/mysqladmin'
    

    这样就可以在终端中比较简单地通过命令进行相应的操作,比如安装完毕之后MySQL的root默认密码为空,如果要设置密码可以在终端运行“mysqladmin -u root password "mysqlpassword"”来设置,其中mysqlpassword即root的密码。更多相关内容可以参考B.5.4.1. How to Reset the Root Password

注意:Mac OS X的升级或者其他原因可能会导致MySQL启动或者开机自动运行,在MySQL的操作面板上会提示“Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' ”,或者在命令行下提示“Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)”,这应该是某种情况下导致/usr/local/mysql/data的宿主发生了改变,只需要运行“sudo chown -R mysql /usr/local/mysql/data”即可。

使用phpMyAdmin

phpMyAdmin是用PHP开发的管理MySQL的程序,非常的流行和实用。能够实用phpMyAdmin管理MySQL是检验前面几步成果的非常有效方式。

  1. 下载phpMyAdmin。选择合适的版本,比如我选择的是phpMyAdmin-3.3.2-all-languages.tar.bz2这个版本。
  2. 把“下载(downloads)”中的phpMyAdmin-3.32-all-languages文件夹复制到“/Users/[用户名]/Sites”中,名改名为phpmyadmin。
  3. 复制“/Users/[用户名]/Sites/phpmyadmin/”中的config.sample.inc.php,并命名为config.inc.php
  4. 打开config.inc.php,做如下修改:
    用于Cookie加密,随意的长字符串
    $cfg['blowfish_secret'] = '';
    
    当phpMyAdmin中出现“#2002 无法登录 MySQL 服务器”时,
    请把localhost改成127.0.0.1就ok了,
    这是因为MySQL守护程序做了IP绑定(bind-address =127.0.0.1)造成的
    $cfg['Servers'][$i]['host'] = 'localhost';
    
    把false改成true,这样就可以访问无密码的MySQL了,
    即使MySQL设置了密码也可以这样设置,然后在登录phpMyAdmin时输入密码
    $cfg['Servers'][$i]['AllowNoPassword'] = false;
    
  5. 这样就可以通过http://localhost/~[用户名]/phpmyadmin访问phpMyAdmin了。这个时候就看到一个提示“无法加载 mcrypt 扩展,请检查您的 PHP 配置。”,这就涉及到下一节安装MCrypt扩展了。

配置PHP的MCrypt扩展

MCrypt是一个功能强大的加密算法扩展库,它包括有22种算法,phpMyAdmin依赖这个PHP扩展库。但是它在Mac OS X下的安装却不那么友善,具体如下:

  1. 下载并解压libmcrypt-2.5.8.tar.bz2
  2. 在终端执行如下命令:
    cd ~/Downloads/libmcrypt-2.5.8/
    ./configure --disable-posix-threads --enable-static
    make
    sudo make install
  3. 下载并解压PHP源码文件php-5.3.1.tar.bz2。Mac OS X 10.6.3中预装的PHP版本是5.3.1,而现在最新的PHP版本是5.3.2,你需要依据自己的实际情况选择对应的版本。
  4. 在终端执行如下命令:
    cd ~/Downloads/php-5.3.1/ext/mcrypt
    phpize
    ./configure
    make
    cd modules
    sudo cp mcrypt.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
  5. 打开php.ini
    sudo vi /etc/php.ini

    在php.ini中加入如下代码,并保存后退出,然后重启Apache

    extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/mcrypt.so

当你再访问http://localhost/~[用户名]/phpmyadmin时,你会发现“无法加载 mcrypt 扩展,请检查您的 PHP 配置。”的提示没有了,这就表示MCrypt扩展库安装成功了。

设置虚拟主机

  1. 在终端运行“sudo vi /etc/apache2/httpd.conf”,打开Apche的配置文件
  2. 在httpd.conf中找到“#Include /private/etc/apache2/extra/httpd-vhosts.conf”,去掉前面的“#”,保存并退出。
  3. 运行“sudo apachectl restart”,重启Apache后就开启了它的虚拟主机配置功能。
  4. 运行“sudo vi /etc/apache2/extra/httpd-vhosts.conf”,这样就打开了配置虚拟主机的文件httpd-vhost.conf,配置你需要的虚拟主机了。需要注意的是该文件默认开启了两个作为例子的虚拟主机:
    <VirtualHost *:80>
        ServerAdmin webmaster@dummy-host.example.com
        DocumentRoot "/usr/docs/dummy-host.example.com"
        ServerName dummy-host.example.com
        ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"
        CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin webmaster@dummy-host2.example.com
        DocumentRoot "/usr/docs/dummy-host2.example.com"
        ServerName dummy-host2.example.com
        ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
        CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
    </VirtualHost> 

    而实际上,这两个虚拟主机是不存在的,在没有配置任何其他虚拟主机时,可能会导致访问localhost时出现如下提示:

    Forbidden
    You don't have permission to access /index.php on this server

    最简单的办法就是在它们每行前面加上#,注释掉就好了,这样既能参考又不导致其他问题。

  5. 增加如下配置
    <VirtualHost *:80>
        DocumentRoot "/Users/[用户名]/Sites"
        ServerName sites
        ErrorLog "/private/var/log/apache2/sites-error_log"
        CustomLog "/private/var/log/apache2/sites-access_log" common
    </VirtualHost> 

    保存退出,并重启Apache。

  6. 运行“sudo vi /etc/hosts”,打开hosts配置文件,加入”127.0.0.1 sites“,这样就可以配置完成sites虚拟主机了,这样就可以用“http://sites”访问了,其内容和“http://localhost/~[用户名]”完全一致。

这是利用Mac OS X 10.6.3中原生支持的方式来实现的配置,也可以参考“Mac OS X Leopard: 配置Apache, PHP, SQLite, MySQL, and phpMyAdmin(一) ”和“Mac OS X Leopard: 配置Apache, PHP, SQLite, MySQL, and phpMyAdmin(二) ”。实际上,你还可以使用XAMPPMacPorts这种第三方提供的集成方案来实现简单的安装和使用。

转载自:秦歌的博客: 在Mac OS X中配置Apache + PHP + MySQL

去认识HTML5

HTML5不是一个概念,对于互联网开发者来说更是一个挑战和机遇。HTML5并不遥远,现在就可应用它。
HTML5特性:
语义化标记
图像处理
媒体支持
改善用户界面
网络存储
网络通信
移动设备支持
增强可访问性

最强阵容:HTML5+CSS3+JAVASCRIPT

拥抱HTML5,《HTML5设计原理》读后随记

前言:
HTML5和CSS3的时代到来了,新版2011版淘宝网首页已全部使用HTML5,拥抱变化才是王道。为之漫笔翻译的很好,看了一遍后,感觉理解了很多,强烈推荐其他做开发的童鞋尤其前端也来看看。
不仅让我摸清了html4,xhtml1.0, xhtml2.0, html5之间的关系,也理解了为什么会出现HTML5,同时,加紧推进在项目中应用HTML5。


机器人三大法则:(著名的伯斯塔尔法则)

机器人不得伤害人类,或袖手旁观人类受伤害。
机器人必须服从人类命令,除非命令违反第一法则。
机器人必须自卫,只要不违背第一和第二法则。


xhtml1.0与html4.0相同点:

两个规范的内容是一样的;
词汇表是一样的;
所有的元素是一样;
所有的属性也都是一样的;

xhtml1.0与html4.0唯一不同点:

XHTML 1.0要求使用XML语法(严格的编码风格)
//所有属性都必须使用小写字母;
//所有元素也必须使用小写字母;
//所有属性值都必须加引号;
//你还得记着使用结束标签,记着对img和br要使用自结束标签。

XHTML 1.1与xhtml1.0唯一的变化:

把文档标记为XML文档
//XML的错误处理模型:解析器如果遇到错误,停止解析。
//不能理解XML的浏览器,用户直接看不到这个网页了。

XHTML 2特点(这个规范没有完成):

仍然使用XML错误处理模型,你必须保证以XML文档类型发送文档;
有意不再向后兼容已有的HTML的各个版本,开发人员和浏览器厂商永远不会支持它。

真正广泛地应用的设计原理:

发送时要保守;接收时要开放。
//作为专业人士,在发送文档的时候,我们会尽量保守一些,尽量采用最佳实践,尽量确保文档格式良好。
//但从浏览器的角度说,它们必须以开放的姿态去接收任何文档。


HTML5

1、2004成立了Web Hypertext Applications Technology Working Group(Web超文本应用技术工作组,WHATWG),完全脱离W3C。
2、W3C在2007年组建了HTML5工作组,在WHATWG工作成果的基础上继续开展工作。


HTML5设计原理一:避免不必要的复杂性

一、DOCTYPE的写法:

//HTML 4.01:
<!DOCTYPE html PUBLIC "-//W3C/DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

//XHTML 1.0:
<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

//HTML5:
<!DOCTYPE html>//这种写法会触发浏览器的标准模式。

备注:doctype它不是写给浏览器看的,Doctype是写给验证器看的。让验证器按照该doctype来验证我的文档。

二、指定文档的字符编码的写法:

//HTML 4.01:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

//XHTML 1.0:
<?xml version="1.0" encoding="UTF-8" ?>

//HTML5:
<meta charset="utf-8"/>

备注:此简短写法,它不仅适用于最新版本的浏览器,只要是今天还有人在用的浏览器都同样有效。

HTML5其他简洁写法:

<link href="#" rel="stylesheet"/>
//无需再写type="text/css",否则那就是重复自己了

<script></script>
//无需再写使用的脚本语言 type="text/javascript"

HTML5设计原理二:支持已有的内容

<img src="foo" alt="bar" />
<p class="foo">Hello world</p>

<img src="foo" alt="bar">
<p class="foo">Hello world

<IMG SRC="foo" ALT="bar">
<P CLASS="foo">Hello world</p>

<img src=foo alt=bar>
<p class=foo>Hello world</p>

备注:HTML5支持已存在的各种不严谨的写法。
在JavaScript,你可以在每条语句末尾加上分号,但不是必需的,因为JavaScript会自动插入分号……JSlint确实是个非常棒的工具,规范统一JavaScript编码风格,在团队项目非常有用。


HTML5设计原理三:解决现实的问题

给整块内容(含多个块级元素)加个链接

//HTML 4.01 XHTML 1.0:
<h2><a href="/path/to/resource">Headline text</a></h2>
<p><a href="/path/to/resource">Paragraph text.</a></p>

//HTML5:
<a href="/path/to/resource">
<h2>Headline text</h2>
<p>Paragraph text.</p>
</a>

备注:这种写法其实早就已经存在于浏览器中了,但以前这样写是不合乎规范的,现在我们把标准改了,允许你这样写了。


HTML5设计原理四:求真务实

新增语义元素涉及头部(header)、脚部(footer)、分区(section)、文章(article)……

//HTML 4.01 XHTML 1.0:

<div id="header">...</div>
<div id="navigation">...</div>
<div id="main">...</div>
<div id="sidebar">...</div>
<div id="footer">...</div>
</body>

//HTML5:
<body>
<header>...</header>
<nav>...</nav>
<div id="main">...</div>
<aside>...</aside>
<footer>...</footer>
</body>

备注:新元素section、article、aside和nav代表了一种新的内容模型,一种HTML中前所未有的内容模型——给内容分区。
将新元素作为类的替代品更有价值,因为这些元素在一个页面中不止可以使用一次,而是可以使用多次,可嵌套使用。
其中最为通用的section,可以说是与内容最相关的一个。而article则是一种特殊的section。Aside呢,是一种特殊的section。最后,Nav也是一种特殊的section。

//HTML 4.01 XHTML 1.0:
<div class="item">
<h2>...</h2>
<div class="meta">...</div>
<div class="content">
...
</div>
<div class="links">...</div>
</div>

//HTML5:
<section class="item">
<header><h1>...</h1></header>
<footer class="meta">...</footer>
<div class="content">
...
</div>
<nav class="links">...</nav>
</section>

备注:在HTML5中,只要你建立一个新的内容块,不管用section、article、aside、nav,还是别的元素,都可以在其中使用H1,而不必担心这个块里的标题在整个页面中应该排在什么级别;H2、H3,都没有问题。


HTML5设计原理五:平稳退化

渐进增强的另一面就是平稳退化。
使用type属性增强表单:

input type="number"
input type="search"
input type="range"
input type="email"
input type="date"
input type="url"

备注:
现有的浏览器无法理解这些新type值的,但在它们看到自己不理解的type值时,会将type的值解释为text。
HTML5还为输入元素增加了新的属性,比如placeholder(占位符),就是用于在文本框中预先放一些文本。无需JavaScript去实现,太完美了。


HTML5视频对Flash视频(video元素):

<video>
<source src="movie.mp4">
<source src="movie.ogv">
<object data="movie.swf">
<a href="movie.mp4">download</a>
</object>
</video>

备注:两者要兼顾,无论是HTML5,还是Flash:

  1. 如果浏览器支持video元素,也支持H264,没什么好说的,用第一个视频。
  2. 如果浏览器支持video元素,支持Ogg,那么用第二个视频。
  3. 如果浏览器不支持video元素,那么就要试试Flash影片了。
  4. 如果浏览器不支持video元素,也不支持Flash,我还给出了下载链接。

遵循另一个设计原理,即梅特卡夫定律(Metcalfe’s Law):

网络价值同网络用户数量的平方成正比。

HTML5设计原理六:最终用户优先

本质上是一种解决冲突的机制

一旦遇到冲突,最终用户优先,其次是作者,其次是实现者,其次标准制定者,最后才是理论上的完满。

Web的设计原理:

大多数人的意见和运行的代码。

参考:

《HTML5设计原理》

此为原创文章,转载请注明:
转载自:http://www.heiniuhaha.cn/blog/?p=1273&preview=true