月度存档: 九月 2009

谨慎使用 CSS Sprites

今天在139ued 看到这篇文章,感觉写的真不错,在这里收藏了

CSS sprites 是网站速度的优化很重要的一环,但也有其对性能的不利之处。

Vladimir Vukićević 的博文《To Sprite Or Not To Sprite》提到:

CSS sprites 的最大问题是内存占用。非精确构造的 sprite 图片会占用意想不到的内存空间。以 WHIT TV 网站为例,这里是一张 sprite 图片,1299×15,000 的png,已经经过很好的压缩,实际下载大小只有26K左右,但是浏览器不会转换压缩的图像数据。当图片下载并解压,将耗费75MB内存(1299 * 15000 * 4)。如果图片没有阿尔法透明,可能会减小到1299 * 15000 * 3,可往往还是牺牲了渲染速度。即便如此,我们占用了55MB内存。这张图片绝大部分是空白的,什么都没有,没有什么有用的内容。仅仅因为这张图片,当浏览器只加载WHIT 主页时会增加75+MB内存。

Mozilla Web Development Blog 在《 Use Sprites Wisely》中总结道:

简而言之,即使是很小的 sprite 图片也有可能吃掉大量的系统内存 — 每个页面50M甚至100M或者更多。速度虽然至关重要,但要意识到 sprite 及其他 hacks 同样会影响用户体验。

现在再回过头看之前的《Yahoo与Gmail的CSS Sprites对比》,综合性能方面 Gmail 无疑占了上风。当然,这些只是前端层面的优化,从根源上来看,设计师用最少的图片来实现最优的效果才是王道。

正如雅虎女工程师 Nicole Sullivan 在 Velocity 2009 大会演讲 PPT 《The Fast And The Fabulous》所提到的:

consistent design = clean code = fast site(一致的设计 = 更干净的代码 = 更快的网站)

关于文件命名

遇到一个很实际的问题:由于不想增加目录的深度,减少磁盘寻址的时间,需要减少一些目录层级。

原目录结构

大家都知道建立文件夹是为了让文件管理更加的方便,现在需要减少文件夹,如何保持文件管理的方便就成为必需解决的。很容易我们想到通过命名来解决这个问题,那是不是随便一个命名都能起来方便管理的作用呢?样式的命名规则是否适用?对于样式的命名,在《 [更新] 样式命名规则 》已经有讨论,可是样式的命名规则并不能被应用到文件的命名中,毕竟使用的环境不太一样,要解决的问题也不太一样。样式命名要解决的是名称语义化,通过名称能知道这个定义的作用范围;而文件的命名要解决的是更方便的找到对应的文件,当然如果名称有意义,也会有帮助,更重要是要解决同一文件夹下如何更快找到文件。

怎样才能更快找到需要的文件呢?操作系统通过路径能正确找到对应的文件,因为在每一层目录里,所有的标记(目录名、文件名)都是唯一的。而我们找一个文件,一般会需要下面的信息:

  • 文件名(叫什么,一般这个信息会有缺失)
  • 文件类型(图片?样式?页面?还是什么?)
  • 所在域名、栏目的位置(在哪个地方?)
  • 什么时间修改过
  • 路径(就算知道了,一般也不是直接就能使用的,需要层层点击)

对于电脑来说,它并不需要目录名或文件名多容易看懂,只要符合命名规则、同一层级下唯一就可以。但对于我们来说,更希望能通过命名知道更多的信息,因此需要命名有一定的意义。回到一开始的问题,如果当前就在最后的一层目录里,面对那么多的文件,如何更方便找到需要的文件?没错,通过排序可以将文件进行分类,最常用的排序有三种:

  • 文件名(以每个字母从A-Z的顺序排序)
  • 按修改日期(以文件的修改日期为排序条件)
  • 按文件类型(先将文件以类型分类,同类文件再以文件名排序)

为了更好的让排序发挥作用,文件的命名就需要有一些规则。文件名的组成大家应该清楚吧?一般格式为“名称.扩展名”,需要复习的同学可以看这里( http://baike.baidu.com/view/733183.htm )。扩展名也是文件名的一部分,但这部分比较固定,没有什么可发挥的。前面“名称”的部分是我们讨论的重点。发散下思维,我们可以想到添加一些相对固定的词来起到分类的作用,我们称之为“缀”,从位置上可分为“前缀”和“后缀”。

常用的缀:预设目录名、文件类型、域名、日期、版本号

例如名称为“demo”,加上前缀或后缀的形式如下:
预设目录名:css_demo |demo_css
文件类型:png_demo | demo_png
域名:blog_demo | demo_blog
日期:20090904_demo | demo_20090904
版本号:v1_demo | demo_v1

前缀的作用:区分同一类型的文件名,由于操作系统的排序规则(同一类型的文件以文件名排序),因此前缀能很好的起到区分的作用。比较符合阅读的习惯。缺点是如果使用键盘导航(直接使用键盘可以跳到对应字母的文件位置),由于前缀相同,会有一定的影响。

后缀的作用:后缀一般用于版本的控制,像存档、多版本、备份等等。缺点是如果名称过长,不太直观。

修改后的结构图

我们来看看两种方式的差别在哪:

按名称排序

按修改时间排序

按类型排序

上面几个图是将添加了前缀和后缀的文件放到同一目录下,分别使用三种排序的结果。由于模块化的制作方式,文件一般会以模块为单位分布,使用前缀的时候往往会因为文件类型不一样使同一模块的文件被分散到不同的位置,而使用后缀反而可以很好的将同一模块的文件归到一起。从上面的图可以看出这点。因此在这种情况下,使用后缀会更方便于文件的查找。

请给PNG8一个机会

系列一:图片格式介绍

Gif格式特点

透明性

Gif是一种布尔透明类型,既它可以是全透明,也可以是全不透明,但是它并没有半透明(alpha 透明)。

动画

Gif这种格式支持动画。

无损耗性

Gif是一种无损耗的图像格式,这也意味着你可以对gif图片做任何操作也不会使  得图像质量产生损耗。

水平扫描

Gif是使用了一种叫作LZW的算法进行压缩的,当压缩gif的过程中,像素是由上到下水平压缩的,这也意味着同等条件下,横向的gif图片比竖向的gif图片更加小。例如500*10的图片比10*500的图片更加小

间隔渐进显示

Gif支持可选择性的间隔渐进显示

由以上特点看出只有256种颜色的gif图片不适合照片,但它适合对颜色要求不高的图形(比如说图标,图表等),它并不是最优的选择,我们会在后面中看到png是最优的选择。

Jpeg格式特点

透明性

它并不支持透明。

动画

它也不支持动画。

损耗性

除了一些比如说旋转(仅仅是90、180、270度旋转),裁切,从标准类型到先进类型,编辑图片的原数据之外,所有其它操作对jpeg图像的处理都会使得它的质量损失。所以我们在编辑过程一般用png作为过渡格式。

隔行渐进显示

它支持隔行渐进显示(但是ie浏览器并不支持这个属性,但是ie会在整个图像信息完全到达的时候显示)。

由上可以看出Jpeg是最适web上面的摄影图片和数字照相机中。

Png格式特点

类型

Png这种图片格式包括了许多子类,但是在实践中大致可以分为256色的png和全色的png,你完成可以用256色的png代替gif,用全色的png代替jpeg

透明性

Png是完全支持alpha透明的(透明,半透明,不透明),尽管有两个怪异的现象在ie6(下面详细讨论)

动画

它不支持动画

无损耗性

png是一种无损耗的图像格式,这也意味着你可以对png图片做任何操作也不会使  得图像质量产生损耗。这也使得png可以作为jpeg编辑的过渡格式

水平扫描

像GIF一样,png也是水平扫描的,这样意味着水平重复颜色比垂直重复颜色的图片更小

间隔渐进显示

它支持间隔渐进显示,但是会造成图片大小变得更大

更多关于PNG

PNG8

256色PNG的别名

PNG24

全色PNG的别名

PNG32

全色PNG的别名

其它图片格式与PNG比较

众所周知GIF适合图形,JPEG适合照片,PNG系列两种都适合。

相比GIF

PNG 8除了不支持动画外,PNG8有GIF所有的特点,但是比GIF更加具有优势的是它支持alpha透明和更优的压缩。所以,大多数情况下,你都应该用PNG8不是GIF(除了非常小的图片GIF会有更好的压缩外)。

相比JPEG

JPEG比全色PNG具有更加好的压缩,因此也使得JPEG适合照片,但是编辑JPEG过程中容易造成质量的损失,所以全色PNG适合作为编辑JPEG的过渡格式.

本文来源:http://www.ued163.com/?p=640

Yahoo给出的34条网站加速方法

Yahoo给出的包括Yslow规则(22条)的34条 详细说明 ,通过这此规则对自己页面进行一次全面的分析优化,可以提高你网站的加载速度。

1.Minimize HTTP Requests 减少HTTP请求
图片、CSS、script、flash等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,利用 CSS sprites 将小图拼合后利用background来定位。

2.Use a Content Delivery Network 利用CDN技术
CDN 确实是好东西,8过服务器提供商的这项服务一般是要收费的,我以前买的国内空间是有这个的但是我当时根本不知道啥用,现在没了。。。

3.Add an Expires or a Cache-Control Header 设置头文件过期或者静态缓存
浏览器会用缓存来减少http请求数来加快页面加载的时间,如果页面头部加一个很长的过期时间,浏览器就会一直缓存页面里的元素。不过这样如果页面里的东西变动的话就要改名字了,否则用户端不会主动刷新,看自己衡量了~ 这项可以通过修改.htaccess文件来实现。

4.Gzip Components Gzip压缩
Gzip格式是一种很普遍的压缩技术,几乎所有的浏览器都有解压Gzip格式的能力,而且它可以压缩的比例非常大,一般压缩率为85%。压缩没压缩,可以到 这里 做下测试。

5.Put Stylesheets at the Top 把CSS放顶部
让浏览者能尽早的看到网站的完整样式。

6.Put Scripts at the Bottom 把JS放底部
网站呈现完毕后再进行功能设置,当然这些JS要在你的加载过程中不影响内容表现。

7.Avoid CSS Expressions 避免CSS Expressions
CSS表达式很可怕,这个只被IE支持的东西执行时候的运算量非常大,你移动一下鼠标它都要进行重计算的,但有时候为了做浏览器的兼容必须要用到这个||| IE6去死去死!~

8.Make JavaScript and CSS External 将JS和CSS外链
前面讲到了缓存这个事情,一些较为公用的JS和CSS,我们可以使用外链的形式,譬如我就是从Google外链来的Jquery文件,如果我的浏览者在浏览别的使用了这个外链文件的网站时已经下载并缓存了这个文件,那么他在浏览我的网站的时候就不需要再进行下载了!~

9.Reduce DNS Lookups 减少DNS查找
貌似是要减少网站从外部调用资源,我的Google分析和picasa的外链图片都算在里面了。

10.Minify JavaScript and CSS 减小JS和CSS的体积
写JS和CSS都是有技巧的,用最少的代码实现同样的功能,减少空白,增强逻辑性,用缩写方式等等,当然也有不少工具也能够帮你实现这一点。

11. Avoid Redirects 避免重定向
再写入链接时,虽然“http://www. today-s-ooxx. com”和“http://www. today-s-ooxx. com/” 仅有一个最后的“/”只差,但是结果是不同的,服务器需要花时间把前者重定向为后者然后进行跳转,这个要自己注意,也可以在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。

12. Remove Duplicate Scripts 删除重复脚本
重复调用的代码浏览器并不会识别忽略,而是会再次运算一遍,这当然是大大的浪费。

13. Configure ETags 配置ETags
搞不清楚咋回事,总之我是在. htaccess里把它删除了。

14. Make Ajax Cacheable 缓存Ajax
Ajax是实时响应的,在浏览器接收到新的数据前,旧的数据被缓存,这样能够更好的提高效率。

15. Flush the Buffer Early 尽早的释放缓冲
当用户进行页面请求时,服务器端需要花费200到500毫秒时间来拼合HTML,将写在head与body之间,释放缓冲,这样可以将文件头先发送出去,然后再发送文件内容,提高效率。

16. Use GET for AJAX Requests 用GET方式进行AJAX请求
Get 方法和服务器只有一次交互(发送数据),而 Post 要两次(发送头部再发送数据)。

17. Post-load Components 延迟加载组件
最先加载必须的组件进行页面初始化,然后再加载其他,YUI Image Loader 是很好的例子。

18. Preload components 预加载组件
提前加载以后可能用到的东西,和延迟加载并不冲突,它的目的是为后续请求提供更快的响应,参见Google首页上的CSS sprites应用。

19. Reduce the Number of DOM Elements 减少DOM元素数量
复杂的页面结构意味着更长的下载及响应时间,更合理更高效的使用标签来架构页面,是好的前端的必备条件。

20. Split Components Across Domains 跨域分离组件
页面组件多个来源可以增大你的平行下载量,但注意不要过多,超过2-4个域名会引起上面说到的DNS查找浪费。

21. Minimize the Number of iframes 减少iframe数量
需要更有效的利用 ifames。
iframe 优点:有利于下载缓慢的广告等第三方内容,安全沙箱,并行下载脚本
iframe 缺点:即使为空也会有较大资源消耗,会阻止页面的onload,非语义

22. No 404s 不要出现404页面
站点本身里(非搜索结果)出现404页面,无意义的404页面会影响用户体验并且会消耗服务器资源。

23. Reduce Cookie Size 减小Cookie
Cookie在服务器及浏览器之间的通过文件头进行交换,尽可能减小Cookie体积,设置合理的过期时间,能够很好的提高效率。

24. Use Cookie-free Domains for Components 对组件使用无Cookie的域名
对静态组件的Cookie读取是一种浪费,使用另一个无Cookie的域名来存放你的静态组件式一个好方法,或者也可以在Cookie中只存放带www的域名。

25. Minimize DOM Access 减少DOM的访问次数
JS访问DOM是很慢的,尽量不要用JS来设置页面布局。

26. Develop Smart Event Handlers 开发灵活的事件处理句柄
DOM树上过多的元素被加入事件句柄的话,反应效率肯定会低,YUI事件工具有一个 onAvailable 方法可以帮助你灵活的设置DOM事件句柄

27. Choose < link >over @import 使用< link >而非 @import
在IE中使用@import就和在页面底部用< link >一样,我们前面说要把< link >放顶部的。

28. Avoid Filters 避免过滤器的使用
如果需要Alpha透明,不要使用AlphaImageLoader,它效率低下而且只对IE6及以下的版本适用,用PNG8图片。如果你非要使用,加上_filter以免影响IE7+用户。

29. Optimize Images 优化图片
将你的GIF转为PNG8会是个减小体积的好办法,另外有很多方法处理你的JPG及PNG图片以达到优化效果。

30. Optimize CSS Sprites 优化CSS Sprites
在CSS Sprites中竖直并尽量紧凑的排列图片,尽量将颜色相似的图片排在一起,会减小图片本身的大小及提高页面图片显示速度。

31. Don’t Scale Images in HTML 不要在HTML中缩放图片
图片要用多大的就用多大的,1000X1000的图片被width=”100″ height=”100″以后,本身的KB数是不会减少的。

32. Make favicon. ico Small and Cacheable 缩小favicon. ico的大小并缓存它
站点的浏览器ICO应该不是经常换吧,那就长时间的缓存它,并且最好控制在1K以下。

33. Keep Components under 25K 保证组件在25K以下
iPhone不能缓存25K以上的组件,并且这还是要在被压缩前。

34. Pack Components into a Multipart Document 将组件打包进一个多部分的文档中
就好像在邮件中加入附件一样,一个HTTP请求就够了,但是这一技术需要确保你的代理支持,iPhone就不支持。

译文:http://paranimage.com/yahoo-given-34-web-acceleration/

公用样式模板的设计制作

这个话题是应腾讯ISD同仁之邀在WebReBuild三周年交流会上做的主题分享。由于临场等原因有些问题当时没有讲明白,回来后按原有思路形成了一篇小论文,对其中一些问题进行了进一步阐述。现场有位同行朋友提出了对使用表现性语义的质疑,当时没有给出让他满意的答复,因此文章中花了较多的篇幅来探讨语义性有关的问题,算是对那位朋友的解答。

一、 公用样式模板的“公用”的含义

1. 能够应用在不同功能的web系统上(用在哪?)

企业的web开发团队除了开发一些在公共平台运营为公司用户服务的web产品,也会开发一些供公司内部团队使用的信息管理系统(IMS,Information Management System),用以优化流程,提高办公效率。例如企业ERP(Enterprise Resource Planning)、人事管理、工作流程管理、销售管理、仓库资源管理等系统。这类系统主要供内部部门使用,功能繁杂,注重信息的组织和功能的实现,对前台界面的个性化要求不高,不必要每个系统都重新设计制作界面,提供一套公用样式模板可以有效地提高开发效率。

sys1

2. 提供给不同专业背景的人使用(给谁用?)

有一类web页面时效性很强,需要非常快速地制作上线,例如一些新闻专题;另外有些页面总量很大,但结构相似,例如上面提到的IMS系统的很多不同的功能模块。这类页面由于时间限制或者根本没有必要由专业的重构人员来精细制作,写好每一个页面每一个标签的代码,所以也有必要提供一套使用方便的公用样式模板,供内容编辑、或者后台开发人员直接使用。

special

二、 公用样式模板的设计要求

能够应用在多个web系统上要求

1. 公用模板设计需要具备抽象性、代表性

(1). 整体规划页面层次逻辑
  1. h1,h2,h3,h4,h5,h6 的整体规划index

    一本书的目录部分,往往能很清晰地体现出这本书的结构层次,第一章第一节第一小节,次序井然。好的网页也应该有清晰的层次逻辑,网页大标题、次级标题、段落内容等,层层展开。(X)HTML网页标记语言本身也给我们提供了标识网页层次的标签:h1/h2/h3/h4/h5/h6。在公用模板中要整体规划好网页内容的结构层次,并恰当地使用这些标签来体现。在禁用CSS的情况下,可以从浏览器默认样式方便地看到网页的结构层次。

  2. 清晰的导航菜单和面包屑(crumb)标识在做好上面合理地规划h(n)标识的情况下,导航菜单和面包屑导航在网页上能更加直观地体现网页的层次,也是增强网页可用性必须具备的网页元素。
(2). 具有代表性的页面布局结构

layout

网页结构布局也有一定的范式,往往包括页头、导航菜单、主体内容和页脚。遵循这些最普遍的布局原则才能最大程度保证公用模板的通用性。

(3). 具有代表性的页面元素
  1. Logo、网页大标题p1

    Logo具有品牌标识作用。大标题最直接地告诉用户网页/系统的内容/用途,但不是必备的,有些网页只有logo和副标题,因此设计时网页大标题可以作为可选项目。

  2. 导航菜单p2

    导航菜单的重要作用不再强调。需要注意的是,在设计模板菜单样式的时候,要有标识当前项的样式,以及需要特别强调的进行高亮显示的项目样式。还要考虑多级菜单对子菜单进行下拉或者折叠显示的情况。设计的时候考虑周全,在需要的时候可以方便地进行拓展。

  3. 面包屑导航p3

    不多强调,相当于网页上的GPS。

  4. 数据表格、文本内容p4

    这类元素往往是网页的主体内容,用以呈现格式化的信息。在设计制作数据表格的表头、单元格样式的时候,需要考虑根据不同的数据形式,样式可能也会不同。比如较长的文本内容可能需要在单元格里左对齐,而数字类型数据,为了直观地比较数位大小,通常需要右对齐。有时候数据内容比较多,需要分页进行显示,所以也有必要提供一个具有良好用户体验的分页样式。

  5. 数据录入表单p5

    用以录入数据的表单组件:单选框、复选框、下拉框、文本框等等。可以根据需要对这类网页原生的交互组件的默认外观进行统一的初始化。如果对交互效果要求比较高,需要设置鼠标、键盘事件与表单项进行交互时的不同样式(如 onmouseover、onclick、onfocus等)。由于IE6-对伪类选择器(hover、focus)支持不完善,制作这些效果的时候要使用脚本进行一些兼容处理。另外,还有一些填写表单时的注意事项等提示类信息,以及对录入数据进行验证出错时的错误提示信息,这些信息通常会显示在表单旁边,验证错误时还需要将出错的表单项进行高亮显示,这些样式在公用模板里都需要进行设计。

  6. 各类备注、报错、提示信息包括上面提到的附加在元素旁边显示的表单填写提示及验证报错,和一些对内容进行解释的备注说明等,还有一些可能会以单独模块出现,例如用户操作成功、失败或者是登陆超时等提示信息。
  7. 交互UI组件:切换标签、下拉菜单和模态弹窗等p7

    除了网页表单控件以及浏览器提供的消息组件(alert、confirm、prompt),经常还需要用到一些自定义的交互组件,例如切换标签、下拉菜单,以及考虑到易用性问题而对浏览器消息组件进行封装的模态弹窗等(例如lightbox、thickbox),可以选择最常用组件集成到公用模板中。

能够供不同专业背景的人员使用则要求:

2. 使用方便,易于自学

(1). 简单易记的命名规则
  1. 结构语义性:class=”newsList” wrapper、nav
  2. 表现语义性:class=”textLeft” cRed、f14px

具有语义的内容是最容易理解记忆的。有一种记忆法就是使用一些有一定意义的联想来增强对陌生内容的记忆。公用模板中可以使用具有简明语义的名称来对选择符进行命名,这样,非专业做重构开发的模板使用者,不必具有专业的CSS方面的知识或者是阅读很复杂的说明文档即可从命名上对模板中的选择符的用法进行理解,掌握了其中的规律,就可以非常快速地自学以达到熟练运用。

Web标准的所谓的语义性,主要是指(X)THML标签上的语义,强调要按照标签元素最初的定义去使用他们;同时提倡要使用具有结构属性语义的标签,而避免使用具有表现语义的标签。例如使用h(n)来标识各级标题,ol用来建立一个有序列表,li来标识列表项;对于small、b、i、blink、center这类含有元素视觉表现语义的标签,则要尽量避免使用。事实上除了(X)HTML标签名上固定的语义,还可以通过一些标签自定义的属性值来增强语义。例如后来出现的微格式(Microformat),就是基于class属性值的语义性的应用。

由于id的唯一性,使用id选择符的样式在同一个页面中不能重用。为了保证定义样式的可重用性,通常需要使用类定义(class)作为选择符。在对class属性值进行语义化命名的时候,严格遵循web标准结构与表现分离准则的人可能会排斥使用表现性语义,他们认为一旦需要通过改变CSS定义来更新元素的外观,类选择符所含有的表现语义就会与它修改后的实际外观不符合。例如设置左对齐并且类命名为“textLeft”的样式,如果把CSS定义更改为右对齐,则类选择器的命名语义与它的实际内容并不符合。首先要承认这种考虑是非常细致的。但实际项目的开发往往非常复杂,要综合考虑多方面需求,很难在某一方面达到理想状态。在一个大型系统的诸多页面中,要将所有使用到样式的元素都用某个结构特征来进行描述,从我的个人经验来看这是非常伤神的一件事。这些具有细枝末节的结构语义的样式的通用性也很成问题——有些元素只是使用了相同的样式,比如相同的字体、颜色等,但他们代表的结构属性却并不相同,如果选择器全部以结构语义来进行命名,很多外观相同但结构语义不同的样式就要重复定义了。例如,我们在如下两个地方都用到了红色字体,一个是报错警示信息,一个是地方是股票上涨点数,如果全部用语义命名方式,就需要分别命名一个“error”和一个“strengthen”的类定义,并且都设置属性“color:red”,这个“color:red”就在这两个地方重复定义了。如果有一个以表现语义命名的类“cRed”并设置表现语义所对应的红色样式,就可以在这两个地方同时使用“cRed”这个类了。另外还需要强调的是,我们设计制作的是“公用样式模板”,已经是经过整体规划高度抽象化了的具有代表性的元素样式,应该保持已有CSS的稳固,在需求有变的情况下宁愿去改变(X)HTML端的选择器挂钩,而不应该随意改变CSS中已定义好的属性。在必要的地方使用表现语义进行命名也是有一定合理性的。

所以,任何固有的规则都会有两面性,需要我们根据实际情况去权衡利弊。在对可变需求有一定的预见性的情况下,灵活地打破规则书写更易维护代码这也是开发人员的一项专业素质。“遵守规范的一个重要标准,就是知道何时打破它,并大胆地打破。”不应该死守教条,这样只会画地为牢自筑樊篱。只有搁置争议,综合运用,才能在项目需求、开发成本、维护成本的多方博弈中取得均衡。

(2). 简单易理解的嵌套层次
  1. 布局最好可视化,能通过 IDE 操作,局部运用table
  2. table布局的弊端:不符语义性、解析慢、重用性

学业启蒙时代习字本上的方格子,办黑板报也先用三角尺来画格子,这些少年时的记忆都直观地给了我们这样的印象,规整的格子是来排版布局的最好辅助。互联网发展初期的网页也是用表格(table)来进行布局的,这个时期的Web设计人员直接在IDE的可视化视图下就可以完成页面的排版布局。随着技术的深入发展,table布局方式的弊端也逐步暴露出来——语义性差不利于搜索引擎,整个table全部加载完才显示出来导致浏览器解析缓慢,代码不够精简冗余度高等。网页设计制作人员开始使用更专业的方式来进行网页布局——(X)HTML来标记数据组织结构,CSS设置外观样式。这种新的方式克服了table布局时代的一些缺陷,也对网页制作人员有了更高的要求,需要专业的代码编写知识甚至一些复杂的技巧。比如,为实现三列等高自适应的布局,有些重构人员通过运用复杂的标签嵌套,配合一些奇异的CSS hack方式来最终实现效果。

在提供给其他专业背景人员使用的公用样式模板中,我们也推荐使用CSS进行布局,但那些复杂的嵌套方式则是不可取的。这对于使用者来说不易理解,也难以使用。简单易理解的嵌套层次是必要的,甚至,为了给使用者带来方便,我们还可以对web标准进行一些折衷——鉴于table布局的直观和在IDE可视化视图里可以直接进行操作,我们可以在局部范围使用一些小的table来实现多列的布局。如下图例:

layout1

整体框架布局采用CSS控制,在局部的小模块里,使用table(图中红色部分所示,实际运用中边框不可见)来实现多列的布局,其他地方,web标准推荐使用什么就采用什么标签。这样,一定程度保持了语义性(实际上,页面语义性标签对于搜索引擎的引导作用会越来越小,随着搜索引擎越来越智能化,分词技术、数据挖掘技术的进一步发展,搜索引擎完全可以脱离页面标记而直接从文本内容来分析页面。语义化更大的作用将会体现在方便数据共享(例如RSS、微格式等)和利于代码维护。个人观点,接受有风险,参考须谨慎),分散的小表格克服了浏览器对于大的table解析缓慢的弊端,这些仅供实现多列布局的table也不会影响代码重用而造成代码冗余。

对于一些网页元素,根据其特点扬长避短灵活地运用,才能最大程度地裨益我们的项目。

设计开发人员的专业水准

3. 设计风格统一,保持一致性

设计师主导着网页的视觉风格,他们充分发挥聪明才智使用户界面好用又好看。但任何创造性的工作,也都需要遵循一定的范式。书法家泼墨挥毫笔走龙蛇,看似漫不经心,实则章法井然法度森然,钤印题款都有讲究;音乐家作曲,灵感喷涌如滔滔江水绵绵不绝,音符的组织却必须符合韵律节拍;诗人情感迸发,花间一壶酒,笔下三千言,但好的诗作往往也需要讲求平仄格律。设计师在设计模板样式的时候,也要有一定规范。对于字体、字号,常用颜色,以及模块的边框、间距等,要有整体规划,保持一致性,同一元素在不同页面的风格保持统一。只有这样,负责代码编写的重构人员才能对元素样式进行抽象化,提炼出可以重用的部分编写高效代码。这些规范一定是设计师与重构开发人员在长期的交流探讨中逐步完善的,有一定跨专业的知识对于两者的合作将大有益处——请永远记住,你不是一个人在战斗。

4. 合理拆分样式,巧妙组合运用

网页模板的设计风格确定了,剩下就要靠页面工程师来把设计图稿实现成精良的网页了。考量网页重构品质的各项指标之中,包括浏览器兼容性、代码的易扩展和可重用性。要做好这些,必须对抽象出来的页面元素样式进行合理拆分,区分哪些样式可以作为全局公用,哪些需局部定义,并运用样式的继承覆盖原则进行优化。

(1). 样式拆分组合的理论依据
  1. class=“cRed textLeft ”class属性可以赋值为多个类选择器名称,中间用空格分隔,这多个类定义的样式可以同时作用于标签元素。依据这一特性,可以在CSS里定义时对样式进行拆分打散,在(X)HTML里调用样式类时再将其组合使用。例如,有些常用的字号和颜色可以单独进行全局定义,在具体模块的类“newsList”中定义其他除字体和颜色之外的样式属性,用class调用样式的时候再组合多个选择器进行赋值 class=“newsList f14px cRed”。这样,颜色和字号属性在全局范围内就可以多次使用,提高了样式的复用率,松散耦合的样式也更利于扩展。而且,同一属性进行最少次数的定义,一定程度也优化了CSS性能。
  2. 样式的继承覆盖原则,选择器优先级算法在对样式进行全局公用或局部特殊定义时,考虑最多的是样式的继承覆盖原则。对于最普遍的样式进行全局定义,在需要个性化定义的地方再对全局样式进行覆盖,可以很大地提高CSS效率。这正是辩证唯物主义关于矛盾普遍性和特殊性关系的典型实践。例如,为改善CSS的浏览器兼容性而定义的reset文件作为全局样式,将元素在各个浏览器中表现不同的默认样式进行了初始化,在页面的具体模块中需要个性定制元素样式的地方再对初始化的样式进行覆盖。要有效地利用继承和覆盖原则,关于选择器优先级的算法必须熟练掌握。id选择器、类选择器、标签选择器以及行内样式的优先级权重是不一样的,特别是这些选择器进行组合运用的时候。

本文从公用样式模板的设计制作为例,详解了一个项目从实际需求到技术要求的分析过程,以需求为主导,不放弃专业追求的理念贯彻其中,未涉及具体的技术实现细节,旨在提供一种思考问题的思路,希望能给大家提供借鉴。

附录:

演示幻灯片下载

本文来源:http://www.ued163.com/?p=597

CSS初始化样式

自己编写的css初始化样式,希望大家能用上,如有不合理的地方望大家给点意见。
/*uedspace*/
* { margin:0px; padding:0px;}
html{color:#000;background:#FFF;}
body{ text-align:left; font-style:normal; font-size:12px; line-height:20px; font-family:”宋体”,Arial Narrow,arial,serif;}
ul,ol,li{list-style:none;}
table{ border-collapse:collapse; border-spacing:0;}
img,fieldset {border:0;}
h1,h2,h3,h4,h5,h6{font-size:14px;}
input,label,select,option,textarea,button,fieldset,legend,table,td {font-size:12px;}
sup {vertical-align:text-top;}
sub {vertical-align:text-bottom;}
address,caption,cite,code,dfn,em,strong,th,var {font-style:normal;font-weight:normal;}
a { color:#333; text-decoration:none; font-style: normal; }
a:hover{ color:#F00; text-decoration:underline; cursor: pointer;}

CSS类及id命名规则

web标准化设计:常用的CSS命名规则
   
常用的CSS命名规则  头:header

  内容:content/container

  尾:footer

  导航:nav

  侧栏:sidebar

  栏目:column

  页面外围控制整体布局宽度:wrapper

  左右中:left right center

  登录条:loginbar

  标志:logo

  广告:banner

  页面主体:main

  热点:hot

  新闻:news

  下载:download

  子导航:subnav

  菜单:menu

  子菜单:submenu

  搜索:search

  友情链接:friendlink

  页脚:footer

  版权:copyright

  滚动:scroll

  内容:content

  标签页:tab

  文章列表:list

  提示信息:msg

  小技巧:tips

  栏目标题:title

  加入:joinus

  指南:guild

  服务:service

  注册:regsiter

  状态:status

  投票:vote

  合作伙伴:partner

  (二)注释的写法:

  

  内容区

  

  (三)id的命名:

  (1)页面结构

  容器: container

  页头:header

  内容:content/container

  页面主体:main

  页尾:footer

  导航:nav

  侧栏:sidebar

  栏目:column

  页面外围控制整体布局宽度:wrapper

  左右中:left right center

  (2)导航

  导航:nav

  主导航:mainbav

  子导航:subnav

  顶导航:topnav

  边导航:sidebar

  左导航:leftsidebar

  右导航:rightsidebar

  菜单:menu

  子菜单:submenu

  标题: title

  摘要: summary

  (3)功能

  标志:logo

  广告:banner

  登陆:login

  登录条:loginbar

  注册:regsiter

  搜索:search

  功能区:shop

  标题:title

  加入:joinus

  状态:status

  按钮:btn

  滚动:scroll

  标签页:tab

  文章列表:list

  提示信息:msg

  当前的: current

  小技巧:tips

  图标: icon

  注释:note

  指南:guild

  服务:service

  热点:hot

  新闻:news

  下载:download

  投票:vote

  合作伙伴:partner

  友情链接:link

  版权:copyright

  (四)class的命名:

  (1)颜色:使用颜色的名称或者16进制代码,如

  .red { color: red; }

  .f60 { color: #f60; }

  .ff8600 { color: #ff8600; }

  (2)字体大小,直接使用”font+字体大小”作为名称,如

  .font12px { font-size: 12px; }

  .font9pt {font-size: 9pt; }

  (3)对齐样式,使用对齐目标的英文名称,如

  .left { float:left; }

  .bottom { float:bottom; }

  (4)标题栏样式,使用”类别+功能”的方式命名,如

  .barnews { }

  .barproduct { }

  注意事项::

  1.一律小写;

  2.尽量用英文;

  3.不加中杠和下划线;

  4.尽量不缩写,除非一看就明白的单词.

  主要的 master.css

  模块 module.css

  基本共用 base.css

  布局,版面 layout.css

  主题 themes.css

  专栏 columns.css

  文字 font.css

  表单 forms.css

  补丁 mend.css

  打印 print.css

HTML标签的权重

网上经常流传了很久的一份资料《SEO中HTML标签权重》,这份资料我想应该可以借鉴的,因为都是经过一些seo优化人员,经过不断的理解seo,才能等到这些资料,现在就来说说这些资料吧。
  HTML标签权重分值排列
  内部链接文字:10分
  标题title:10分
  域名:7分
  H1,H2字号标题:5分
  每段首句:5分
  路径或文件名:4分
  相似度(关键词堆积):4分
  每句开头:1.5分
  加粗或斜体:1分
  文本用法(内容):1分
  title属性:1分 (注意不是title》, 是title属性, 比如a href=… title=”)
  alt标记:0.5分
  Meta描述(Description属性):0.5分
  Meta关键词(Keywords属性):0.05分
  SEO优化
  1、 静态页面
  将信息页面和频道、网站首页改为静态页面,有利于搜索引擎更快更好的收录。
  2、 页面标题(Page Title)的关键词优化
  必须列出信息的标题、网站的名称以及相关关键字。
  3、 Meta标签的优化(过去搜索引擎优化的重要手法,现在已经不是关键因素,但仍不可忽略)
  主要包括:Meta description、Meta keywords的设置。关键字密度要适度,通常为2%-8%,也就是说你的关键字必须在页面中出现若干次,或者在搜索引擎允许的范围内,要避免堆砌关键字。
  4、针对Google制作Sitemaps
  Google的sitemaps是对原来robots.txt的扩展,它使用 XML格式来记录整个网站的信息并供Google读取,使搜索引擎能更快更全面的收录网站的内容。  可以使用Google提供的Sitemap生成器制作(需要技术人员制作):  https://www.google.com/webmasters/tools/dashboard?hl=zh-CN也可以由技术部人员制作更全面的Sitemaps。
  5、 图片的关键词优化
  图片的替代关键词也不要忽略,其另外一方面的作用是,当图片不能显示的时候,可以给访问者一个替代解释语句。
  6、 避免表格的嵌套
  目前本站的表格嵌套太多,搜索引擎通常只读取3个<table》的嵌套,如果太多,会造成部分有用信息没有被检测到。  来源:一起舞论坛
  7、 采用web标准进行网站重构
  尽量使网站的代码符合W3C的HTML 4.0或XHTML 1.0规范。通过XML+CSS技术进行网站重构,减少不表格及冗余代码,提高网站页面的扩展性,兼容性,可以使更多浏览器支持。
  8、 网站结构的扁平化规划
  目录和内容结构最好不要超过3层,如果有超过三层的,最好通过子域名来调整和简化结构层数。另外目录命名的规范做法是使用英文而不是拼音字母
  9、 页面容量的合理化
  合理的页面容量会提升网页的显示速度,增加对搜索引擎蜘蛛程序的友好度。同时建议js脚本和css脚本尽量用链接文件
  10、外部文件策略
  把javascript文件和css文件分别放在js和css外部文件中。这样做的好处是把重要的页面内容放到页面顶部,同时能缩小文件大小。有利于搜索引擎快速准确地抓取页面  重要内容。其他的字体(FONT)和格式化标签也尽量少用,建议采用CSS定义。
  11、外部链接
  尽可能多地让其他跟你主题相关的网站链接本站,同时尽量同PR值更高的网站进行相互链接。如果网站提供与主题相关的导出链接,被搜索引擎认为有丰富的与主题相关的内容,也有利于排名,例如各类招商网站、投融资网站的概念。另外避免链接不顾质量的大面积撒网,对搜索引擎而言宁少要精。
  12、网站地图
  网站自身的网站地图是搜索引擎更全面索引收录你的网站的重要因素。建议制作基于文本的网站地图,内含网站所有栏目、子栏目。网站地图的三大因素:文本、链接、关键词,都极其有利于搜索引擎抓取主要页面内容。特别是动态生成目录网站尤其需要 创建网站地图。
  13、图像热点
  除AltaVista、Google明确支持图像热点链接外,其他引擎暂不支持。当“蜘蛛” 程序遇到这种结构时,就会无法辨别。因此尽量不要设置图像热点(Image Map)链接。
  14、FLASH应用
  FLASH由于不含文字信息,应尽量用于功能展示和广告,少用于网站栏目和页面。
  15、JS脚本
  在不支持JS脚步的浏览器里 NOSCRIPT》 标签会起到重要提示作用,对搜索引擎的Spider搜索也会有帮助。
  16、Frame框架
  Frame标签会被搜索忽略,尽量少用,如果一定要用,则应正确使用Noframe标签, 在Noframe》/Noframe》区域中包含指向frame页的链接或带有关键词的描述文本,同 时在框架以外的区域也出现关键词文本。
  17、资讯的内部链接
  有助提高网站排名和PR值,例如相关资讯、推荐资讯等
  现在你们都应该知道了这份资料的详细说明了,按照以上所说的去做吧,你的网站优化一定比以前更好。

js 拉幕广告代码

javascript实现的拉幕式广告,当页面打开时广告会缓缓打开,在制定时间之后再缓缓的收起到隐藏,代码很简洁也很实用已经封装好,制定id和时间后即可使用。

js代码部分:

<script type=”text/javascript”>
var intervalId = null;
function slideAd(id,nStayTime,sState,nMaxHth,nMinHth){
  this.stayTime=nStayTime*1000 || 3000;
  this.maxHeigth=nMaxHth || 260;
  this.minHeigth=nMinHth || 1;
  this.state=sState || “down” ;
  var obj = document.getElementById(id);
  if(intervalId != null)window.clearInterval(intervalId);
  function openBox(){
   var h = obj.offsetHeight;
   obj.style.height = ((this.state == “down”) ? (h + 2) : (h – 2))+”px”;
    if(obj.offsetHeight>this.maxHeigth){
    window.clearInterval(intervalId);
    intervalId=window.setInterval(closeBox,this.stayTime);
    }
    if (obj.offsetHeight<this.minHeigth){
    window.clearInterval(intervalId);
    obj.style.display=”none”;
    }
  }
  function closeBox(){
   slideAd(id,this.stayTime,”up”,nMaxHth,nMinHth);
  }
  intervalId = window.setInterval(openBox,10);
}
</script>

html部分:

<div id=”MyMoveAd” style=”height:12px;overflow:hidden;width:960px;margin:0px auto;”>
<a href=”http://events.cnw.com.cn/nww09/” target=”_blank”><img src=”http://www.cnw.cn/zhuanti/mail/20090819/nww_move.gif”/></a>
</div>
<script type=”text/javascript”> 
 slideAd(‘MyMoveAd’,6); //此处绑定id和时间
</script>

本文链接地址:http://www.uedspace.com/blog/61.html

你是一个职业的页面重构工作者吗?

做为一个专职的页面重构者,我们从事的工作简单的说就是“将设计稿转换成WEB页面”,这一过程可以很简单到直接把PSD从PS里导出成网页;也可 复杂到需要考虑页面中每个标签的使用,考虑“页面性能”。以“前端工程师”为目标的同学可能会不愿承认将页面重构这块分出来,但随着工种的细分,加上页面 重构本身的专业性,独立为一个职业也不是不可能,至少我现在从事的就是一个专职的职位。如果你觉得一个前端工程师必须去画设计稿,可以不理会下面的内容。

单纯的页面重构,所涉及到的工作内容一般是“分析设计稿=>切图=>写HTML和CSS”,虽然看起来很少,但要做好这份工作,绝非所想的那 么容易。原因很简单:工作内容单一,在时间和工作量上必会很苛刻,往往跟设计师的工作时间是3:1,即设计师给三天的时间,制作只给一天的时间完成;在这 种工作强度下,很多人都是靠着对这份工作的喜爱在维持着,一旦工作热情消失,很容易就会变得枯燥,保持热情也成了重构工作者(也许是所有参加工作的人)应 该具备的能力。

跟“前端工程师”所要求的有所不同,“页面重构”虽然也是“前端工程师”的一个范畴,在职业化中,对专职的页面重构者,要求当然也更高。不单是做出页面,而是做出好页面。又引出另一个话题,“何为好页面?”,一般包括下面几点:

结构完整,可通过标准验证
标签语义化,结构合理
充分考虑到页面在站点中的“作用和重要性”,并对其进行有针对性的优化
很多同学多少都遇到过方向不明,不知道自己应该提高些什么,我们可以从“分析设计稿=>切图=>写HTML和CSS”这个工作内容,针对每一点提出一些要求,以方便我们分析自己的能力水平,为继续提高确定个方向:

一、设计稿的分析

设计稿的分析是指对设计稿如何制作成页面的分析,即哪一块的内容可以做为公共的部分、哪一块的内容结构可以如何实现等。对设计稿的分析能力可以划分成下面的几个阶段:

能分清设计稿中的公共与私有的部分
在1的基础上对各部分的实现方式有一个初步的方案(包括如何切图、写结构、写样式)
在1的基础上,准确的给出各部分的实现方案(包括如何切图、写结构、写样式)
在3的基础上,能同时考虑方案的扩展性、复用性及页面性能(包括如何切图、写结构、写样式)
在4的基础上,考虑整站的结构分布(包括文件分布、目录结构)
上面这些都是在还没开始动手制作之前所要做的。

二、切图

切图是指将设计稿切成便于制作成页面的图片。都有个误区,觉得切图就是把图片切出来,其实并不完全是这样,还包括把切出来的图片合并到一起,怎么切、从哪切才能将性能最大化,说“切图是一门艺术”完全不为过。切图也可以划分成几个阶段:

切成所需要的图片(如何将需要的部分切出来)
在1的基础上,对切出来的图片进行一些优化(包括压缩文件大小、选择图片类型)
在2的基础上,规划切出来的图片(包括文件分布)
在3的基础上,考虑整体的性能(包括合并图片、压缩文件大小)
HTML和CSS的编写

HTML和CSS的编写是指将上面完成的内容,通过HTML和CSS的编写,将设计稿转换成WEB页面最重要的一块,也是我们所要重点掌握的内容,把它们放在一起,是因为它们相互的关联性太强,HTML的写法会影响到CSS的写法,它又可以划分成下面几个阶段:

还原设计稿视觉效果,并通过标准验证(HTML)
在1的基础上,实现多浏览器的兼容(HTML)
在2的基础上,标签语义化(HTML)
在3的基础上,选择较优的实现方式(包括模块化结构,方便程序脚本使用,HTML和CSS)
在4的基础上,考虑到扩展性、复用性和可维护性(HTML和CSS)
在5的基础上,考虑到整站的样式分布(包括如何实现分布)
在6的基础上,样式写法的优化(包括技巧的应用)
是对所遇到问题的解决能力,这一点在不同的阶段都可能会遇到,所以没有写到上面。

如果你已经达到或超过3、4、5,恭喜你,你已经是一个职业的“页面重构工作者”了。为了我们自身的发展,关注新技术、技术创新、提高用户体验、审美观、程序脚本的实现方式等,也是十分必要的。大家一起进步吧。

原文:http://www.cssforest.org/blog/index.php?id=121