使用ARIA,增强网站可访问性
关于网站的可访问性,Wikipedia的描述是“可访问性是一个产品、设备、服务或环境可以被大多人访问的一个通用的规则”,不论是对于什么样的用户或是他们所用的什么设备还是他们处于什么样的环境都要让他们能够直接地访问到你的网页内容。而WAI-ARIA(富互联网应用程序可访问性小组)定义了一种使网页内容更加可访问性的方法
请看这个slide
关于网站的可访问性,Wikipedia的描述是“可访问性是一个产品、设备、服务或环境可以被大多人访问的一个通用的规则”,不论是对于什么样的用户或是他们所用的什么设备还是他们处于什么样的环境都要让他们能够直接地访问到你的网页内容。而WAI-ARIA(富互联网应用程序可访问性小组)定义了一种使网页内容更加可访问性的方法
请看这个slide
此DEMO主要讨论了现阶段我们可以怎样去使用CSS3用到我们的项目当中,遵循优雅降级的原则,让支持CSS3的浏览器表现完美,而让不支持CSS3的 浏览器如IE表现一般,同时也给出了IE下的一些解决方案。
在CSS Trick上面看到了一篇讲跨域Iframe调整的文章,DEMO在这里。要做到跨域Iframe高度自适应,需要可以控制两个域内的内容,主要的技术是通window.location.hash来传递信息。
先来看看主域的内容: 继续阅读 »
// parent
function Person() {
// “own” members
this.name = “Adam”;
}
// properties of the parent’s prototype
Person.prototype.getName = function() {
return this.name;
};
// child constructor
function Programmer(){}
Y.extend可以帮你实现类的继承
Y.extend(Programmer, Person);
Y.extend只会继承prototype里的成员,而不会继承构造函数内的成员,在这里Programmer没有name的属性。通过Y.extend可以给子类的prototype添加属性同时还可以给构造函数添加静态属性,如
Y.extend(Programmer, Person, {groksHTML: true}, {LIMIT: “sky”});
// the property works for all new objects
var bob = new Programmer();
alert(bob.groksHTML); // true
alert(Programmer.LIMIT); // “sky”
在类模式中你还可以通过子类的静态属性superclass访问父类的prototype属性,因此可以通过superclass.constructor访问父类的构造函数。
// child’s access to the parent constructor
var parent = Programmer.superclass.constructor;
alert(parent === Person); // true
因此你就可以在子类中初始化父类并且带同样的参数,如
// child
function Programmer() {
// initialize the parent using the child as “this”
Programmer.superclass.constructor.apply(this, arguments);
}
这样的话Programmer的实例就会有name这个属性了
var pro = new Programmer();
alert(pro.name); // “Adam”
Douglas Crockford建议了这种继承方式,你可以忘掉类并且完全是对象之间的继承,你还可以自定义对象的属性和方法。
// parent object, created with a simple object literal
var parent = {
name: “John”,
family: “Wayne”,
say: function() {
return “I am ” + this.name + ” ” + this.family;
}
};
// the inheritance magic
// a new object is born from an existing one
var batman = Y.Object(parent);
// customize or augment the new object
batman.name = “Bruce”;
// use
batman.say(); // I am Bruce Wayne
使用这种继承方式,父类的成员通过原型链来继承,当你给子类增加一个同名的属性时,将不会覆盖父类的属性,但是会有优先权。
batman.say = function() {
return “Can’t tell you my real name”;
};
// test
batman.say(); // “Can’t tell you my real name”
不像类的继承模式,在子类里没有可以访问父类的方法,当你删除了子类的say方法时,父类的say方法就会被调用。
delete batman.say;
batman.say(); // “I am Bruce Wayne”
在新版的ECMAScript标准http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf中已经引入了原型继承模式,通过一个内建的方法Obejct.create(…)
// ECMAScript 5 (future)
var batman = Object.create(parent);
在实际应用中,有时并不需要建立继承链,有时只是想在一个对象的基础上扩充一个新的对象,在YUI3中可以通过Y.augment(…)来实现。
下面的例子描述了通过Y.extend和Y.augment的不同
// parent, a.k.a. supplier of functionality
function Programmer(){}
Programmer.prototype.writeCode = function(){};
// a constructor that gets augmented with supplier’s members
function CodeMonkey(){}
Y.augment(CodeMonkey, Programmer);
var monkey = new CodeMonkey();
// a constructor that inherits from the parent-supplier
function Guru(){}
Y.extend(Guru, Programmer);
var guru = new Guru();
alert(typeof monkey.writeCode); // “function”
alert(typeof guru.writeCode); // “function”
// monkey is not a Programmer, while guru is
alert(monkey instanceof Programmer); // false
alert(guru instanceof Programmer); // true
我们可以看出monkey和guru都有了writeCode这个方法,但是仅仅guru是继承链的一部分
Y.augment也可以从一个构造函数扩充一个对象
var n00b = {};
Y.augment(n00b, Programmer);
// now n00b can writeCode
alert(typeof n00b.writeCode); // “function”
Y.augment还有一些选项,如第三个参数表示是否覆盖存在的属性(默认false),第四个参数是一个数组,定义了一个要扩充的白名单属性列表。
对象克隆是代码重用的另一种方式,它创建了和原对象一样的新对象,和Y.Object()的原型继承不同,对象克隆会把父对象的属性直接拷贝到子对象,而不是通过原型链。Y.clone()创建了一个深拷贝,它创建的拷贝是按值传递的,因此修改子/父对象互不影响。
// original object
var pro = {groks: ['html']};
// inherit
var wiz = Y.Object(pro);
// clone
var clone = Y.clone(pro);
pro.groks.push(’css’);
wiz.groks.join(); // “html,css”
wiz.groks.push(’js’);
pro.groks.join(); // “html,css,js”
clone.groks.join(); // “html”
clone.groks.join(); //”html”
混合模式可以让你从多个对象获取属性和方法来创建一个新的对象,YUI3提供了Y.merge()这个方法
var mad_skillz = {bake: function(){}, mix: function(){}, eat: function(){}};
var ingredients = {sugar: “lots”, flour: 1, eggs: 2};
var dairy = {milk: 1};
// mixin
var cake = Y.merge(mad_skillz, ingredients, dairy);
Y.Object.keys(cake).join(); // “bake,mix,eat,sugar,flour,eggs,milk”
Y.merge和Y.clone很像,但是不同是Y.merge是浅拷贝并且可以通过同一个方法混合多个对象,当出现属性名冲突时,最后的会覆盖前面的。
Y.mix(…)是一个基础方法,它可以控制哪些属性可以被拷贝以及哪种模式,还可以混合同名属性,或忽略一些属性等。
// an object
var pro = {
groks: ['html', 'css', 'js'],
speaks: ['Latin'],
tweets: true
};
// a constructor
function WebGuru(){}
// augmenting the prototype of the constructor
// with some of pro’s properties
Y.mix(WebGuru, pro, true, ['groks', 'tweets'], 4);
// test
var guru = new WebGuru();
guru.groks.join(); // “html,css,js”
guru.tweets; // true
guru.speeks; // undefined
Y.mix有5个参数,参数1-对象接收者,参数2-对象提供者,参数3-是否覆盖,参数4-白名单列表,参数5-混合模式【default(0): object to object, 1: prototype to prototype (old augment)
2: prototype to prototype and object props (new augment), 3: prototype to object, 4: object to prototype】
想了解更多请阅读:
YUIBlog的“Inheritance Patterns in YUI 3”
YUIBlog的“More code reuse patterns in YUI3”
Jayli的“yui3中的面向对象”
在前端开发过程中会遇到很多工具,我接触的主要的前端工具整理了一下有:
1.Firebug http://getfirebug.com/
最流行的前端开发工具
2.HttpWatch http://www.httpwatch.com/
集成在IE和Firefox上的监听HTTP和HTTPS的工具
3.Fiddler http://www.fiddler2.com/fiddler2/
Fiddler是一个记录你电脑和网络之间所有HTTP(S)请求的网络调试代理
4.HttpFox https://addons.mozilla.org/eu/firefox/addon/6647?lang=en-US
和HTTPWatch很类似的一个工具
5.Yslow http://developer.yahoo.com/yslow/
Firebug的一个扩展,可以根据高性能网站的一些准则来分析网页并且提出建议来提高网站的性能
6.Css Usage https://addons.mozilla.org/zh-CN/firefox/addon/10704
Firebug的一个扩展,可以用来察看哪些CSS被用到了
7.VIM http://www.vim.org/
一个高级的文本编辑工具,是在UNIX系统上面VI编辑器的升级版本
8.Editplus http://www.editplus.com/
Windows系统上的一个好用的文本编辑器
9.DNS Flusher https://addons.mozilla.org/en-US/firefox/addon/7408
Firefox上的一个附加组件,当HOST文件改变时可以很快地更新页面而不需要重启浏览器
10.PageSpeed http://code.google.com/intl/zh-CN/speed/page-speed/
Page Speed 是开源 Firefox/Firebug 插件。网站管理员和网络开发人员可以使用 Page Speed 来评估他们网页的性能,并获得有关如何改进性能的建议
11.Dust-me Selectors https://addons.mozilla.org/zh-CN/firefox/addon/5392
Firefox上的一个附加组件,可以找出没有用到的CSS选择符
12.Myspace Performance Tracker http://msfast.myspace.com/
Myspace的性能分析工具, 可以分析到页面渲染的各个阶段的时间、CPU和内存的消耗情况,只使用于IE中
13.YUI Compressor http://developer.yahoo.com/yui/compressor/
用java写的一个代码压缩工具,使用方法: java -jar yuicompressor-x.y.z.jar [options] [input file]
14.JS Beautifier http://jsbeautifier.org/
在线JS格式化工具
15.JSLint http://jslint.com/
在线JS校验工具,使用请注意“JSLint will hurt your feelings.”
16.JSCompress http://jscompress.com/
在线JS压缩工具
17.JSMin http://www.crockford.com/javascript/jsmin.html
JS压缩工具
18.HTML2Javascript http://accessify.com/tools-and-wizards/developer-tools/html-javascript-convertor/
HTML到JavaScript转换器获得置标并将它转换成一系列可以在JavaScript块中使用的document.write()申明
19.Web Developer https://addons.mozilla.org/da/firefox/addon/60?lang=zh-CN
Firefox的一个附加组件,给Firefox增加了一个菜单以及工具栏,里面包含了很多开发工具
20.JS Regexp Generator http://www.jslab.dk/tools.regex.php
一个制作正则表达式的在线工具
21.Opera Dragonfly http://www.opera.com/dragonfly/
Opera Dragonfly 是Opera浏览器的跨设备,跨平台调试环境—调试 JavaScript, 检查编辑CSS和DOM, 并且查看移动设备或计算机上的错误
22.IE Web Developer http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&displaylang=en
微软的浏览器开发者工具条为网页的快速创建,理解和故障诊断提供了各种的工具
23.DynaTrace http://ajax.dynatrace.com/pages/
一个页面性能分析工具,是针对浏览器 IE 6 ~ 8 的。它可以用来分析页面渲染时间、DOM方法执行时间,甚至可以看到 JS 代码的解析时间。多谢“有米啦”同学的推荐,好友卓群的博客以前也介绍过
24.IE Tester http://www.my-debugbar.com/wiki/IETester/HomePage
IETester是一个免费的浏览器,它同时包括了IE 5.5、IE 6、IE 7、IE 8的所有内核,多版本IE测试好工具,DIV测试,CSS兼容和各个版本浏览器兼容检测工具
25.Companion JS http://www.my-debugbar.com/wiki/CompanionJS/HomePage
IE下的js调试工具,需要结合Microsoft Script Debugger使用,通过安装这个工具,但页面出现错误时会在左上角弹出一个小错误提示,点击会在IE下面显示出一个错误控制台,就如FF下的firebug控制台一样,错误信息提示很详细
26.Live Http Header https://addons.mozilla.org/zh-CN/firefox/addon/3829
live HTTP headers是firefox的一个插件,可以查看到http头,非常方便
27.Closure Compiler http://code.google.com/intl/zh-CN/closure/compiler/
Google的JavaScript编译工具
还有其他前端总结的工具可以看一下,如云谦的http://www.chencheng.org/blog/2008/10/25/f2e-manual/,嗷嗷的http://www.aoao.org.cn/resource/
您在使用什么好的前端开发工具呢?
1.看到了一个新的Clearfix写法如下:
/* new clearfix */
.clearfix:after {
visibility: hidden;
display: block;
font-size: 0;
content: ” “;
clear: both;
height: 0;
}
* html .clearfix { zoom: 1; } /* IE6 */
*:first-child+html .clearfix { zoom: 1; } /* IE7 */
2.如何居中Block元素
这篇文章http://11heavens.com/how-to-shrinkwrap-and-center-a-block-element-inside-a-block-element 讲了如何居中一个Block元素。
<div class=”outer”>
<div class=”inner”>
<div class=”content”></div>
</div>
</div>
<style>
.outer{position:absolute; right:50%;}
.inner{position:relative; left:50%; overflow:hidden;}
.content{float:left;}
</style>
3.CSS圆角
介绍两种CSS圆角的方法,第一种是用很多1像素高的div容器,利用背景色和边框色来模拟出圆角框的轮廓线。Demo看此
另一种是用特殊字符(&bull),利用定位,截取四分之一圆模拟出圆角框的一个角图片。Demo看此
4.CSS文字排版
text-decoration: blink可以让文字闪动(Firefox和Opera)
font-variant: normal|small-caps|inherit
5.IE8的Document Mode和Browser Mode
三种document mode:IE5/IE7/IE8,通过使用<meta http-equiv = “X-UA-Compatible” content=”IE=IEVERSION”>来强制使用某种document mode,IEVERSION可以是:Edge/EmulateIE8/EmulateIE7/8/7/5
三种browser mode:IE8/IE8 Compatibility/IE7,默认是IE8, IE8 Compatibility当点击兼容性视图按钮时会出现,IE7是在IE WebDeveoper Tool会出现一个选项,通常都是IE8模式
document mode被用来决定哪些特性影响当前的页面,包括哪些CSS特性和JS特性的可用和不可用,browser mode会影响document mode当X-UA-Compatible没有被指定的时候。
更多精彩内容请看Zakas的这篇文章“Internet Explorer 8 document and browser modes”
6.Css border方式实现三角
.arrow{
height:0;
width:0;
overflow:hidden;
/*非IE6支持 transparent ,IE6用dashed边框模拟透明(此时border-width*5>height)
border-left:5px dashed transparent;
border-right:5px dashed transparent;
border-bottom:5px solid #f00;
}
详情请看淘宝UED渔隐的这篇文章http://blog.silentash.com/2009/12/ie6-border-transparent/
看了《Javascript权威指南》,关于事件的部分做了一些笔记:
1.img支持的事件有onabort, onerror, form支持的事件有onreset, onsubmit
2.可以用document.implementation.hasFeature(’Events’, ‘2.0′);来检测浏览器是否支持Event模块
3.事件的模块分为:HTMLEvents如abort, blur, change, error, focus等;MouseEvents如click, mousedown, mousemove, mouseup等;UIEvents如DOMActivate, DOMFocusIn, DOMFocusOut
4.2级DOM API提供的事件Event定义了以下属性:
type - 发生事件的类型
target - 发生事件的节点
currentTarget - 发生当前正在处理的事件的节点
eventPhase - 一个数字,指定了当前所处的事件传播过程的阶段
timeStamp - 一个Date对象,声明了事件何时发生
bubbles - 布尔值,声明该事件是否在文档树中冒泡
cancelable - 布尔值,声明该事件能否具有能用preventDefault()方法取消的默认操作
UIEvent是Event接口的子接口,除了UI接口定义的属性外,UIEvent还定义了两个属性:
view - 发生事件的Window对象
detail - 一个数字,提供事件的额外信息
MouseEvent继承了Event接口和UIEvent接口的所有属性和方法,此外它还定义了下列属性:
button - 一个数字,声明了mousedown, mouseup和click事件中哪个鼠标改变了状态,值为0表示左键,1表示中间键, 2表示右键。
altKey, ctrlKey, metaKey, shiftKey - 这4个布尔值声明在鼠标事件发生时,是否按住了Alt、Ctrl、Meta和Shift键
clientX, clientY - 声明鼠标指针相对于客户区或浏览器窗口的X Y坐标
screenX, screenY - 声明了鼠标指针相对于用户显示器的X Y坐标
relatedTarget - 对于mouseover事件来说,它是鼠标移到目标上时所离开的那进入的节点
5.IE Event对象最重要的属性有:
type - 与DOM Event对象的type属性兼容
srcElement - 与DOM Event对象的target属性兼容
button - 1表示左键,2表示右键,4表示中键
clientX, clientY - 与DOM Event对象的MouseEvent属性兼容
offsetX, offsetY - 声明鼠标指针相对于源元素的位置
altKey, ctrlKey, shiftKey - 与DOM Event对象的MouseEvent属性兼容
keyCode - 声明了keydown和keyup时间的键代码以及keypress事件的Unicode字符串, 用String.fromCharCode()可以把字符代码转换成字符串
fromElement, toElement - 等价于与DOM Event对象的MouseEvent对象的relatedTarget属性
cancelBubble - 一个布尔属性,如果设为true可以阻止当前事件进一步冒泡到包容层次的元素,与DOM的Event对象的stopPropagation()方法相同
returnValue - 一个布尔属性,设为false可以阻止浏览器执行与事件相关的默认动作,等价于DOM的Event对象的preventDefault()方法
6.IE事件模型中的捕获事件,setCapture()鼠标事件专门分派,直到调用releaseCapture()或者捕获被中断
7.合成事件,2级DOM事件模型和IE事件模型都允许创建合成事件对象,并且把它们分配给注册在文档元素上的事件句柄。在DOM事件模型中,使用Document.createEvent()来创建一个合成事件,使用Event.initEvent()、UIEvent.initUIEvent()或MouseEvent.initMouseEvent()方法来初始化事件,然后使用它所要分派给的节点的dispatchEvent方法来分派该事件。在IE中,使用Document.createEventObject来创建一个新的事件对象,然后使用目标元素的fireEvent()方法来分派他。
例子:
var DataEvent = {};
DataEvent.send = function(target, datatype, data){
if(typeof target == ’string’) target = document.getElementById(target);
if(document.createEvent){//DOM Event Model
var e = document.createEvent(’Events’);
e.initEvent(’dataavailable’, true, false);//event type, bubbling, noncancelable
}else if(document.createEventObject){//IE Event Model
var e = document.createEventObject();
}else{
return;
}
e.datatype = datatype;
e.data = data;
if(target.dispatchEvent) target.dispatchEvent(e);
else if(target.fireEvent) target.fireEvent(’ondataavailable’, e);
};
DataEvent.receive = function(target, handler){
if(typeof target == ’string’) target = document.getElementById(target);
if(target.addEventListener){
target.addEventListener(’dataavailable’, handler, false);
}else if(target.attachEvent){
target.attachEvent(’ondataavailable’, handler);
}
}
前面一篇文章说了IE的一些bug,现再来继续说一下。
15.图片浮动List标记错位bug,影响版本IE8, 当List里面有浮动的image时,List标记显示的位置跑在里面了,可以通过使用背景图片代替List自带的标记来解决。
16.TH没有继承Text-Align属性的bug,影响版本IE8,当给table设置text-align时,TH没有继承样式,可以通过给TH设置text-align:inherit;来解决IE8下这个丑陋的bug。
17.32个Style限制,影响版本ie6/7/8, 在32个”style”方法(style, link, @import)后浏览器会忽略后面的样式
18.白色背景hover bug,影响版本ie7, 给hover设置background-color:#ffffff;时,背景不会改变,解决方法是设置background:#ffffff;
19.* html bug,影响版本ie6,* html [selector]在ie6下通常不会被忽略,这个bug通常被用来作IE6的hack使用。
20.!important bug, 影响版本ie6, 在important之后设置同样的规则后important会被忽略,这个bug也常被用来指定ie6的样式。
21.png图片和背景颜色不一致,影响版本ie6/7/8, 设置背景颜色和png图片背景同样的颜色代码最后表现不一致,原来是因为ie支持“PNG Gamma profiles”,解决方案是通过一个pngcrush程序来优化图片。
22.auto margin居中bug, 影响版本ie6/7/8, 给block元素设置margin auto无法居中,出现这种bug的原因通常是没有Doctype,然后触发了ie的quirks mode,加上<!DOCTYPE html>就可以了。
23.:first-line/:first-letter里的!important会忽略,影响版本ie8, 在:first-line/:first-letter里应用!important的规则会被忽略,解决方法就是不用!important
24.:first-letter被忽略的bug, 影响版本ie6, 当:first-letter前面有逗号的时候ie6会忽略这条规则,解决方法是将:first-letter放到最后。
25.浮动元素的阶梯bug, 影响版本ie6/7, 当给一系列<li>里面的浮动元素设置font-size后会出现阶梯效果,解决方案是给li设置display:inline;
26.List背景消失bug, 影响版本ie6, 当给浮动的div里面的dt, dd, dl设置背景时不显示,解决方案是给dt, dd, dl加上position:relative;
27.noscript样式bug, 影响版本ie6/7/8, 当js可用的时候如果给noscript设置border和背景都可以显示,解决方法就是通过给noscript设置display:none;
28.透明区域无法点击bug, 影响版本ie6/7/8,当给一个display:block元素使用filter来支持png透明的时候,透明区域无法点击,解决方法是不要使用background:none;filter…,而是background:url(#);filter…
29.List标记偏移,影响版本ie8, 当给list里面的元素设置display和overflow属性后List标记会偏移,解决方法是给里面的元素加一个float:right; width:100%;可以使用ie的条件注释针对ie8
30.ol数字标记不自增, 影响版本ie6/7, 当给li设置宽度时会触发这个bug,解决方法是给li设置display:list-item
31.ul/ol标记消失bug, 影响版本ie6/7, 当ul/ol触发了layout并且有margin-left会触发这个bug,解决方案是给li设置margin-left
32.图片不垂直居中,影响版本ie6/7, 当使用line-height来居中图片时在ie6/7下不会生效,解决方法是在img后加一个空白元素如<span></span>
33.没有背景图片bug, 影响版本ie6/7/8, 当使用background的时候如果在url()后没有加空格背景图片就不会显示。
34.自定义鼠标bug, 影响版本ie6/7/8, 当自定义鼠标样式的时候,如果url()里面的路径是相对路径的话,ie会认为相对于当前文档而不会出现鼠标样式的图片,解决方法是采用绝对路径。
35.背景溢出bug, 影响版本ie6, 一个容器里面有浮动元素并且通过加一个clear:both的额外div来清除浮动会产生此bug,解决方案就是建议尽量不要通过增加一个clear:both的div来清除浮动,可以通过在外层加上overflow:hidden;对于ie可以通过加上zoom:1;来触发ie的layout
36.高度扩展bug, 影响版本ie6, 当高度很窄如小于12px时ie6会扩展高度,解决方法是设置overlfow:hidden或font-size:0;
37.宽度扩展bug, 影响版本ie6, 当连续英文字符的时候设定宽度不起作用,解决方法是设置overflow:hidden或word-wrap:break-word;
38.浮动双margin,影响版本ie6, 当给一个浮动元素设置margin-left或margin-right时margin加倍,解决方法是加上一条display:inline;
39.负margin bug, 影响版本ie6/7, 当给一个有layout容器里面的元素设置负marin时内容会被截断,解决方法是不让容器有layout或者给负marin的元素设置position:relative;zoom:1;
40.3px间距bug, 影响版本ie6, 当几个连续浮动且有layout的元素排列时会有3px的间距,解决方法就是给这些元素设置3px的负margin或加上overflow:hidden;
41.text-align bug, 影响版本ie6/7, 当容器外面设置了text-align,如果容器里面有文本和其他block的元素, block的元素也会继承text-align,这是不正确的,解决方法是重新写出合理的有语义的markup,如文本外面加一个p.
更多详细的内容请看http://haslayout.net/css/和http://coolshell.cn/?p=1245