三个月前,老鱼在其博客和支付宝UED博客中发表了浅谈产品设计中的可用性和可访问性。
文中阐述了这样一种状况,页面上有元素需要暂时隐藏以避免过多的信息对用户产生干扰。而隐藏的信息需要通过脚本的交互显示出来,以增强可用性。那么对于不启用脚本的用户,如何保证可访问性的问题。
文中提到两种方案:
实现方案1:采用css样式设置企业注册信息的容器默认为隐藏,当用户点选企业后通过js脚本改变容器的隐藏属性为显示。
实现方案2:通过脚本控制企业注册信息的容器的初始状态为隐藏,当用户点选企业后通过脚本改变容器的隐藏属性为显示。
方案一的缺点在于无视可访问性
方案二的缺点在于“要在页面结构加载完成后,再去初始化要隐藏的容器,当客户端网速不佳的情况下,会先显示企业注册信息的内容,几秒后又不见了,体验上有所折扣。”
我又在文章的一楼评论中提出了两个方案:解决了第二个方案的缺点
实现方案3:把脚本直接紧跟着需要隐藏的元素后面
实现方案4:在页面头部最开始的地方写入脚本,这个脚本用于生成隐藏元素的css代码。
方案三的缺点在于结构行为和样式的高度耦合,非常不利于维护,且易被同行耻笑。
方案四比上面略好,但同样由于行为和样式的混杂,不利于维护。
还有这位兄弟提出的
实现方案5:用脚本给body加上个class,所有需要隐藏的元素的CSS都用这个class开头,比如 .js #id{display:none;}
今日又发现新思路,利用noscript标签。这个圡圡的标签。这本来应该是最先想到的,却似乎思维被僵化了,一味从JS和CSS角度去看了,忽略了HTML本身。
实现方案6:首先使用方案一,直接用CSS隐藏元素,然后再方案一的基础上,增加noscript标签,其中的再写入CSS用来覆盖先前的CSS。(演示代码代码在本文结尾)
是的,就这么简单、这么的圡,但很有效。对于 IE 6 和 Firefox 3测试通过。Chrome上我找不到关闭脚本的选项,故未经测试。
当一切看起来这么美好的时候,放到W3C的验证里边就有麻烦了,XHTML下他说noscript不能没有object?我很晕,然后放上object后他又说style不能放在这里,只能放在head里。我换用了link也一样报错。换了html 4也没有好转。
我在XHTML的描述中没有找到相关内容 http://www.w3.org/TR/xhtml1/
而在HTML 4.01中发现,http://www.w3.org/TR/html401/interact/scripts.html#h-18.3.1
然后我纳闷了一下,里边并没有提到noscript里不能放style和link。进一步考据,找到http://www.w3.org/TR/html401/struct/links.html#h-12.1.3
这里提到
The LINK element may only appear in the head of a document.
又找到 http://www.w3.org/TR/html401/present/styles.html#h-14.2.3
The STYLE element allows authors to put style sheet rules in the head of the document.
但无论如何,我head里放个noscript,里边再带个style或者link就不让我通过验证了!什么世道!
当然,这么2的事情,W3标准的制定小组早就想到啦! 在HTML 5中,这个问题将会被解决。可以参考这里: http://www.w3.org/TR/html5/semantics.html#the-noscript-element。同时代码页成功通过了验证。
标准这种东西我向来就把他当作迷信一样,不可不信也不可全信。对于这个问题,我宁可不遵守。因为无论从技术实现,还是语义化HTML,抑或者可用性角度来看,这都是个完美的解决方案,我不想被标准这个玩意所束缚。一方面现在主流的浏览器都支持,没有兼容性问题,另一方面将来的标准也支持这种做法,何乐而不为呢?
两种情况下不适合用方案六:
1,你是极端完美主义者。
2,你的老板或者客户只认W3C验证。
测试地址:
http://shawphy.com/demo/noscript-for-css.html
直接到W3C接受检验:
http://validator.w3.org/check?uri=http://shawphy.com/demo/noscript-for-css.html
附代码,我为了方便其间,用了HTML 5的doctype: