Featured Posts

纠结与释怀 这几天的纠结让我度日如年,伴随我的是焦虑和失眠。好久没有这样的感觉了。 我总是患得患失,这是一种心理问题,在做选择的时候,反复对比各方的优劣,放不下东,也舍不得西。 自己不知道怎么选择,然后反复问家人和朋友,即使问到答案,也不能让自己安心顺从。 幸运的是,在反复纠结之后,我逐渐想明白了一些道理。 选择,就要付出代价,必定有所得有所失,我应该勇敢承担起责任,坦然面对自己的选择带来的变化和影响。 纠结的时候,我感觉自己是个懦弱的人,害怕犯错,害怕不好的结果。 现在,我鼓起勇气,自己做出选择,不管对错,我接受,不后悔。 我要感谢猛哥,花费很多时间和精力,前后沟通,给我提供了非常难得的机会,在我最终没有选择这个机会的时候,仍然支持我的选择,并告诉我他这里的大门永远向我敞开。 此时,时间像突然停止了一样,飞快打字的手,也一下停住了,我反复看着这句话,感觉到眼眶周围热热的,滑滑的…… 我想我的勇气,多半来自于猛哥对我的关照。 我只求将来有机会能够报答猛哥的知遇之恩。 是时候为自己的选择努力工作了,大家一起加油!

Readmore

CentOS: cannot restore segment prot after reloc 最近在研究CentOS,用xampp装一套集成的LAMP环境,结果在启动Apache的时候报错: cannot restore segment prot after reloc: Permission denied 原因是 modules/mod_perl.so 不能加载。 查了一下可能是SELINUX的问题,有一个解决方法: 用 chcon...

Readmore

PHP 文件下载 IE 无法打开页面 IE 又有一个弱得不行的问题让我发现! 有个项目,要限制文件的下载权限,只有注册用户才可以下载,用户登录后,点击下载链接,弹出保存附件的提示。 我用...

Readmore

Subversion neon 诡异配置 一波三折 今天发现前几天装的 subversion 居然没法通过 http 协议访问版本库! Subversion 出现 svn: Unrecognized URL scheme for 'http://.....'  这样的错误提示。 检查 svn 客户端是否支持...

Readmore

  • Prev
  • Next

用CSS实现Tab导航

Posted on : 24-11-2008 | By : leakon | In : CSS, 原创

1

本文主要讨论的就是导航tab的底部灰线如何用CSS实现,而不是用背景图片实现。用CSS实现的好处是可以避免浏览器发起一次图片请求,另一个是可以方便地改变颜色、尺寸。

做法是用ul和li标签生成tab,在ul的外部用p标签包围,导航底部的那条细线,就是p标签的bottom-border。

过程中遇到的一个难题是,高亮的tab,是白色背景,该tab底部没有border,应该也是白色的。但用普通的方法没法做到,如上面第2个图,“首页”那个tab的出现了底部border。因为p标签是ul和li的外层容器,内部的所有元素默认都在p标签的范围内,无法跨越p的边界。

通常这种导航的底部实现都是用背景图片代替,这样的理由是:1、背景图片的位置可调,可以不用紧紧挨着边框,比如离bottom有4px的距离;2、背景图片显示在最低层,p容器内的任何元素都可以覆盖住背景图片。高亮tab的底部没有border的效果就是靠白色背景挡住了p的背景图片做到的。

基于这种思想,我考虑可以用什么方式让内部元素挡住外层元素呢?

ul元素的position属性设置为absolute,p标签的position设置为relative。这样ul就定义在p标签内浮动,默认top和left都是0,即p的左上角。同时,ul会覆盖住p。只要p的height刚好比ul的height小1px就可以,也就是让ul中li的bottom-border刚好和p的bottom-border在同一个垂直高度上。注意,p标签的overflow属性必须是visible(默认值),也就是说只要你不把overflow设置成其他值就没问题。

经过上面的步骤,可以总结出几个关键点,按重要顺序排列:

  1. ul和p的position属性,分别是absolute和relative(这里告诉你为什么这样设置
  2. p的高度应该比ul小1px(根据你的需要,小几个px都可以)
  3. overflow属性必须使用visible

通过这几个关键点,你就可以基本实现图1的效果,不过还要针对不同浏览器做小小的css hack。

hack的关键点就是p的height值,在我这里,Firefox2/3、Chrome、Opera适合27px,IE7、Safari适合26px,IE6适合25px。

现在我唯一的问题是不知道怎么写出专门适用于Safari的CSS定义,所以在Safari下是图3的效果,其实就差1px,回头找到方法再补充吧。

IE6 CSS Hack

Posted on : 11-09-2008 | By : leakon | In : CSS, Develop

2

最近在做一些UT的工作,写一些HTML和CSS,又遇到了一直很头疼的浏览器兼容问题。

主要就是让人讨厌的IE6,总是需要进行很多特殊的处理。

遇到表格类型的HTML区域,我一直觉得用table是最合适的,解决局部的单层表格,table是最方便的,HTML语言加入table这个标签的初衷就在这里。

不过因应用需要,我这回必须要用div实现table的布局,只能硬着头皮搞了。

对表格区域,我用ul标签,用li作为每行的容器。

在每个li标签中,用div作为列单元的容器。

这会遇到几个问题,同时也有一些优点吧:

  1. (缺点)列的宽度必须用样式来定义,比如每行相同的列单元,都必须使用相同的class,在css中给这个class定义绝对宽度,用width=240px这类的语句,代码冗余比较多
  2. (缺点)每个div必须添加float:left的css定义,因为div是块状元素,默认是按行竖着排列的,设为浮动元素后,才可以横着排列
  3. (缺点)float:left这个属性的排列方式,我总结的是按左上原则,可以理解为左上角是引力中心,把每个float元素都紧紧地吸附着,如果右侧有空间,就顺序排列在右侧,如果没空间了,就到下面一行尽量靠左的位置开始排列……,因此如果宽度不够,改行左边单元的高度又高于其他单元,那么最右侧的单元会卡在左边的单元右侧,呃,可能不好理解,回头我给个图,专门说一下这个规则
  4. (缺点)li的高度默认不是自适应,当div单元的高度很大时,会突破li容器,影响下一行li的显示,呃……不过这个是有办法解决的,这篇文章主要就是来说明这个解决办法
  5. (优点)div对浏览器来说就是一个简单的元素,浏览器每读完一个div,就可以立即显示,不必等待所有html代码都下载完才画出页面,这也是大家不喜欢table的主要原因
  6. (优点)每行都有自己单独的列元素,每列的宽度可以不一致,这点table很难做到,即便能做到,也是用非常绕弯的方法,而用li+div来解决,就很灵活
看似缺点比较多,不过缺点都可以解决。
下面列举几个方法,就不一一对应了,其实道理都是相通的:
  1. float元素排列被卡住的问题,可以给同行的每个div单元设定一个足够的高度,这样就不会形成“阶梯”状排列的单元,当右侧没有足够的宽度容纳新单元时,这个单元会自动到下一行开始排列(有点像windows的资源管理器,显示图标的时候,就是按照这个规则,注意,windows的每个图标,都有足够的高度和宽度)
  2. li高度不会自适应,可以搞定,给每行li设置overflow:auto(注意,尽管默认就是auto,但是否显式指定,显最终的效果是不一样的),同时设置li的宽度,width用px绝对值,li中的每个div,也要设置绝对的宽度,这几项都是必须的,缺少任何一项都会导致页面错乱
  3. IE6的hack,其实现代浏览器,IE7+,Firefox,Opera和Safari等都可以很好地兼容div的页面布局,只有IE6很不兼容,网上也有很多hack方法,我觉得最好用的就是一点:只有IE6支持_开头的属性名,比如对margin的理解,IE6跟其他浏览器是不一样的,但在CSS中,我们可以这样写 div.test {margin:8px; _margin:4px;} ,那么,只有IE6会认为边距是4像素,其他浏览器都会认为是8像素,刚好解决IE6的问题。
简单的说说就这些了,也是最近几天的心得,跟大家分项一下~~