All posts in 交互设计

使用 iframe 获取网页片段的一个好处

异步操作数据的方式有两种常见的方式:XMLHttpRequestiframe. 孰优孰劣在此我们不争论,只是想举一个例子说明在获取网片片段上,使用 iframe 有一个比 XMLHttpRequest 更易企及的好处。

Ajax 常见的一种使用方法是加载网页片段填充某个区域。假设我们要在网页 foo.com/index 上请求 foo.com/partial。我们假设 partial 就是 HTML,不涉及 JSON 或 XML 格式。在这种情况下:

  1. 使用 XMLHttpRequest 直接访问 partial,获取 responseText 后赋予 index 页面上某个元素的 innerHTML 即可完成。partial 必须是一个纯粹的 HTML 片段(基于以上假设)。
  2. 在页面上创建一个隐藏的 iframe, 使用 iframe 的 src 请求 partial, partial 可以作为一个完整的页面,里面包含 JavaScript,由 partial 里的 JS 完成替换 index 上页面片段替换。

第二种看起来更繁琐,但能给我们更多控制权。例如,假如用户直接访问 foo.com/partial(这种情况很容易发生,假设您是 unobtrusive 的拥护者,机会更大,例如需要点击网页上的链接更新某部分内容时,用户使用新窗口打开了改链接), 你希望她看到的是什么内容呢?

在第一种情况中,用户看到的是代码片段,绝大部分下没有任何样式,也没有任何额外提示,导致用户体验的下降。因为只是一个 HTML 片段,你什么事都干不了。

但在第二种情况下,用户看到内容可能也只是 HTML 片段,但这却是一个完整的页面,一个可以执行 JS 的完整页面。我们只需检查这个页面的 parent 对象有没有我们预设的值,就可以判断它是不是在 iframe 之内了,然后我们可以让它跳转到正常的页面。

Demo: http://realazy.org/lab/xhrvsiframe/

设计五原则

本人非计算机,亦非心理学,或者交互设计,更非设计专业出身,因此什么都是半桶水。即使如此,依然靠着兴趣寻找乐趣。对于设计,爱之,但没有受过系统培训,更多时候只是从用户角度来考虑问题。今偶读一文,叫Five Principles to Design By,跟本人观点颇投缘,虽然有些观点不是很认同(如:设计不是艺术,考究起来,现在啥都可以冠上艺术二字,何况设计呢),但道理挺得我心,遂花两小时,冒着上班迟到的危险,翻译出来,与众分享之。水平有限,若有不通或歧义,请多多指出指正指教,不胜感激。以下是正文:

技术为人民服务

人们经常埋怨自己的技术短处。当电脑当机,他们会说:“我一定是干了某些愚蠢的事情”。面对一个设计糟糕的网站,他们会说:“我一定是太蠢了,我竟找不着北”。他们很有可能去买一本傻瓜指南。

很不可思议!人们在使用技术时不应该感到挫折。就像客户,用户永远是对的。如果软件崩溃了,那是软件设计师的错;如果在某个网站上找不着北,那是web设计师的错。但这也不表示设计师要羞愧低头……他们更应该把这看作是一个学习的机会!好设计师与坏设计师最大的差别在于,如何处理他们的让用户正折腾着的设计。

技术为人民服务。人民不会为技术服务。

设计非艺术

艺术是关于个人表达的。它关于生命,关于情感——艺术家的想法和主意。它不太关注第三者干什么,活动也不是必须的,仅是他们的鉴赏。艺术实践不需要这些。鉴赏是艺术家的必需品,同时他们也是孤独的。

设计,从另一方面来说,是关于使用的。设计师需要别人来使用(而不仅仅是鉴赏)他们的作品。设计不存在不让人们使用它的目的。设计辅助解决人类问题。我们能授予一个设计的最高荣誉不是它多漂亮,多艺术,而是它用途多广。

不像艺术,设计总是存在于情景中的。情景对一个设计至关重要:它要解决什么问题?为谁设计?在什么时期?这就是为何设计与技术如此紧密的缘故。因为技术变化太快,所以设计必须步随其后。十年前的设计在今天可能不值一提。充满精彩设计的历史没有必要继续存在。

伟大的艺术,从另一角度说,永远风行。就算今天我们可以复制一百万个大卫像,我们依然欣赏米开朗基罗的原作,因为它是一个人的辛劳和表达。艺术永远不会凋谢。伟大的设计则依赖于它产生的年代和要解决的问题。但艺术不这样,艺术是永恒的。

做个测试。当人们享受艺术时,说:“我喜欢”;当人们享用设计时,说:“做得不错”。这并非偶然。好的设计就是能干活的料。

体验属于用户

设计师不生产体验,他们制作的是体验用品。看似细微的差别却有很大不同,因为它把设计师放在服务用户的位置上,而非其他方式。这并不是要扼杀创新,它并不会妨碍设计师跳过上述关于艺术的阐述。它只意味着,设计的体验并不会简单地因为设计师说这般这般就会这般这般地发生,当用户提交反馈时,真实的体验就确确实实发生了。

最终的体验发生在用户那里,体验是属于他们的。

伟大的设计是无形的

伟大的设计一个有趣的属性是,它来源于认可。用得爽的时候我们忘了创造它时的种种艰辛。有时,就像普通的汤匙,显而易见,这东西太简单了,但我们会忽视了在历史的某一时期它并不这样。还有,就像汽车,这东西尽管很复杂但依然容易使用,但是我们却对于它背后数以万计的工时视而不见。这是一种羞耻……每一个伟大的设计都有丰富的历史。每一设计背后都是一个或一群设计师,他们想通过解决某些问题来让世界更美好。

烂的设计显然是因为它伤害了使用。它拙劣,困难和复杂。最为讽刺的是,这个世界上烂的设计比好的设计更容易碰着。它像暴徒一样强奸着我们的头脑。它像恶徒一样在我们面前逞威风。因为有用,伟大的设计通常都是无形的。

简洁是终极哲学

如Saint Exupery所说:设计师知道自己要达到完美,不在于无物可增,而在于无物可减。。简洁自成一体:知道什么要加和什么要扔……当它作用时,就像魔术般实现预期效果,因为没有任何复杂的东西传递给用户……只有简洁。这是设计师的最高成就。

标准的、语义的、Unobtrusive的页签切换

页签的流行

自从Yahoo!的首页引进页签(tab, 见下图)之后,这种可用性极佳的方式越来越受欢迎,用户也逐步习惯和喜欢上它,因为它可以在原有的空间上增加更多的可用信息,而且只需切换,不需刷新整个页面,浏览更舒畅。很多网站接受并使用,如新浪等。

页签样例

页签的标记结构

那么,让我们来看看这些页签后的代码。

新浪完全不考虑什么标准,就是表格嵌套,我们略过不提。Yahoo!的XHTML形式是这样的:

<div>
  <ul>
    <li>页签1</li>
    <li>页签2</li>
    ...
  </ul>
</div>
<div>
  <div>内容1</div><!--它们可能由Ajax载入-->
  <div>内容1</div>
  ...
</div>
...

符合标准,但却没有语义。页签和相应内容没有任何关联。也就是说,在没有CSS展现的情况下,用户并不晓得页签究竟对应哪一块内容。而且就JavaScript实现来说,必须对元素定义更多的id或者class作为调用钩子(hook),容易造成代码冗余。有人对此作出改良,使用连接元素的hash(即#号后的字段)跟内容进行关联,即下面这种形式:

<div>
  <ul>
    <li><a href="#content1">页签1</a></li>
    <li><a href="#content2">页签2</a></li>
    ...
  </ul>
</div>
<div>
  <div id="content1">内容1</div><!--它们可能由Ajax载入-->
  <div id="content2">内容1</div>
  ...
</div>
...

这种方式对于机器来说,确实找到了关联点,而且用户点击的时候,也能在hash的作用下(传统说法中的“锚点”)调到相应的内容区块。有进步,但还是不够语义。

语义,语义,语义!

理想中标准的、语义的tab代码应该是怎么样的呢?在我看来,应该是这样:

<dl>
  <dt>页签1</dt>
  <dd>内容1</dd>
  <dt>页签2</dd>
  <dd>内容2</dd>
</dl>

当然,我认为并不是Yahoo!的设计师/开发者并不了解语义,可能是由于某些特殊的需求在这种代码下可能会实现不了,只好采取折衷方案。是的,在这种代码形式下,语义虽能充分体现,但是要实现页签的表现形式,确实是一个难题。

解决之道

首先,请打开我们的Demo页面,先自行分析一下。如果您使用Firefox,可以尝试把CSS样式禁用进行“欣赏”(如果您装了Web developer toolbar,您可以CTRL + SHIFT + S)。继续。

解决dt的横排

dtdd交错,如何能够使得dt排在一行上?well,理论不分析太多,要使它们在一起,我们假设dd不存在。这样的话,使用float就能排在一起。既然dd不能不存在,ok,那么让它们脱离文档流,如何做?position:absolute;就可以了。但是IE6有问题,wtf . 我的解决方法是,使用JavaScript把所有的dt凑一块,这样严重伤害了语义,但这只是一个浏览器问题,而且是在有JavaScript的时候才产生语义问题,阿弥陀佛,辩证法认为事物都具两面性。

解决dd的自适用高度

对于已经position:absolute;了的dd,无论是理论还是实践,使用纯CSS都没有解决方法。同样,我使用了JavaScript来动态计算它的每一次高度,然后赋予整个dl

局限性与缺点

这样做保证了标准、语义、Unobtrusive。但对于少部分拥有能解析CSS的先进浏览器但却关闭了JavaScript的用户来说,极有可能会被不能自适用高度的页签下的内容区块挡住了跟随在后的信息。

s2uTab

很高兴我能写出一些实用的JavaScript,以上所提到的,我将之命名为s2uTab — 偏要解释的话,它就是Standard, Semantic, Unobtrusive Tab的缩写。首先,它很小,不依赖于任何库,在IE6+, opera 9+, Firefox 2+均通过测试(若您有Safari,务必帮忙测试一下,谢谢)。其次,灵活,除了dl外无须任何钩子,且页签数目灵活没有限制。再次,您可以指定页签切换的事件形式,可以指定初始的页签是哪个。

用法

您可以为window.onload添加如下函数:

s2uTab(页签, 事件类型, 初始页签);

其中,页签指dl元素的引用,如果您传入的是字符串,则返回id是改字符串的dl引用;事件类型是指,页签的激活是点击还是鼠标悬停,传入click或者mouseover(注意:没有”on”!)即可;初始页签是指您在初始化页面时需要激活的页签,注意,为符合编程习惯,请从0算起。

请多多参考我们的例子

Smallest effective difference

抱歉还没有找到合适的词来翻译这三个单词的组合。它出自Edward Tufte,意思是:Make all visual distinctions as subtle as possible, but still clear and effective,翻译过来就是说,让元素视觉差别尽可能细微,但依然保证清晰和效率。一个典型的例子是:

nytimes navigation
消息来自Typographical Contrast

这是The New York Times的导航系统。看上去有什么特别的吗?没有。但是可以很明确地知道哪些是主导航,哪些是次级导航吗?答案是明确的,但是从视觉上说,并不见得是显而易见的,但你却可以明确区分主次,何也?难道真只可意会而不可言传?让我们来分析一下吧。

最重大的视觉差别在哪?颜色?确实次级导航颜色稍微浅一点。等等,我们来做个实验。以下是我处理过的图片:

nyt navigation with same font

这下,仔细看,依然可以区分主次,但是得费更大的劲。注意,我只是把次级导航的字体族(font family)改了一下,从视觉上说,这是很细微的变化,如果不细心根本感觉不出来。但是给你的感觉发生了很大的变化,很明显,主次的清晰性大打折扣,即使是细微到很难觉察(当然,如果你是一个称职的视觉设计师,你一眼就能看出来)的变化。

这就是Smallest effective difference。如果感兴趣,推荐你继续这篇:Design Decisions: Basecamp help.

让我们看看百度之前的首页(由于找不到相关截图,这是我自己加工的,估计就这么个样,如有不对或者你有之前的真实截图,请指出或者提供,谢谢):

百度推行空间前的首页

有一天李老板说,我们要强势推广空间,设计师给我想个方案,在首页上重点突出空间。相信,设计师也准备了大量的方案,套红,加粗,加大等等,这些都是突出的手段。但是,太过突兀会不会伤害用户体验?有没有可能保证空间这一条目跟其他条目之间的差异尽可能小,但是能够重点突出它,吸引用户的注意而又不会让用户产生惊怵?

现在的首页,把空间拎出来,放到了搜索条的下方:

百度现在的首页

空间两字没有套红,也没有加粗加大,只是挪动了一下位置。但是效果就出来了,搜索条产生的非平衡感(不知道这算优点还是缺点,看久了会产生不安,还好用户在这停留的时间很短)让用户迅速把注意力集中到了空间上。Bingo! 目的达到。

尽管我不知道最终决定了这个方案的设计师是否知道Smallest effective difference,但是这确实是一个Smallest effective difference的经典案例。

更新:根据Seven的留言,我的加工图是错误的,而且说是空间跟前面内容逻辑不符而另拎出来(小疑问:那怎么更多就可以跟空间在一块呢),当并妨碍我们的Smallest effective difference的理论,即使百度设计师真的没有过这样的想法。为我的错误图片感到抱歉,但还是不更换了,留着对比能有说服力。

自然,如果没有参与,永远不要去猜测设计师背后的动机或者支持理论是什么,就像机遇只可遇不可求一样。很多事情往往是无心插柳而成,百度如此设计无意中支持Smallest effective difference了,从而也加大了空间的举重。

我们其实还可以做得更多……

我在这里说无障碍或者亲和力,即accessibility, 似乎有点尴尬。商业应用需要吗?除非我们的受众有残障,否则没有利润就不需要。没错,商业。但是,作为公共服务,天赋人权,应该保证信息的受众,无论在何种情况下(当然不是绝对的)都能获取。我们天天吹啊吹“以人为本”,其实政府应该立类似section 508的法了,使我们的政府网站建设有法可依,这才是真正的人文关怀。遗憾的是,作为accessibility的最重要的第一步,即web standards,我们的政府网站不仅还没开始,很多还是ie only的……路,漫漫兮……

虽说商业应用不能太过于关注无障碍,但是,如果不妨碍当前的应用,花点力气,不说为残障人士服务,在某些受限情况下,比如浏览器JavaScript关闭的情况下依然可用或者传达可用信息,那么用户顿生好感,对您的商业应用并非没好处。另外,值得一提的是,搜索引擎其实就是最大的盲人,做好无障碍,您其实就是做好SEO的根基工作。So,why not…,对不起,是所以,为什么不在项目开始的时候,就应该做做无障碍的工作呢?完全按照现有规范WCAG2WCAG1中译版),商业环境,预算等都不允许,但并不是不做点无障碍工作的借口。记住,Web 2.0并不是不能用

比方说,现在我们的网站,在没有CSS的情况下,ul标记的导航一般都会很长,对于我们来说,没问题,拖拖鼠标就ok,但是使用手机的家伙们呢?使用阅读器的家伙们呢(中国有么 -_-)?如果能有一个跳到内容的连接,那么就可以帮助许多人,迅速地跳到她/他所关心的内容上。我们加个连接并不困难吧?那你为什么不加?在我的上一个项目(无须保密,请访问HiThere)中,即使这是个十足的商业网站,我都加上了这个貌似没意义的连接。相信我,努力就有回报,您不能排除您的用户有一天会感动 ^_^。

当我们步入这个号称2的时代,CSS和JavaScript终有发飙之日。忽如一夜春风来,设计师,开发者不断分享各种各样的技巧,是的,有时候甚至是不择手段,目标只有一个,实现项目需求。然而,我们的产品经理不让我们考虑无障碍,right, boy, 你给我实现就是了。这并没有错,但是作为前端最终实现者的我们,在不影响实现的前提下依然可以有所作为。举两个例子,然后结束我们的文章,有所作为并非是为所欲为无所不为。

比如,以图代字的经典方法有两种,无外乎是使用display: none;text-indent两种办法,那么,您考虑过如何选择吗?它们除了技术以外还有什么不同吗?事实上,很多客户端会忽略掉display: none;的元素,当其不存在?不存在?!是的,在我们的视觉中,它是存在的,但其实是它的父元素存在。它的父元素?呃,它是个空元素,它只是一个为CSS而存在的钩子(hook),对视觉有意义。但对屏幕阅读器呢?将会是空白一片,因为文本被display: none;掉了。

Ajax让JavaScript得以复兴,我们很多网站都做了很多漂亮的应用,可以说,极大地提高了用户体验和可用性,但是在无障碍方面,却是不升反降的。您可以亲自去试一下,关闭掉您浏览器的JavaScript,看看还能有多少网站,我不要求能用,能提供出错信息不让用户迷茫的网站能有多少个?在此,我严重推荐ppk的一篇文章,Hide And Seek in The Head。看看人家的JavaScript是怎么用的,您的又是怎么用的?但是,其实您也可以做到,只要多一点点无障碍的考虑,对不?

对!所以,为什么不现在就开始?

P.S. 最近抽空练习了一下Rails,终于能够写一些小应用了,呵呵,我觉得这是我2006最大的进步。欢迎看看:http://www.dup2.net/realazy/,感谢qyb提供的空间,让我也学会了一点点的Rails部署。

web设计95%是排版

看到这个题目,第一感觉是耸人听闻。不管是95%或是更多或是更少,排版确实是一个不可忽略的问题。在我所遇到的web设计师中,或许是遇到的还少,我没有发现谁真正在意web排版。看到这篇文章,感触颇深(因为我刚使用linux的时候需要配置字体,顺便学习了不少的字体知识,也顺便成了一个爱好),周日在家挺闲,为了提高英语水平,顺手翻译了出来。希望对大家有所启发。

这篇文章来自一个研究并提供信息架构的网站:Information Architects Japan,原文:Web design is 95% typography.

又及,文章多次出现typography这个单词。正规的中文翻译应该是“排印”,但考虑web这个非印刷媒体,使用排印并不见得好。于是我根据语境,有时用“排版”,有时用“排印”,请读者明鉴。以下是翻译正文。

web中的信息有95%是成文的语言。为何web设计师应该好好学习一下设计成文信息的主要准则,换句话说,排版?这就是最佳的理由。

信息设计就是排版

回到1969年,Emil Ruder, 一个瑞士著名的排印大师,其笔下关于当时的印刷氛围,简直就是我们今天网站的写照:

今天印刷术的泛滥成灾让我们的个人价值被轻视,因为郁闷的我们现在并不能掌控印刷中的一切。分割、组织和实现印刷术的一切是排印师应有的任务,只有这样,读者才有更好的机会找出吸引她/他的东西。

信息设计师是21世纪的排版师

稍微联想一下(请用在线排版取代印刷),这就像是信息设计师的职务描述。分割、组织和实现印刷术的一切是“信息设计师”应有的任务,只有这样,读者才有更好的机会找出吸引她/他的东西。宏观排版(所有的文本结构)跟微观排版(样式和空间的细节方面)包括我们今天称为“信息设计”的很多方面。也就是说,信息设计师今天正在做排印师30年前的工作:

排版面临一个很直白的职责,这就是传达信息。没有理由能免除排版的这一职责。一个并不能阅读的印刷品只能变成一个无用的产品。

优化排版就是优化阅读,亲和力,可用性(!),综合文本平衡等。组织文本块并结合图片,难道不是图形设计师、可用性专家、信息架构师应该做的吗?但为什么这是一个被忽视的主题呢?

为什么这是一个被忽视的主题?

字体太少?分辨率低?

主要原因——抱怨连天的——不看好在线排版准则的观点是,能用的字太少了。第二个观点是屏幕分辨率太低,让像素或者反锯齿字体之一很难阅读。

文艺复兴:只有一个字体

认为我们没有足够的字体可用的观点是不切题的:在意大利文艺复兴时期,排印师只有一个字体可用,但这个时期还是产生一些顶级漂亮的排版品:

SpecimenBook

该排印师应该没有太在意他手中手能掌握的字体种类,实际上也不应该太在意字体的选择。他应该更关心时代能赋予自己手中掌握的,并尽力发挥。

选择字样并不是排版

第二个观点也并不见得好到哪儿去。在印刷初期,印出来的字母质量比我们今天在显示器上看到的更差。更重要的是,如果处理得专业,屏幕字体更易于阅读。信息设计不是关于使用好的字样,而是关于使用好的排版。两者的区别很大。谁都可以使用字样,有人可以选择好的字样,但只有少数人能够精通排版。

把文本当作用户界面

对,不同平台和不同浏览器如何处理字体是恼人的,也对,分辨率问题很难让注意力集中坚持到五分钟。但是,好啦,确保文本在所有主要平台和浏览器中赏心悦目是web设计师的职责。正确的行间距,单词和字母间距,留白,一定量颜色的使用有助于可读性。但还不彻底。一个优秀的web设计师知道如何跟文本而不仅仅是内容打交道,“把文本当作用户界面”。瞧瞧Kohi Vinh的网站,你大概会明白他的意思:

koivinh

稍微著名把文本当作用户界面的unornamental网站例子有: google, ebay, craigslist, youtube, flickr, Digg, reddit, delicious. 一个难以争辩的必然事实是,把文本当作用户界面是成功的唯一参数。成功的网站设法同时创建简单的界面和强烈的特征。但这是另外一个主题了。

从哪开始

web排版
为了“破除关于web排版的某些荒谬想法”,他已经“按照Bringhurst的工作原则来构建他的网站,并解答如何通过HTML和CSS中可用的技术来达成各项目标”。
优化排版的5个简单步骤
他所谈论的排版“并不是你典型的‘该用哪种字体’的排版”。对于相信让字号和行间距默认大小使得文本能够任意缩放会提高网站可用性的人,这是一个不错的阅读材料。
Khoi Vinh
behaviordesign的创始人之一。现为NYTimes.com的设计主管。非常天才的一个人。
Rod Graves
通讯设计师。令人赞叹的工作:“排版是我绝对的中心。排版网格和层次通常会成为我开发的视觉语言的基础。”
A List Apart
通过字样通讯。字体和布局。为读者设计。易读性。字样,图形设计。web排版的问题。控制web排版:字号、字体和颜色。CSS方法,浏览器问题,用户问题和解决方案。
Association Typographique Internationale
ATypl(Association Typographique Internationale) 是一个专注于样式和排版的主要国际组织。创建于1957年,ATypl为国际样式社区之间提供通讯的结构,信息和活动。
Thinking with Type
书籍Thinking with Type的在线伙伴:设计师,作家,编辑和学生的关键指南。
Typetester
比较屏幕字体样式。
Typophile
Typophile是一个会员制和赞助商支持的社区。2000年以来Typophile引领开放合作,并且我们总是能学习到好主意。我们他们伺服超过每月3百万的网页。
Typohile Wiki
一个有关样式和设计所有一切的用户创建百科全书。用户为建立协作,有用,平衡和相关的资源而创建和编辑条目。
The Next Big Thing in Online Type
比尔盖茨要计算机用户,哦,微软用户,能够拥有一个更舒畅的屏幕阅读体验——太重要以至于提高屏幕阅读成为他最重要的五件事之一。
Emil Ruder, Typographie (Amazon)
Emil Ruder’s Typography是一本永恒的书,几代排印师和图形设计师都从中学习基本原理。Ruder, 二十世纪最伟大的排印师之一,是一个抛弃并用新的规则取代Emil Ruder传统规则的先锋,来满足新排印技术的需求。

更新:该文作者在疑问下迅速推出 第二部分,感兴趣的朋友可以看看。本想翻译出来,但太忙了,有心无力,见谅。

另外,小小抱怨一下,很多朋友都对这篇文章有很多热烈精彩的讨论,但是为什么不发一个 trackback 回来呢?这样可以方便读者追踪文章的各种观点。

网站的反馈提示

有交互就有反馈。反馈可以有很多种,包括各种界面元素,声音或者影像的变化。这种变化的目的在于,提醒用户操作结果。这个结果十分重要,成功,则进入下一阶段的使用;失败,则继续或修改当前操作至成功。一般来说,成功的操作,软件设计的习惯都是直接跳转到下一阶段,没有必要使用冗余的反馈来干扰用户。当然,这个阶段是最后阶段的话,反馈不可少,让用户知道已经完成阶段任务。失败的操作,反馈显得十分重要。如果没有明显的反馈,用户会不知所措,或者干脆放弃对软件的使用。

当然,你知道我不是交互设计师,也不是“用户体验设计师”,我只是一个“页面切割师”(Orz…)……我想从“页面切割”的经验中,从逛到的各种有趣网站(你知道,我热爱互联网 :) )中,谈谈网站(现在流行叫Web App,对,网站也是软件哇)使用过程中的反馈。

网站有自己的特殊性。它必须运行在一个已有的软件(各种浏览器)上,必须受到运行坏境的种种制约。

在'Web 1.0'时代,通常的做法是,所有一切交互,都等待服务器接收数据处理后,返回处理的反馈。看看下面,你是不是觉得很熟悉:

facebook's profile update wordpress

这是经典做法,也是最安全的做法,一切都必须经过服务器的确认。但是碰到网速等因素困扰时,尤其是互联网的洪荒年代,绝大部分人都是通过一根理想值是14.4k的电话线上网,等待服务器的反馈结果,慢得往往让人崩溃。

于是JavaScript应运而生,客户端能做一些最简单的检查,再也不用等服务器的处理。比如:

taobao

JavaScript还有一个更恐怖的提示形式:

google_alert

这种方式可以说臭名昭著,原因在于,弹出这么个对话框时,操作系统(你知道我指Windows)会发出震耳欲聋气势如虹的声音,令用户感觉“超不爽”。其实,或许能改稍微改善这个问题,这种方式的提示还是有其可取之处的。没有任何页面上的提示能比弹出的对话框更让人注意,而且,这个对话框有“冻结操作”的功能,在某些重大场合下,失误的操作会让用户损失惨重。上面的Gmail例子,是发生在放弃草稿邮件(可能已经信心苦苦打了很多字)的“重大情况下”,这么做是合适合理的。

当然,我们可以在页面内模仿这种形式:

zhanzuo

但是,你知道,我一直都强调的,没有JavaScript怎么办?题外话了,程序设计应该考虑到,没有JavaScript情况下,服务器端应该能够正常处理提交结果,不要轻易信任客户端返回的数据而不加检查。

当然,在'Web 2.0'时代,我们也少不了提示,Gmail是这样干的:

gmail_action2

我们知道,“不刷新”是'Web 2.0'的重大技术特征。我们的操作,页面不需重新生成,提示信息可以自动出现在当前页面的某个位置。某个位置?我前面强调过,网站必须在浏览器等客户端内执行,浏览器可以有滚动条。于是,我们的问题来了:

gmail_action

这个截屏跟上一个是同一操作。假如我把滚动条刚好拉到这里,我的操作将看不到任何反馈结果。'Web 2.0'的“不刷新”让我以为什么都没有发生过,首先我会怀疑我的操作有误,继续尝试……假如我看不到上面的提示,我只能放弃。

当然,这不是“不刷新”才有的问题。看看豆瓣的一个添加书评的操作。我在上面做了操作,刷新了,返回的还是这个页面,根据经验,这是不成功的状况。但问题在哪?发生了什么事情?

db1(点击看大图)

我努力寻找,我错在哪啦?知道把滚动条往下拖,才发现:

db2 (点击看大图)

My God…把以说中文为荣的我惊呼夷语。

由于笔者小学语文没学好,在找不到这篇文章的中心思想后决定分析一下豆瓣为什么会这么做。

根据心理学的什么原理来着,用户的注意力往往会发生她/他所操作的地方。比方说,我按下了一个按钮,若有任何问题,我希望反馈就在这个按钮旁边发生。比如:

google_analyst

这是再正常不过的交互与交互反馈了了。但是,我们可能会忽略掉一点,网页的特殊性让我们的操作区域有可能会在刷新后消失于我们的浏览器的可视范围。这种情况下,懒惰,“短暂失忆”的用户不一定会拉动滚动条来找刚才的操作区域,进而找反馈结果。豆瓣是不是忽略了这一点?其实“真正的答案”是:人家豆瓣才不至于像我一样吃饱了没事干去分析什么鸟理论…… XD

在这种情况下,豆瓣这样的反馈信息是不是该向我们第一个例子中的Facebook和WordPress学习,反馈信息直接放在标题下或者能在第一屏的某个地方不是很明显么?

分析这么多,我终于有了一个在写之前没想好的结论:反馈信息应该放在能够让用户感觉得到,最直接了当的地方;在某阶段交互结束后,用户应该能够没有任何操作就能获取反馈信息。

Ajax, 用该所用

我经历的一个项目倒下了。倒不是因为技术落后,反而是因为技术太过先进——整站,所有前端页面都是Ajax处理而产生的。

我们现来看看Ajax是啥(汗,你以为读者是白痴咩~),根据发明人Jesse James Garrett (jjg)adaptive path的一篇文章Ajax: A New Approach to Web Applications中定义,Ajax由几种蓬勃发展的技术以新的强大方式组合而成。Ajax包含:

  • 基于XHTML和CSS标准的表示;
  • 使用Document Object Model进行动态显示和交互;
  • 使用XMLHttpRequest与服务器进行异步通信;
  • 使用JavaScript绑定一切。

可以看到,这是一种以JavaScript为核心的技术,从广义上说,除了服务器端技术,剩下的都是Web标准。

但上一句话并不是重点,做Web标准的读者不用窃喜 XD。

我们来了解一下Jesse James Garrett的背景,他著有一本有名的书,叫做The Elements of User Experience – User-Centered Design for the Web. 啥?User Experience? 没错,jjg是一位资深用户体验专家。

我没有深入调查过,但我身边的人,接触并运用Ajax的清一色都是程序员。我对程序员当然没有什么成见,但术业有专攻,程序员看到这个Ajax定义,理所当然是从技术上入手,为新技术滥用Ajax不亦乐乎无法自拔而不自知,为Ajax而Ajax,忽略了非技术层面的东西,比如,用户体验亲和力(accessiblity)。

所以我认为jjg对于他自己发明的Ajax的定义是不及格的。实际上,按照jjg本来的意思,技术也是为用户体验服务的。About Face 2说,Web的出现让交互设计至少倒退十年,Ajax的出现实际上为了弥补这十年而生,让Web界面操作可以一样或至少接近“正常软件”的操作方式。但jjg的定义对技术层面的东西阐述过了头,缺乏用户体验背景的程序员只能依瓢画葫芦,为Ajax而Ajax。

所以我觉得,哪里该用Ajax,怎么使用Ajax,如何才能做到符合用户体验的需求,这是产品/策划的事情。事实是很悲哀的,产品认为这属于技术问题(至少我身边所碰到的情况都这样)而不加过问。我们可以看到很多大举2.0旗帜的网站,看起来很酷,用起来很苦。漫长的等待没有提示,用户未知情的情况下刷新内容,鼠标一不小心就会犯错,不能后退(这倒是普遍问题),不能撤销等等,很多用户患上了2.0恐惧症

由于我实际上对用户体验并没有研究,不好夸大其词,不好妄加评论,上面只是我的个人想法,有错的话各位看官一定要批评指正,一起学习,共同进步。我着重谈谈亲和力的问题。

众所周知,JavaScript不是什么时候都能用。老旧的浏览器,高安全的环境(比如银行,或者用户设置),文本浏览器(如lynx, w3m),屏幕阅读器,手机浏览器等等,很多场景都限制了JS的发挥与使用。对于正常人,你可以觉得无所谓,反正现在换个或者升级浏览器也是轻而易举的事情,但是,很多障碍人士,却只有很少的选择。Web 2.0并不意味不能用

所以我们必须采取适度降级(graceful degradation)的策略。对于一些非必须由Ajax驱动产生内容的前端页面(比如分页,提示内容的展示),我们就可以采取此策略。我们必须保证,在没有JS的情况下,这些内容可以使用传统(Web 1.0?)的方式来交互产生。这是保证Web具备亲和力的基础。有此保证后,我们就可以采取逐步增强(progressive enhancement)的策略来加入Ajax,使用JS来控制前端的交互,达到用户体验的目的。实际上,读者的疑问可能就在这,如何能够保证适度降级的基础上能逐步增强?实践证明,Unobtrusive Javascript(不冒昧的Javascript? 天,这该怎么翻译?)的思想能够帮助我们做到。何谓Unobtrusive?那就是说,在没有JS的情况下,网页内容依然能够访问(accessible)。概念很抽象,那么我们举个例子说明吧。假如网页有几块内容:

<a href="#a">Show a</a> <a href="#b">Show b</a> <a href="#c">Show c</a>
<div id="a">a</div>
<div id="b">b</div>
<div id="c">c</div>

我们需要按照用户的点击展示每一块内容。通常的做法是,我们会给a标签加上占位符,然后写上onclick=""之类的代码,在某些div加上style="display: none;",让其在默认情况下不可见,然后再让JS操纵其可见性。这是一种不好的,非Unobtrusive的做法。

Unobtrusive的做法是,我们需要让a有意义,而不是只为JS而存在。a应该依照实际情况指向一个实际连接,或者跳到本页的一块内容。我们应该讲JS完全分离出来,不要在HTML混杂onclick之类的事件代码。而且,我们也不应该在默认情况下隐藏内容,应该在页面载入后交给JS来控制,这样,用户在没有或禁止掉JS的时候,她/他还有机会能够看到所需的内容。这是一个最简单的Unobtrusive例子。

所以,结论是,我们要建设具备亲和力的Web 2.0的网站,graceful degradation, progressive enhancement, Unobtrusive是基础。当然,某些完全依靠Ajax的网站,比如Google Maps,得另外讨论。我们可以看到,即使是Gmail,它也有一个非Ajax版本备用。当然,我的意思不是每个网站都应该开发、维护两个以上的版本,我们应该,在保证亲和力的基础上,才逐步Ajax化,而且Ajax应该是用在构建一种新的交互方式,用在用户体验上。

JavaScript习作–优化IE的表单交互

说起网页标准(Web Standards),我一直以来都只关注结构(markup)和表现(presentation),很少涉及行为(behavior),因为这涉及到编程,呵呵,不怕见笑,俺是半路出家了,对编程始终不得法门而入。

工作以来,接触牛人,耳濡目染,近朱者赤,不知不觉也知道了些结构语法什么的。上周某日无聊至极心血来潮,决定搞搞JavaScript看看。嘿嘿,想不到,我胡乱写了一通,竟然达到了我预想的效果!于是我抛下看了将近一个月的色彩管理啊,设计什么的啊,抱起了那本去年O’reilly送我的《JavaScript权威指南(第四版)》,一看入迷,那个DOM,对于手写XHTML代码的我来说,太熟悉了……于是上班途中的公交也不忘K一下她。

几年过去了……哦不,几天过去了……

当前的IE并不支持属性选择器,所以对于表单,你得不厌其烦地为每种类型(type)加上相应的class。最让人不能接受的是,IE不支持:focus,所以不得不求助于JavaScript。

我做了一个表单例子,使用属性选择器input[type="text"]等及其伪类:focus实现我想要的效果,在没有任何JavaScript的情况下,Firefox, Opera工作完美。但是,你知道我要说什么了,对,是IE,没有丝毫的作用。在我加入额外的class的情况下可以为IE进行样式化,然而遗憾的是,要支持focus行为,CSS再也无能为力,所以,让JavaScript出马吧。

我的实现思想是这样的。对于表单的每种typeinput,使用JavaScript为其添加相应的class,我的例子中,我设置class的名字等于其type,即type="text"则其class为class="text",依此类推。而其fucos的效果则增加一个相应的class来实现,命名就是type加上focus这个单词,即type="text"则其fucos的class为class="textfocus",依此类推。

好了,那么,我就用onfocusonblur事件(events)来实现了。当然,这只针对IE,所以在JavaScript中判断了一下浏览器。嗯,这就是今天的习作:http://realazy.org/lab/enform/(用IE看哦)。各位大牛有心的话不妨看看,多指正和优化一下,感激不尽 :)

继续努力学习中……K书again….

如何回到首页?

每当我访问一个新站点,我比较关心的是,当我离开首页以后,我该如何返回呢?我常见的方式有几种:

  1. 在Logo(或站点标识文字或站标)上加入首页的连接
  2. 在导航中列出一个“首页”(或类似)的连接
  3. 在某个角落写上“首页”(或类似)的连接
  4. 第一种情况结合第二,第三种情况之一
  5. 压根没有,用户只能键入站点的网址重来一次

虽然我不懂什么用户体验的狗屁分析,但依据某人说法,用户就是专家。我是用户吗?是的,所以我也是专家,既然是专家,我就说说我的对于上述问题的用户体验吧。我认为,在logo(或站点标识文字或站标)加上首页连接,结合在主导航上加上“首页”(或类似)的连接是最佳方式,只给logo(或站点标识文字或站标)加上首页连接是次佳方式,其他的就不是什么好的实例了,用户体验一定不是那么爽,原因很简单啊,要回到首页,怎么还那么费劲啊……

在logo(或站点标识文字或站标)加上首页连接是一股世界潮流,不知道我的看法对不对,我感觉这是Blog的流行所触发的。对于你我这种经常浏览blog的人是不难发现这股潮流的,所以对我们来说,想返回首页,最习惯的做法是点击 logo(或站点标识文字或站标)了。但为什么我还是认为这是次好的方式呢?并不是所有的用户都知道 logo(或站点标识文字或站标)的点击就是首页,了解这个近乎常识的东西还得培养用户习惯。所以,我认为最佳方式是,在主导航上加入一个“首页”(或类似)的连接。举个实际例子:adaptive path。无论是哪一类用户,无论到了哪里,用户总能轻易找到回“家”(首页)的路。

反观国内的BSP们,就举Sina Blog和Bokee吧,当你访问某人的blog时,请问你能轻易够找到“回家”的路吗?