Limbo: 混沌位面 ———— 这里既空虚又充实,没有规则,没有约束,创造来自思考,生存依赖想像,现实源自梦想。
首页 给我发Email! 订阅

YY专用Wordpress主题终于完成了……

mytheme上次Blogger被GFWED的时候,我说过坚决不转移到WORDPRESS是因为它太迎合我把东西做复杂的欲望,现在实践证明确实如此……

由于形势所迫(不仅因为GFW),我不得不放弃Blogger重新建立一个稳定的BLOG,熟悉WP的插件加上制作这个主题花了4天时间,超乎想象了……时间主要浪费在设计、浏览器兼容上面……本帖我将用来发牢骚,并且分享一些经验教训,没兴趣的同学可以跳转到其他地方去了……

页面设计在中途大幅度修改了3次,这次我想恢复到传统风格,因为如今那种简洁大字体大空白色彩明亮固定宽度居中对齐边缘有阴影的WEB2.0风格太普遍了,作为代表个人形象的BLOG,我希望有一些不同的个性,而且我虽然也喜欢“简洁”,但不喜欢“简单”。本来是想把WEB2.0的设计元素和配色与奇幻游戏元素结合在一起,但尝试过之后发现很困难,主要是配色很难,而且“留白”在WEB2.0风格里确实占很重要的地位,但在这个页面里我没办法留很多空白(何况最初就决定要做三栏布局)。与做图和配色相比,我还是更喜欢写代码,所以我懒得花更多时间来完善目前的设计了……

这个BLOG的布局可以说是实验风格的……三栏的液态布局,左栏的宽度是自适应的,还有一部分内容固定在窗口顶部,无论怎样拖滚动条,它都会随着页面移动,实际上我是受了Westeros的启发才想用这种相对窗口固定的设计,但是实现起来很麻烦(Westeros的效果其实也只支持IE7和FIREFOX,在IE6里会变得像框架布局一样),如果用JS来实现,移动就不可能是平滑的,衔接的效果不好,用CSS来实现却有很严重的缺陷,首先IE7以下版本的浏览器不支持position:fixed属性,必须用HACK来模拟,我采用的方法是用一个DIV来包含所有元素,在IE7以下版本里给它height:100%;overflow-y:auto;的属性,把顶部元素的定位改成绝对,所以IE6用户看到的右侧滚动条其实不是浏览器本身的……

由于用了两种布局方式,而液态布局的三栏里既有浮动也有非浮动,再加上中间的羊皮纸效果必须在左右边缘采用不同的背景图,很多地方的定位都要精确到像素……所以这个主题的CSS写起来很头疼,DEBUG花了很多时间,目前在opera里似乎还有一个毛病,但我一向都是歧视opera用户的(因为占有率才0.8%左右嘛),暂时懒得改了……

由于设计上的限制,有2个地方的布局不得不用JS来调整,一个是改变顶部fixed层的宽度,因为它的定位方式是fixed或absolute,无法做出液态的宽度(也就是说宽度随浏览器的大小自动填充,但是与右侧总保持固定距离),另一个是让左栏和中栏的高度相等,由于无法使用统一的背景图片,所以这里也只能用JS来调整……

我倒不在意什么“预留退路”、“无障碍”之类的JS设计观念,反正如今在WEB上混没有JS已经寸步难行了,而且我没有用JS来影响内容…………但是用JS来调整布局会遇到另一个问题,如今的JS代码都是放在window.onload里运行的,因为页面加载完成、DOM建立之前,很多方法都不能用,但问题在于,window.onload不仅要等DOM加载完,还要等图片(指img标签)加载完,我的BLOG页面里整合了很多东西,每篇文章的题图、YUPOO的相册、豆瓣的封面……如果要等这些东西都加载完才修正布局,显然是不现实的,幸好我在国外一个BLOG上找到解决办法(地址忘记了,抱歉),可以在onload事件触发之前、DOM刚加载完时就执行修正布局的函数:

  1. // for Mozilla DOM onloaded
  2. if (document.addEventListener) 
  3. {
  4.     document.addEventListener("DOMContentLoaded", DOMsinit, null);
  5. }

DOMsinit就是我要执行的函数,第三个参数本来是布尔值,用来决定事件在冒泡还是捕获阶段触发,但DOM加载的事件显然没这些东西,所以必须传空值,以上是适合标准兼容浏览器的方法,对IE要用完全不同的代码(放在HTML里):

  1. <!--[if IE]>
  2.     <script defer src="<?php bloginfo('stylesheet_directory'); ?>/js/ie_onload.js" type="text/javascript"></script>
  3. <![endif]-->

ie_onload.js就是要执行的函数……为了IE要专门增添一个JS文件,真是麻烦……我还没搞清除defer是什么鬼东西,反正这样用就没错了……

就算你只是使用window.onload,也要考虑到:WP本身和某些插件,都可能有自己的JS函数,会用到window.onload,如果你直接写window.onload=function(){……..},就会把其他功能覆盖掉,一定要用这类方法:

  1. if ( typeof window.onload!='function')
  2. {
  3.     window.onload=function()
  4.     {
  5.         yysinit();   //页面加载完成时调用的函数
  6.     }
  7. }
  8. else
  9. {
  10.     var oldonload=window.onload;
  11.     window.onload=function()
  12.     {
  13.         oldonload();
  14.         yysinit();    //页面加载完成时调用的函数
  15.     }
  16. }

本来我还希望用户在改变浏览器窗口大小后,顶部的宽度也能跟着调整(因为用CSS实现的自适应都有这种效果),所以用了window.onresize事件,但大家都知道,即使是液态布局,当窗口小于一定宽度后,布局也会乱掉,因为容器虽然可以自动变形,但内容却不会改变,浮动定位在这方面最敏感……由于我的BLOG页面里内容比较多,所以宽度不能少于900多px,在window.onresize里我也做了相应的处理,但是问题就出来了……这个该死的事件在不同浏览器里的行为不一致,在按住窗口边框——拖动——放开鼠标的操作之后,onresize在firefox里会触发1次,在IE7里会触发2次,而在IE6里……居然触发3次……结果就是:限制最小宽度的函数在IE6里会导致浏览器假死……我觉得没必要为这种BUG自找麻烦,所以把onresize改成这样了:

  1. window.onresize=function(){
  2.     var aVersion=navigator.appVersion;
  3.     var version=parseInt(aVersion.split("MSIE")[1]);
  4.    
  5.     if(document.body.offsetWidth<941)
  6.     {
  7.         if(version>=7 || aVersion.indexOf("MSIE")==-1)getid('outwrapper').style.width="942px";
  8.     }
  9.     else
  10.     {
  11.         if(version>=7 || aVersion.indexOf("MSIE")==-1)getid('outwrapper').style.width="";
  12.     }
  13.    
  14.     getid('top').style.width=getid('sidebar-1').offsetLeft+"px";
  15.  }

version>=7 和 aVersion.indexOf(”MSIE”)==-1 都是浏览器校验,表示只有当IE版本大于或等于7,或者在非IE浏览器里,才限制页面的最小宽度……

本来还想加一些JS效果,比如可折叠的侧栏widget之类,但是把兼容性改下来之后就完全没心情了………………

最后还是回到设计话题,自适应宽度的布局其实还是比较迎合大屏幕(高分辨率),可以充分利用空间,改善用户体验,但是如果页面里内容比较紧凑,那么对于普通分辨率的用户(1024×768)来说,效果反而不如固定宽度……目前主流的BLOG设计是固定宽度,单栏或两栏,底部再加上一栏放各种列表,所以我的布局方法虽然技术上麻烦的多,但也许并不讨好,那也没办法的事……

- 分类: JavaScript, CSS, 用户体验, Blogger

    发表评论
  • 2007.04.04 18:16, Cookies 说:

    传说中的新博客~~很赞~~貌似速度也还行(至少比你的“最深地下城”好)…还有我喜欢新的跳转界面~!~!
    就是貌似更复杂了,什么“受序的文章”“无序的文章”…纠结…
    还是恭喜~~~
    PS:再问一次,你什么时候去上海?

    回复

  • 2007.04.04 18:45, dexter_yy 说:

    ……你的反应好快

    以前的计划是这个月就出发……但是又想多做一些东西,还想看书……

    本来前天还下定决心,从下周开始进入找工作状态……然则从当当网上买的这本书又送到了:
    http://www.douban.com/subject/2032343/

    好想呆在家里看书……

    不过,这个月应该能成行,到下周我的几个小项目就可以整理完了……

    回复

  • 2007.04.05 00:05, txtxp 说:

    好华丽 我对wordpress彻底改观了
    有空能做到一半我就满足了 还不算特效

    ps:羊皮纸的右边用ie还是差1px
    还有请问这里用的是哪里的托管?

    回复

    • 2007.04.05 00:19, dexter_yy 说:

      盘古的合租主机

      那1px的问题似乎是IE6特有的,在调整窗口大小的时候偶尔会出现……不知道是什么原因,直接在最大化窗口里打开页面应该不会有这种现象罢?

      很多WEB2.0网站用简洁朴素大空白的设计,其实也是为了避免这种像素级定位带来的问题……

      回复

  • 2007.04.05 01:15, txtxp 说:

    thx
    事实证明就是在最大化窗口里有才有 手动拉到最大的反而就没有了 有可能ff和ie6的最大化尺寸根本就是不同的 差在窗体左侧那1px上 其实我是不懂的……

    ps:又看到那些个zib的图 当时觉得好玩把注释翻译又查了查
    当时没人认出来的很大一部分都是无名氏http://www.blogcn.com/user18/txtxp/blog/56274482.html
    要用ie 否则一团糟 这就是web1.0……

    回复

  • 2007.04.08 10:50, AlbertNi 说:

    呃,几点意见。把标题和菜单栏固定那果然华丽,然则有个很大的问题。。。右边栏(羊皮纸外的)居然也会滚动。。。直到内容顶上标题栏右边。。。实在是不可忍。最好应该是羊皮纸内和羊皮纸外分别滚动,互不影响(更好是中栏和右栏的内容重新整理一下,把和blog文章相关的放在一栏,delicious、广告之类的放另一栏)。
    另外一个小问题,评论栏居然无光标!这个设计实在是。。。无比邪恶

    回复

  • 2007.05.28 12:00, Matthew 说:

    爽歪歪的博客。超喜欢。我一定常来看看,不要赶我走就是了。哈。。

    回复

  • […] 今天被土豆网的lex鄙视了,因为我的BLOG在Safari里根本无法浏览——loading永远不会结束,很明显,这意味着webkit引擎不支持上次提到的判断DOM加载完成的方法。既然开了新文章,就干脆重新回顾一下这个问题:如今的javascript编程非常依赖DOM(文档对象模型),对HTML和XML来说,DOM是 一个应用程序接口 (API) ,对JS来说,DOM为文档创建了程序可以使用的对象和方法,DOM把前端程序和内容结合在一起,就好像ORM(对象-关系映射,比如PEAR库里的DB_DataObject)把后台程序和关系数据库结合在一起,形象点说它是一颗节点树,没有这棵树的支撑,很多JS方法就无法使用。 传统方式是通过window.onload事件来判断DOM是否加载完成,但实际上它的加载时间里还包括了img标签插入的图片、FLASH等大家 伙,很多时候,来不及等这些东西都下载完成才执行JS(特别是当你要用JS给页面元素注册事件、调整外观,用AJAX加载重要内容)。所以必须有一种方法 来单独判断DOM是否加载完成。 […]

    回复

(一定要填写)

(一定要填写, 不会公开喔!)

GOSPEL OF YY

    My philosophy, in essence, is the concept of man as a heroic being, with his own happiness as the moral purpose of his life, with productive achievement as his noblest activity, and reason as his only absolute.

    -- Ayn Rand
    《Atlas Shrugged》