打有‘Xhtml/Css’标签的日志

总结下CSS布局中浮动元素的闭合方法 (2009-2-9)

我想只要是跟DIV+CSS打交道的朋友,肯定都碰到过闭合浮动元素的问题,或者叫做清除浮动元素。因为按照CSS的规范,浮动的元素(float)会被移出文档流,当它的高度超出其父容器的高度时,父容器不会自动伸长以闭合浮动元素。这就是我们所碰到的闭合浮动元素的问题。

解决此问题的方法有很多,下面一一分析一下。

一、额外标签法。

这是最常见是一种方法,也是W3C推荐使用的一种方法。此方法的做法就是在内容的末尾加上一个空标签,常用的做法是:
.clearfloat {clear:both;}
然后在内容的末尾加上
<br class="clearfloat" />
或者
<div class="clearfloat"></div>

当然你也可以使用其它的块级元素,但是用<br>的话,在IE中能清除浮动但不能闭合元素。额外标签法的标准写法应该是这样的:
.clearfloat {
clear:both;
height:0;
font-size: 1px;
line-height: 0px;
}

这样基本上就能适应所有的状况了。

此方法最为通用,但是由于增加了一个空标签,某些有“洁僻”的朋友会觉得HTML代码显得不够简洁。

二、使用after伪类

使用after伪类的做法就是在指定的现在内容末尾添加新的内容,通常是加一个小“.”,并把它隐藏,可以通过它来闭合浮动元素。但是,Win/IE6并不支持after伪类,所以还不得不单独针对Win/IE6进行hack处理。
.clearfloat {
display:inline-block;
}
/* Hack Begine \*/ 这里出现的反斜杠(\)是为了区分Win/IE跟Mac/IE,只针对Win/IE进行hack
* html .clearfloat {
height:1%;
}
.clearfloat {
display:block;
}
/* End Hack */

把此类加在浮动元素的父容器上就可以清除浮动。但本民工不喜欢用这种方法,因为我觉得用hack方法太烦琐不好掌握,而且又远离标准。

三、设置父容器的overflow

把父容器的overflow属性设为hidden或auto同样也能清除浮动,但是单单设置overflow属性在IE6中会不起作用,需要触发一下layout,一般可以指定一个维度,或者是用zoom:1;。
#clearfloat {
overflow:auto;
height:1%;
}

此方法用起来也很方便的,但是overflow有可能会影响到浏览器的表现,所以用此方法时多调试一下。另外,此方法能在浏览器表现正常,但是在Dreamweaver中浮动元素还是会乱。

四、浮动外部元素,float-in-float

给浮动元素的父容器也加上浮动属性,浮动元素能闭合浮动元素。此方法很方便,效果也好,但缺点也很明显,父容器并不是想浮动就浮动,相邻元素有可能会发生变化,再嵌套一层DIV的话又会觉得有些烦琐,所以此方法有可能会给布局增加难度。

总结

想要兼容浏览器闭合浮动元素的方法还是很多的,具体情况具体分析,在这里说的也未必详尽,如果哪位朋友有更好的方法或不同的意见,欢迎讨论与分享!

DIV+CSS布局中常用的列表元素(ul ol li dl dt dd)详解 (2009-2-8)

虽然DIV不像TABLE那要需要把容器内的内容都加载了才能显示,但是为了标准化,当然还是越少嵌套越好。

常用的列表元素有ul ol li dl dt dd,其中ul li用得比较多。先说说ol与ul,其实两者是一样的。

<ol>是有序列表

1
2
3
4
5
6
7
8
9
<ol>
<li>……</li>
<li>……</li>
<li>……</li>
</ol>
页面显示为:
1……
2……
3……

<ul>是无序列表
页面显示为li前是大圆点而不是123……

dl dt dd的用法

1
2
3
4
5
<dl>//dl为内容块
<dt>内容标题</dt>//dt为内容块的标题
<dd>内容1</dd>//dd为内容
<dd>内容2</dd>
</dl>

dt 和dd中可以再加入 ol ul li p等标签。熟练运用这些列表元素,可以在布局时减少DIV的嵌套。

CSS实现兼容浏览器的文字阴影效果 (2009-1-13)

也不记得是哪天了,美工丢来一个页面要做。哇塞!上面居上有文字阴影的效果,一般这种情况下,要么就用图片,要么就是沟通一下把这个不2.0的效果给喀嚓掉就得了。如果只考虑IE的话那当然就一个滤镜就搞定,不过我们得向标准看齐嘛。当时脑瓜子转了转,还真让我给想出办法来了。就是下面这种效果咯。

兼容浏览器的文字阴影效果
兼容浏览器的文字阴影效果

其实这只算是一种取巧的手法了,原理很简单,其实是输入了两次文本,通过定位使其中一个在上方另一个在下方,并加上少许的偏移使之产生阴影的效果。当然,此方法是能通过W3C验证了,但本民工并不觉得这是一种“标准”的做法,还是只在少数需要增强设计的场合使用罢了。

下面是代码:

1
2
3
4
5
6
7
8
9
10
<style type="text/css">
.title_div {height:30px; background:#6c7d8d; overflow:hidden; line-height:30px; padding-left:35px;}
.title_text { color:#FFF; margin:1px 0 0 0px; position:absolute; z-index:20; float:left;}
.title_shadow { color:#000; margin:2px 0 0 2px; position:absolute; z-index:10; float:left;}
</style>
/*包含文字的不一定是要DIV,用SPAN也行,只不过要加上display:block;*/
<div class="title_div">
<div class="title_text">兼容浏览器的文字阴影效果</div>
<div class="title_shadow">兼容浏览器的文字阴影效果</div>
</div>

提示:你可以先修改部分代码再运行。

CSS兼容浏览器的一些常用hack (2009-1-10)

首先,本民工要声明的是,本人并不喜欢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书写习惯问题杂谈 (2009-1-9)

记得在程序员之间有这么一句话:让我做什么都行,就是别让我去看别人的程序。其实在写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

DIV中图片垂直居中以及等比缩放 (2009-1-3)

我想应该有很多朋友都会碰到DIV中图片垂直居中的问题,DIV不像TABLE,直接一个valign就搞定,特别是当图片的大小不确定的时候,无法通过事先定位来解决。而等比缩放的话,IE6中不认 max-height跟max-width。本民工几经摸索加实践,终于找到一种比较简单干净的方法,是从淘宝网上学来的,呵呵。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.box {
/*非IE的主流浏览器识别的垂直居中的方法*/
display: table-cell;
vertical-align:middle;
/*设置水平居中*/
text-align:center;
/* 针对IE的Hack */
*display: block;
*font-size: 175px;/*这个值大概为最大高度的0.875*/
*font-family:Arial;/*防止非utf-8引起的hack失效问题,如gbk编码*/
width:200px;
height:200px;
border: 1px solid #eee;
}
.box img {
/*设置图片垂直居中*/
vertical-align:middle;
/*非IE6下的等比缩放*/
max-height:150px;
max-width:150px;
/*IE6下的等比缩放,注意expression其实是运行了一个JS程序,所以如果图片很多的话会引起CPU占用率高*/
width:expression(this.width >150 && this.height <= this.width ? 150: true);
height:expression(this.height > 150 && this.width <= this.height ? 150 : true);
}
<div class=”box”>
<img src=”02.jpg” />
</div>

Download:mywork.rar