CSS兼容浏览器的一些常用hack

首先,本民工要声明的是,本人并不喜欢hack,只是在某些不得已的情况下需要用到而已。hack并不是标准,如果过于依懒hack来调整页面的话,只会让我们离标准越来越远。在很多大公司会把DIV+CSS的工作称之为“页面重构”或者“网页架构”,是有原因的,一个好的网页架构本身就可以避免大多数需要用到hack的情况。

当然,不管标不标准,至少现在不是IE一统天下的时代,为了兼容浏览器,这些常用的hack手法还是必备的。

 屏蔽IE浏览器
*:lang(zh) select {font:12px !important;} /*FF,OP可见*/
class:empty {font:12px !important;} /*safari可见*/
这里class是选择符,根据情况更换。第二句是MAC上safari浏览器独有的。

仅IE7识别
*+html {…}
当面临需要只针对IE7做样式的时候就可以采用这个HACK。

IE6及IE6以下识别
* html {…}
这个地方要特别注意很多地方都写了是IE6的HACK其实IE5.x同样可以识别这个hack。其它浏览器不识别。

仅IE6不识别
class{ display /*IE6不识别*/:none;}
这里主要是通过CSS注释分开一个属性与值,流释在冒号前。

仅IE6与IE5不识别
class/**/ { display /*IE6,IE5不识别*/:none;}
这里与上面一句不同的是在选择符与花括号之间多了一个CSS注释。

仅IE5不识别
select/*IE5不识别*/ { display:none;}
这一句是在上一句中去掉了属性区的注释。只有IE5不识别。现在已经很少去考虑IE5了。

盒模型解决方法
class{width:IE5.x宽度; voice-family :”\”}\””; voice-family:inherit; width:正确宽度;}
盒模型的清除方法不是通过!important来处理的。这点要明确。这也是IE5中才出现的,也是N久都不用了。

只有Opera识别
@media all and (min-width: 0px){ class{……} }
针对Opera浏览器做单独的设定。

清除浮动
class:after {content:”.”; display:block; height:0; clear:both; visibility:hidden;}
关于清除浮动,在这里要详细说下,因为个是经常会碰到的。很多网站上都把上面那个方法称之为万能清除浮动之方法。其实用起来也并不那么好用。下面这句比较简单,效果也是一样:
class{overflow:hidden; height:1%;}
虽然这两种方法在页面输出的时候是没有问题的,但是用dreamweaver打开的时候有可能就是一团糟。本民工可是一个追求完美之人,所以推荐用下面这种方法:
.clearfloat { /* 此类应当放在 div 或 break 元素上,而且该元素应当是完全包含浮动的容器关闭之前的最后一个元素 */ clear:both;height:0;font-size: 1px;line-height: 0px;}
这个是dreamweaver模版自带的清除浮动方法,很好用的。

关于CSS书写习惯问题杂谈

记得在程序员之间有这么一句话:让我做什么都行,就是别让我去看别人的程序。其实在写CSS的时候也会有这样的情况,当然,CSS相对来说简单得多,但是不同的人也都有不同的书写习惯及爱好,有时碰到与自己风格相差很远的样式表,一时半会还真很难看懂。

说到书写习惯,首先就是版式。有人喜欢横着写,同一个样式中的所有属性都写成一行;也有人喜欢竖着写,每写一个属性就换一行。关于这两种写法,也没有什么明确的说法谁好谁坏了,完全看个人喜好了。本民工偏向于前者,因为横着写的话整个样式会显得紧凑,而且找样式名也比较方便,并且文件的体积也会小。个人觉得如果随便打开一个样式表就上千行的话那是很恐怖的事(尽管可能内容并不多,只是因为竖着写而已)。

另一个受习惯影响最大的就是命名了。一个好的命名,应该是让人只要看到样式名就能知道这个样式应该是作用在什么地方的。特别是团队合作项目,制订一套命名规范是很有必要的。命名就都尽量用英文好了,拼音给人的感觉实在是太怪了。常用的命名方法中,驼峰命名法本人觉得不好用,不仅可读性不高而且因为大小写混排也容易出错,大写的I跟小写的l看起来都差不多的。中杠”-”命名跟下杠”_”命名本人觉得都差不多,而用下杠命名的话在双击选择样式名的时候比较方便,所以本人的习惯是用小写加下杠的命名法,原来公司团队也是用这个的,而且很多大站也都是这样用的。

接下来就是在书写样式表的时候尽量养成分块书写的习惯。也就是说定义同一个区块的样式都写到一起,好比下面这样:#sidebar {float:left;}
  #sidebar p { … }
#footer {clear:both;}
  #footer p { … }

这样在出问题的时候查找起来很方便。曾经有一位同事写样式的思维相当“跳跃”,每次改的时候都好想哭……

最后再说说样式属性的排列顺序了。说真的,这个平时还真没太去注意过,我在网上查了一下Mozilla推荐的书写规范,但却不知为何这样推荐,我觉得大概是跟浏览器解析的过程有关吧。

//显示属性
display
list-style
position
float
clear
//自身属性
width
height
margin
padding
border
background
//文本属性
color
font
text-decoration
text-align
vertical-align
white-space
other text
content

AS3的深度管理及排序

说到深度管理,不由得想起了那万恶的AS2年代-_-! 至少本人觉得在AS2中的深度管理很是混乱,不仅有断层还会有冲突……总之麻烦多多。而在AS3中,一切都是这么的清晰与明朗,深度值断层不见了、有冲突的时候会自动调整,而我们只是记住以下几个语句的用法而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
numChildren : int
//返回此对象的子项数目。
getChildAt(index:int):DisplayObject
//返回位于指定索引处的子显示对象实例。
getChildIndex(child:DisplayObject):int
//返回 DisplayObject 的 child 实例的索引位置。
setChildIndex(child:DisplayObject, index:int):void
//更改现有子项在显示对象容器中的位置。
swapChildren(child1:DisplayObject, child2:DisplayObject):void
//交换两个指定子对象的 Z 轴顺序(从前到后顺序)。
swapChildrenAt(index1:int, index2:int):void
//在子级列表中两个指定的索引位置,交换子对象的 Z 轴顺序(前后顺序)。
removeChildAt(index:int):DisplayObject
//从 DisplayObjectContainer 的子列表中指定的 index 位置删除子 DisplayObject。

那么接下来我们来看一个简单的小例子吧,这里我就不罗列代码了,只把主要的写一下,关键是思路跟思想嘛,源码附在后面。有四个圆,可以点击与拖动,实现每点击其中一个圆,就把它调到最上面来。

这个其实很简单,要调整到最上层的话,只要用setChildIndex把鼠标点击对象的深度值设为(容器.numChildren-1)就可以啦。setChildIndex常用有以下几种:

1
2
3
4
5
6
7
8
置顶:
容器.setChildIndex(对象A,容器.numChildren-1);
置底:
容器.setChildIndex(对象A,0);
插入对象B的前面:
容器.setChildIndex(对象A,容器.getChildIndex(对象B));
插入对象B的后面:
容器.setChildIndex(对象A,容器.getChildIndex(对象B)-1);

是不是太简单点了呢?那我们再加深一点点吧,我们把上例中的圆换成立方块,再点击拖动下看看……

在这里我们想要达到一种空间立体的效果的话,就要对这些方块进行深度的排序,也就是说要让我们视觉上看起来靠前的物体挡住后面的物体。解决方法应该是多种多样的,在这里本民工只说说自己的解决方案了。简单说来,物体的前后顺序可以通过Y轴坐标的大小来区分,Y轴坐标值大的深度值就越大,在拖动后用一个数据记录下每个对象以及该对象的Y值,再把该数组以Y值的大小排序,最后setChildIndex一遍就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
//以下代码是放在MOUSE_UP的事件里。
var obj_box:Array=new Array;//新建立数组。
for (var i=0; i<block_box.numChildren; i++) {
var aa:Object={objs:block_box.getChildAt(i),depth_y:block_box.getChildAt(i).y};
obj_box.push(aa);
//这里可以说是一个简单的JSON应用,把对象以及Y值添加到数组里。
}
*****************************************************************************
for (i=0; i<block_box.numChildren; i++) {
block_box.setChildIndex(obj_box.sortOn("depth_y",Array.NUMERIC)[i].objs,i);
//重新排序后再指定索引位置。其中sortOn是按指定的属性来排序。
}

最后再加个吸附功能吧,看看效果咯。

源码是临时写的,比较简单,都写在时间轴上咯。

点击下载源文件:depth.rar

一个既成功又不成功的作品——特技飞行

这个游戏说起来也花了我不少心思了,为什么说它既成功又不成功呢。说它成功,是因为对当时的我来说,这游戏应用到了很多方面的内容,除了基本的游戏架构外,还有不规则碰撞检测、SharedObject的应用、通过第三方语言跟数据库通信……不管怎么说,对自己是一个很好的提升。而说它不成功,那是因为——因为它实在是太难玩了,难得没有人能玩得通关,也只有本民工本着制作者的经验才能偶尔通关吧,所以命名为——超高难度的特技飞行!

现在也不想专门再去修改难度了,其实个人感觉还是蛮有挑战蛮有意思的,还是期待着某天能有哪位神人能突破了。

发些截图吧,游戏大小是800*600的,直接发上来页面会乱,大家点链接来看吧。另外本民工的美术设计能力有限,所以有些UI部分非原创,特此说明。
超高难度的特技飞行游戏 超高难度的特技飞行游戏 超高难度的特技飞行游戏 超高难度的特技飞行游戏 超高难度的特技飞行游戏 超高难度的特技飞行游戏

学AS3的第一个作品,现在看来相当幼稚

这个是我去年刚学AS3的时候,大概是刚学一个多月的时候吧,做的一个小游戏,当时可有成就感了。其实现在回头来看,乱得都不想去改了。但我现在还是把这个幼稚的作品放了上来,是想告诉那些跟我当年一样想学AS3的朋友们,其实并不难,只要肯努力。

辞旧迎新赋——殇吾手机

话说公元二零零八,实乃多事之秋也,吾辈乃一介布衣,诸多之事不言也罢。然适值岁末,辞旧迎新之际,追随吾辈多年之手机竟于某次出行之中落入偷儿之手,吾竟不察。吾辈向来甚为惜物,吾机虽年事已高,然伴吾多年用之已成习惯,故数次欲换之却终不忍弃。而今却不能保其周全,心甚痛哉。此虽金融危机之际,然吾机年迈,贩之亦不值数文,何苦来哉。

自丢机以来,渐觉生活甚为不便,遂花千余大洋购得新机一台。而吾辈实乃念旧之人,虽此新机才貌皆优于其前辈,而吾不时还会思之旧者。遂于今日作此文以念吾旧机,顺祝来年风调雨顺,国泰民安。