PNG点点

我冒着被人BS的危险,写下这篇文章。突然想到《风声》顾晓梦最后的话。YY ……我在唾骂中留下这份记录,我不敢坚信,只是奢望BS我的人会明白我的心情。我如此无耻的写下被人写过N遍的PNG,只因大牛们都追求原创,我等菜鸟只能奋不顾身,挽救于万一,大牛们不会理解,菜鸟不只一些,而是很多很多,阿门!

一.  索引透明,布尔透明,alpha透明

索引透明:fireworks中可以选择某一颜色作为透明输出;

布尔透明:只能为不透明或全透明;

alpha透明:有不透明,全透明和半透明。

二.  PNG8, PNG24, PNG32

现在都提倡用PNG8,好处就不用多说了,这里这里有更多的说明。但是fireworks和photoshop导出的PNG图片却有一些不同。

1.  fireworks

(1. 可以导出布尔透明,alpha透明的PNG8,半透明的PNG8在IE6下全透明,用滤镜可以解决。对于边框发光的效果,倒是一种很好的退化方案。

IE6,IE6-PNG8非IE6notIE6-PNG8

(2 可以导出不透明的PNG24,即和JPG的效果相同;

(3. 可以导出alpha透明PNG32。

2. photoshop

(1. 只能导出布尔透明的PNG8;

(2. 可以导出alpha透明的PNG24, 无法导出PNG32。

测试。应该说PNG24和PNG32是一样,The difference between PNG24 and PNG32(翻译)中指出PNG32中每个像素不仅存储了24位真彩信息还存储了8位alpha通道。所以fw导出PNG32不用选择透明,而ps导出PNG24时是要勾选透明度的,这时候的PNG24应该就转化成了PNG32了吧。

三.  IE6 中透明PNG解决方案

1. AlphaImageLoader滤镜

PNG在IE6最常用的解决方案是使用滤镜。

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=”images/img.png”, sizingMethod=”scale”);

MSDN中详细介绍了该滤镜。重点提一下sizingMethod属性吧,sizingMethod=image/scale/crop:image:默认值,增大或减小对象的尺寸边界以适应图片的尺寸;scale:缩放图片以适应对象的尺寸边界;crop:剪切图片以适应对象尺寸。

但使用滤镜存在很多问题:

(1. 内存问题,有建议说使用滤镜最好不用超过5到6个。

这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支……

(2. 链接失效,表单无法获焦。

解决方法:使链接和表单元素拥有haslayout,通常是加上position:relavtive,经过测试position:absolute也可以。但是当父级定义position:absolute时,这种方法会失效。不过这种方法不太稳定;另一种方法,是将背景层和内容层分开,不作为嵌套关系,而作为同级关系。

(3. 使用滤镜的图片只能作为背景图,且无法平铺。

因此尽量少使用滤镜。使用滤镜的测试文档,这里

2. JS

一些脚本其实是滤镜的增强版,如使PNG可以作为嵌入图片,或者作为背景图片可以平铺。有时间的话这些脚本的性能进行测试吧。

    1. SuperSleight
    2. unitpngfix
    3. DD_belatedPNG
    4. 一些汇总

      主要参考

      悟z-index

      之前一直对z-index感到有点迷惑,看了众多博文后,觉得最经典的还是w3c的规范。但是偶英文不佳,其中Appendix E. Elaborate description of Sstacking Contexts这篇文章没有看懂,网上流传的CSS 2.1的中文翻译也没有翻译此篇幅。求人不如求己啊……呜呜,希望有朝之日可以看懂。除了W3C的z-index,元素层叠级别(stack level)及z-index剖析也很不错。

      一,误区

      1. z-index属性只能工作于那些被定义了position属性的元素中,这里不包括position:static。

      2. z-index的负值:z-index值为负的定位元素在“父级stacking context的背景、边界”之前,在父级stacking context的内容”之后。除了FF2.0,它的“z-index值为负值的定位元素”在父级stacking context的背景”下面。PS:有一些条件能够使元素产生stacking context,这些条件就是困惑的所在。

      二,理解——stacking context & stack level & z-index

      stacking context

      每个元素都在一个stacking context下,最初的stacking context(即root stacking context)由根元素产生。一般页面的根元素是body,但是当设置了html的颜色时,html就成了根元素(奇怪吗?遇到一个现象,自己觉得这样理解通顺一些)。那么哪些条件可以产生stacking context呢?

      1. 1. 定位元素并且定义了z-index为非auto;
      2. 2. FF, Safari, Chrome下元素设置opacity属性(1除外)会产生stacking context;(除了Opera)
      3. 3. IE6,7下的定位元素,另一种说法是,对于有定位而没有设置z-index的元素,在IE中默认为z-index:0,而z-index:auto也会默认z-index:0。总而言之,IE6,7下的定位元素,无论设置了z-index,或无论z-index设置成什么值,都会产生新的stacking context。

      stack level

      有的人认为stack level同z-index相同,也有人认为它们是不同的概念。我认为理解成不同好一些。页面中的元素都有stack level,但未必都定义了z-index。

      下面是w3c关于stack level的规则的介绍

      Each stacking context consists of the following stacking levels (from back to front):

      1. the background and borders of the element forming the stacking context.
      2. the stacking contexts of descendants with negative stack levels.
      3. a stacking level containing in-flow non-inline-level non-positioned descendants.
      4. a stacking level for non-positioned floats and their contents.
      5. a stacking level for in-flow inline-level non-positioned descendants.
      6. a stacking level for positioned descendants with ‘z-index: auto’, and any descendant stacking contexts with ‘z-index: 0′.
      7. the stacking contexts of descendants with positive stack levels.

      其中IE8, FF3.0,Safari, Opera, Chrome都是按这个原则正确解析的,IE67下“float元素”和“block元素”属同一stack level,而“inline元素”较其stack level低。

      z-index

      页面中元素在Z轴方向上的排列,先由stacking context决定,相同的stacking context下的则有stacking level决定,相同的stacking level则有z-index决定。

      三,IE的特殊性

      1. IE-6 select标签不识别z-index, 即某个元素设置了z-index,select仍会位于它之上。

      2. 上文中提到在IE6,7下,设置position:relative的元素会产生stacking context。而一些效果,例如鼠标经过,出现提示框,在IE7-下就会有bug,Demo(注:它在IE6下没有任何效果,下文解释)。目前有两种解决方法:方法一,position:relative/absolute无法冲破的等级;方法二:Fixing IE z-index,这种方法用到了JQ,好像有点大材小用,但却提供了另一种思维。

      跑题——IE6下:hover的触发

      在写测试页面时,发现在IE6下什么效果都没有,顿时蒙了,本来以为z-index应该想明白了,难道还有遗漏?原来这是IE6的另一个Bug,关于:hover的触发。IE中伪类:hover的使用及BUG一文详细地分析了这个Bug。

      对于a:hover{}只要设置width,positon,background,font-size,font-weight,font- family,border,float,display,font-style,margin,padding,text- align,overflow,text-transform,text-indent,vertical-align这些属性(除text-decoration,color,z-index,其中display不建议使用)就可触发:hover。

      但是Demo1, Demo2IE6下表现的还是很奇怪,原来a:hover span{}下也要设置以上属性。这次跑题是个意外的收获。最终正确的Demo,真是“纸上得来终觉浅,绝知此事要躬行”

      主要参考

      1. 元素层叠级别(stack level)及z-index剖析
      2. Specifying the stack level: the ‘z-index’ property
      3. Appendix E. Elaborate description of Stacking Contexts
      4. position:relative/absolute无法冲破的等级
      5. IE中伪类:hover的使用及BUG

      多级联动select

      必须承认我没有写出这个效果,思维很混乱。主要原因是我逻辑没有理清,这是重点,而后又在一些细节上纠结,使我一直觉得这个问题很复杂。对待一个问题,要先把它想得复杂——全面考虑问题,然后简单——理清思路,最后再复杂——注重细节。强调,逻辑分析很重要。

      上网查看了一些代码,整理了两种方法,绝对不是原创。主要差别是在数据结构上。

      方法一:array存储,Demo

      方法二:json存储,Demo

      一,背景知识–Select

      这个问题主要处理对象是select,即对增加、删除select的option选项等。

      1. 清空select

      sel.length=0; 或 sel.options.length=0;   //两种写法都一样

      2.添加option

      (1.新建

      var opt = document.createElement('option');
      或 var opt = new Option(str, str);

      (2.添加

      try{
          sel.add(opt, null);    //IE6,7不支持  
      }catch(ex){
          sel.add(opt);
      }
      或sel.appendchild(opt);
      或sel.options.add(opt);//都能识别,不知道是否标准

      3. 选中

      获取:sel.selectedIndex, 返回数值,默认为0;设置:sel.options[i].selected= true/false。

      二,关键点

      这个问题概括为获取数据,填充数据,即两重循环。选择一个选项,则用通过循环获得和该选项相关联的数据;遍历之后的select,填充相应的数据。这里数据结构是关键,不同的数据结构就决定了读取的效率。个人觉得方法一的效率比较高。

      方法一采用数组结构,更为准确的说法,是关联数组,最为巧妙的地方在于索引值的设计。通过遍历select,获得当前select的被选项目的索引号,并连成字符串,例如“1_1_1”,则通过array['1_1_1']就可以获取所需的数据。

      方法二采用的是json结构,这种结构值得推荐。但在获取数据时,要遍历整个数组里的json对象,通过对比选中的select的value值和json对象的’val’属性值,以获取下级的数据。数据量较大时,这个方法确实不太好。

      这两种方法,还有一些细节也不太相同,比较繁琐就不介绍了。不过被我重写后,有些代码也不够优雅,而且我希望这个控件可以提供较好的数据输入的接口,继续纠结中……

      [转]JS代码优化的层次

      转自:http://lifesinger.org/blog/2009/09/js-optimization/

      js-optimization

      PS:“设计API,输入和输出,关键数据结构”,最近写JS最头疼的就是这个地方,很关键.

      我的CSS Reset

      这是一篇很纠结的文章,酝酿好久啊,我的执行力。

      对于css reset,开始真的没有什么研究,从*{margin:0; padding:0;}到网上的eric css,都是完全的“拿来主义”。看了Reset CSS 研究(八卦篇)很受启发,于是开始了自我折磨的路程。

      1.HTML元素的认识

      css reset的目的&意义

      第一步是清除浏览器的默认样式,第二步是重设浏览器的默认样式。

      那么应该先了解HTML元素在各个浏览器下的表现吧。于是写了一个Html4,其中主要是使用html4的基本元素。之前转过[转]HTML4默认样式,这是w3c组织给出html4的样式建议,各个浏览器对这个样式的解释还是存在差异。通过Html4,就可以比较清楚的发现其中的差异。

      例如,IE6下abbr没有提示;FF, IE下a中的图片有边框,Op, Sa, Ch则没有;FF, IE, Ch下form元素的表现是基于用户的Window主题,而Op,Sa则依然按照自己的渲染法则。奇怪的是,Ch也是用Sa的浏览器引擎,居然同Sa表现不同(BTW,Ch只有JS引擎是新的。)。不解!

      2.各个css reset

      主要分析参考了eric-reset, yui-reset, kissy-reset

      (1. table的重置

      各个reset对于table的重置比较一致:

      table {
        border-collapse: collapse;
        border-spacing: 0;
      }

      经过测试发现,border-spacing对于IE6,IE7来说是没有效果的,而且通过border-collapse: collapse; 就可以达到效果,为什么要写后一句呢?在eric-reset中eric强调了tables still need ‘cellspacing=”0″‘ in the markup ,也不解为什么。

      (2.  q的重置

      eric-reset版本:

      blockquote:before, blockquote:after,
      q:before, q:after {content: ''; content: none;}

      但是在测试页面中blockquote在各个浏览器中都没有出现引号,没有必要进行重置,对于q为什么要设置两次content属性呢, content:none只对FF和IE8有效,对Op, Sa, Ch没有效果,而且content:”"已经可以完全应付了。所以采用了yui-reset和kissy-reset的版本:

      q:before, q:after{content:'';}

      对q进行重设是很有必要的,IE6, IE7没有引号,而且当q嵌套q时,各个浏览器格式千奇百怪。

      browser-diffrence_q

      我觉得FF, IE8表现的最合理。在引号中的引号用单引号表示。

      (3. 文本格式元素的重置

      strong我觉得还是默认加粗比较好,虽然它所强调的是语义,但也应该在视觉上给人同样的效果。而em去除斜体表现,则是因为斜体在中文字体中视觉效果并不明显。

      address,cite,dfn,optgroup,em,var{font-style:normal;}

      abbr, acronym(HTML 5不支持acronym)差异性比较大。

      browser-diffrence_abbr

      不过各个reset对它们的重置还比较统一,

      abbr, acronym{border:0; font-variant:normal;}

      除了kissy-reset版本,

      abbr[title], acronym[title] { border-bottom: 1px dotted; cursor: help;}

      kissy的版本在非IE6下的用户体验比较好。用哪种呢?纠结、痛苦……最终还是照顾IE6的心情,它也不容易啊。

      这里想展示一下select的表现:

      browser-diffrence_select

      为什么不修正optgroup的斜体呢?因为optgroup的样式在IE下无法重置,即不能改变font-style和font-weight。其中Op中optgroup的背景色是可以重置的,但不能使用background:none除去背景颜色。

      对于legend的重置,legend在IE下的字体颜色也很怪异,如果计算机使用的是经典主题,其颜色是黑色;如果XP主题,其颜色是蓝色(#0046D5)。所以统一重置成黑色。

      (4. 字体的重置

      一些表单元素,yui-reset的版本:

      input,button,textarea,select,optgroup,option {
       font-family: inherit;
       font-size: inherit;
       font-style: inherit;
       font-weight: inherit;
      }
      /*@purpose To enable resizing for IE */
      /*@branch For IE6-Win, IE7-Win */
      input,button,textarea,select {
       *font-size: 100%;
      }

      由于textarea,input和select, button默认无继承性,所以要通过属性指定继承性(inherit),但IE7以下不识别inherit属性值。yui的写法觉得还是比较繁琐,参考了kissy-reset版本

      body,
      button, input, select, textarea {font:12px/1.5 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;}

      “\5b8b\4f53″是“宋体”的unicode 表示,不用“宋体”的正式名“SimSun”, 是据说FF的某些版本和Op不支持SimSun的写法(PS:没有测试)。

      设置code, kbd, pre, samp, tt

      yui-reset:

      pre,code,kbd,samp,tt {
       font-family:monospace;
       *font-size:108%;
       line-height:100%;
      }

      在IE7下,这些标签里的字体好像是会小一点,不过觉得真的不是很明显(应该不是我心理作用吧),暂时将这点忽略,不想再reset中使用hack。

      browser-diffrence_code

      这是30号字体的效果图,右边的CSS Reset是在code标签中的。code, kbd, pre, samp, tt标签的默认样式是font-family:monospace,

      但FF, Op, Ch的好像没有效果啊……傻眼了。所以对这些标签进行了重置。

      code, kbd, pre, samp, tt{font-family:"Courier New", Courier, monospace;}

      (5. 其他,hr

      kissy-reset版本

      hr{border:none; height:1px; *color:#fff;}

      hr元素很少用,所以很少有reset对它进行重置,貌似淘宝的页面使用了。hr{border:none;}对IE也是没有作用的,其他的属性也不是太了解,所以还是不写这条规则了。

      我的css reset,使用了reset的Html4-reset的页面。

      /*
      Date:09.09.11
      Author:ZQP
      Email:zhouqiuping@gmail.com
      Website:applezqp.com
      */
      body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,
      pre,code,
      form,fieldset,legend,input,button,textarea,
      p,blockquote,
      th,td{margin:0; padding:0;}
      table{border-collapse:collapse; border-spacing:0;}
      ul,ol{list-style:none;}
      fieldset,img {border:0;}
      a{text-decoration:none;}
      a:hover{text-decoration:underline;}
      q:before, q:after{content:'';}
      abbr, acronym{border:0; font-variant:normal;}
      address,cite,dfn,optgroup,em,var{font-style:normal;}
      legend{color:#000;}
      /*typography*/
      body, button, input, select, textarea {font:12px/1.5 Tahoma, Helvetica, Arial, "\5b8b\4f53", sans-serif;}
      h1 {font-size:18px;}
      h2 {font-size:16px;}
      h3 {font-size:14px;}
      h4, h5, h6 { font-size:100%; }
      code, kbd, pre, samp, tt{font-family:"Courier New", Courier, monospace;}

      主要参考

      1. Reset CSS 研究(八卦篇)
      2. Reset CSS 研究(技术篇)
      3. 打造自己的reset.css
      www.911xq.com
      www.enshisjw.com